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 = 648 FormatStyle::BWACS_Always; 649 650 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 651 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 652 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 653 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 654 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 655 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 656 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 657 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 658 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 659 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 660 verifyFormat("if (true)\n" 661 "{\n" 662 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 663 "}", 664 AllowSimpleBracedStatements); 665 verifyFormat("if (true)\n" 666 "{ //\n" 667 " f();\n" 668 "}", 669 AllowSimpleBracedStatements); 670 verifyFormat("if (true)\n" 671 "{\n" 672 " f();\n" 673 " f();\n" 674 "}", 675 AllowSimpleBracedStatements); 676 verifyFormat("if (true)\n" 677 "{\n" 678 " f();\n" 679 "} else\n" 680 "{\n" 681 " f();\n" 682 "}", 683 AllowSimpleBracedStatements); 684 685 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 686 FormatStyle::SIS_Never; 687 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 688 verifyFormat("if (true)\n" 689 "{\n" 690 " f();\n" 691 "}", 692 AllowSimpleBracedStatements); 693 verifyFormat("if (true)\n" 694 "{\n" 695 " f();\n" 696 "} else\n" 697 "{\n" 698 " f();\n" 699 "}", 700 AllowSimpleBracedStatements); 701 702 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 703 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 704 verifyFormat("while (true)\n" 705 "{\n" 706 " f();\n" 707 "}", 708 AllowSimpleBracedStatements); 709 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 710 verifyFormat("for (;;)\n" 711 "{\n" 712 " f();\n" 713 "}", 714 AllowSimpleBracedStatements); 715 } 716 717 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 718 FormatStyle Style = getLLVMStyleWithColumns(60); 719 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 720 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 721 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 722 EXPECT_EQ("#define A \\\n" 723 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 724 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 725 "X;", 726 format("#define A \\\n" 727 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 728 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 729 " }\n" 730 "X;", 731 Style)); 732 } 733 734 TEST_F(FormatTest, ParseIfElse) { 735 verifyFormat("if (true)\n" 736 " if (true)\n" 737 " if (true)\n" 738 " f();\n" 739 " else\n" 740 " g();\n" 741 " else\n" 742 " h();\n" 743 "else\n" 744 " i();"); 745 verifyFormat("if (true)\n" 746 " if (true)\n" 747 " if (true) {\n" 748 " if (true)\n" 749 " f();\n" 750 " } else {\n" 751 " g();\n" 752 " }\n" 753 " else\n" 754 " h();\n" 755 "else {\n" 756 " i();\n" 757 "}"); 758 verifyFormat("if (true)\n" 759 " if constexpr (true)\n" 760 " if (true) {\n" 761 " if constexpr (true)\n" 762 " f();\n" 763 " } else {\n" 764 " g();\n" 765 " }\n" 766 " else\n" 767 " h();\n" 768 "else {\n" 769 " i();\n" 770 "}"); 771 verifyFormat("if (true)\n" 772 " if CONSTEXPR (true)\n" 773 " if (true) {\n" 774 " if CONSTEXPR (true)\n" 775 " f();\n" 776 " } else {\n" 777 " g();\n" 778 " }\n" 779 " else\n" 780 " h();\n" 781 "else {\n" 782 " i();\n" 783 "}"); 784 verifyFormat("void f() {\n" 785 " if (a) {\n" 786 " } else {\n" 787 " }\n" 788 "}"); 789 } 790 791 TEST_F(FormatTest, ElseIf) { 792 verifyFormat("if (a) {\n} else if (b) {\n}"); 793 verifyFormat("if (a)\n" 794 " f();\n" 795 "else if (b)\n" 796 " g();\n" 797 "else\n" 798 " h();"); 799 verifyFormat("if constexpr (a)\n" 800 " f();\n" 801 "else if constexpr (b)\n" 802 " g();\n" 803 "else\n" 804 " h();"); 805 verifyFormat("if CONSTEXPR (a)\n" 806 " f();\n" 807 "else if CONSTEXPR (b)\n" 808 " g();\n" 809 "else\n" 810 " h();"); 811 verifyFormat("if (a) {\n" 812 " f();\n" 813 "}\n" 814 "// or else ..\n" 815 "else {\n" 816 " g()\n" 817 "}"); 818 819 verifyFormat("if (a) {\n" 820 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 821 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 822 "}"); 823 verifyFormat("if (a) {\n" 824 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 826 "}"); 827 verifyFormat("if (a) {\n" 828 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 830 "}"); 831 verifyFormat("if (a) {\n" 832 "} else if (\n" 833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 834 "}", 835 getLLVMStyleWithColumns(62)); 836 verifyFormat("if (a) {\n" 837 "} else if constexpr (\n" 838 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 839 "}", 840 getLLVMStyleWithColumns(62)); 841 verifyFormat("if (a) {\n" 842 "} else if CONSTEXPR (\n" 843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 844 "}", 845 getLLVMStyleWithColumns(62)); 846 } 847 848 TEST_F(FormatTest, FormatsForLoop) { 849 verifyFormat( 850 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 851 " ++VeryVeryLongLoopVariable)\n" 852 " ;"); 853 verifyFormat("for (;;)\n" 854 " f();"); 855 verifyFormat("for (;;) {\n}"); 856 verifyFormat("for (;;) {\n" 857 " f();\n" 858 "}"); 859 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 860 861 verifyFormat( 862 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 863 " E = UnwrappedLines.end();\n" 864 " I != E; ++I) {\n}"); 865 866 verifyFormat( 867 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 868 " ++IIIII) {\n}"); 869 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 870 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 871 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 872 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 873 " I = FD->getDeclsInPrototypeScope().begin(),\n" 874 " E = FD->getDeclsInPrototypeScope().end();\n" 875 " I != E; ++I) {\n}"); 876 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 877 " I = Container.begin(),\n" 878 " E = Container.end();\n" 879 " I != E; ++I) {\n}", 880 getLLVMStyleWithColumns(76)); 881 882 verifyFormat( 883 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 886 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 887 " ++aaaaaaaaaaa) {\n}"); 888 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 889 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 890 " ++i) {\n}"); 891 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 892 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 893 "}"); 894 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 895 " aaaaaaaaaa);\n" 896 " iter; ++iter) {\n" 897 "}"); 898 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 899 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 900 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 901 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 902 903 // These should not be formatted as Objective-C for-in loops. 904 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 905 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 906 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 907 verifyFormat( 908 "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 909 910 FormatStyle NoBinPacking = getLLVMStyle(); 911 NoBinPacking.BinPackParameters = false; 912 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 913 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 914 " aaaaaaaaaaaaaaaa,\n" 915 " aaaaaaaaaaaaaaaa,\n" 916 " aaaaaaaaaaaaaaaa);\n" 917 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 918 "}", 919 NoBinPacking); 920 verifyFormat( 921 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 922 " E = UnwrappedLines.end();\n" 923 " I != E;\n" 924 " ++I) {\n}", 925 NoBinPacking); 926 927 FormatStyle AlignLeft = getLLVMStyle(); 928 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 929 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 930 } 931 932 TEST_F(FormatTest, RangeBasedForLoops) { 933 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 935 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 936 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 937 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 938 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 939 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 940 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 941 } 942 943 TEST_F(FormatTest, ForEachLoops) { 944 verifyFormat("void f() {\n" 945 " foreach (Item *item, itemlist) {}\n" 946 " Q_FOREACH (Item *item, itemlist) {}\n" 947 " BOOST_FOREACH (Item *item, itemlist) {}\n" 948 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 949 "}"); 950 951 // As function-like macros. 952 verifyFormat("#define foreach(x, y)\n" 953 "#define Q_FOREACH(x, y)\n" 954 "#define BOOST_FOREACH(x, y)\n" 955 "#define UNKNOWN_FOREACH(x, y)\n"); 956 957 // Not as function-like macros. 958 verifyFormat("#define foreach (x, y)\n" 959 "#define Q_FOREACH (x, y)\n" 960 "#define BOOST_FOREACH (x, y)\n" 961 "#define UNKNOWN_FOREACH (x, y)\n"); 962 } 963 964 TEST_F(FormatTest, FormatsWhileLoop) { 965 verifyFormat("while (true) {\n}"); 966 verifyFormat("while (true)\n" 967 " f();"); 968 verifyFormat("while () {\n}"); 969 verifyFormat("while () {\n" 970 " f();\n" 971 "}"); 972 } 973 974 TEST_F(FormatTest, FormatsDoWhile) { 975 verifyFormat("do {\n" 976 " do_something();\n" 977 "} while (something());"); 978 verifyFormat("do\n" 979 " do_something();\n" 980 "while (something());"); 981 } 982 983 TEST_F(FormatTest, FormatsSwitchStatement) { 984 verifyFormat("switch (x) {\n" 985 "case 1:\n" 986 " f();\n" 987 " break;\n" 988 "case kFoo:\n" 989 "case ns::kBar:\n" 990 "case kBaz:\n" 991 " break;\n" 992 "default:\n" 993 " g();\n" 994 " break;\n" 995 "}"); 996 verifyFormat("switch (x) {\n" 997 "case 1: {\n" 998 " f();\n" 999 " break;\n" 1000 "}\n" 1001 "case 2: {\n" 1002 " break;\n" 1003 "}\n" 1004 "}"); 1005 verifyFormat("switch (x) {\n" 1006 "case 1: {\n" 1007 " f();\n" 1008 " {\n" 1009 " g();\n" 1010 " h();\n" 1011 " }\n" 1012 " break;\n" 1013 "}\n" 1014 "}"); 1015 verifyFormat("switch (x) {\n" 1016 "case 1: {\n" 1017 " f();\n" 1018 " if (foo) {\n" 1019 " g();\n" 1020 " h();\n" 1021 " }\n" 1022 " break;\n" 1023 "}\n" 1024 "}"); 1025 verifyFormat("switch (x) {\n" 1026 "case 1: {\n" 1027 " f();\n" 1028 " g();\n" 1029 "} break;\n" 1030 "}"); 1031 verifyFormat("switch (test)\n" 1032 " ;"); 1033 verifyFormat("switch (x) {\n" 1034 "default: {\n" 1035 " // Do nothing.\n" 1036 "}\n" 1037 "}"); 1038 verifyFormat("switch (x) {\n" 1039 "// comment\n" 1040 "// if 1, do f()\n" 1041 "case 1:\n" 1042 " f();\n" 1043 "}"); 1044 verifyFormat("switch (x) {\n" 1045 "case 1:\n" 1046 " // Do amazing stuff\n" 1047 " {\n" 1048 " f();\n" 1049 " g();\n" 1050 " }\n" 1051 " break;\n" 1052 "}"); 1053 verifyFormat("#define A \\\n" 1054 " switch (x) { \\\n" 1055 " case a: \\\n" 1056 " foo = b; \\\n" 1057 " }", 1058 getLLVMStyleWithColumns(20)); 1059 verifyFormat("#define OPERATION_CASE(name) \\\n" 1060 " case OP_name: \\\n" 1061 " return operations::Operation##name\n", 1062 getLLVMStyleWithColumns(40)); 1063 verifyFormat("switch (x) {\n" 1064 "case 1:;\n" 1065 "default:;\n" 1066 " int i;\n" 1067 "}"); 1068 1069 verifyGoogleFormat("switch (x) {\n" 1070 " case 1:\n" 1071 " f();\n" 1072 " break;\n" 1073 " case kFoo:\n" 1074 " case ns::kBar:\n" 1075 " case kBaz:\n" 1076 " break;\n" 1077 " default:\n" 1078 " g();\n" 1079 " break;\n" 1080 "}"); 1081 verifyGoogleFormat("switch (x) {\n" 1082 " case 1: {\n" 1083 " f();\n" 1084 " break;\n" 1085 " }\n" 1086 "}"); 1087 verifyGoogleFormat("switch (test)\n" 1088 " ;"); 1089 1090 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1091 " case OP_name: \\\n" 1092 " return operations::Operation##name\n"); 1093 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1094 " // Get the correction operation class.\n" 1095 " switch (OpCode) {\n" 1096 " CASE(Add);\n" 1097 " CASE(Subtract);\n" 1098 " default:\n" 1099 " return operations::Unknown;\n" 1100 " }\n" 1101 "#undef OPERATION_CASE\n" 1102 "}"); 1103 verifyFormat("DEBUG({\n" 1104 " switch (x) {\n" 1105 " case A:\n" 1106 " f();\n" 1107 " break;\n" 1108 " // fallthrough\n" 1109 " case B:\n" 1110 " g();\n" 1111 " break;\n" 1112 " }\n" 1113 "});"); 1114 EXPECT_EQ("DEBUG({\n" 1115 " switch (x) {\n" 1116 " case A:\n" 1117 " f();\n" 1118 " break;\n" 1119 " // On B:\n" 1120 " case B:\n" 1121 " g();\n" 1122 " break;\n" 1123 " }\n" 1124 "});", 1125 format("DEBUG({\n" 1126 " switch (x) {\n" 1127 " case A:\n" 1128 " f();\n" 1129 " break;\n" 1130 " // On B:\n" 1131 " case B:\n" 1132 " g();\n" 1133 " break;\n" 1134 " }\n" 1135 "});", 1136 getLLVMStyle())); 1137 EXPECT_EQ("switch (n) {\n" 1138 "case 0: {\n" 1139 " return false;\n" 1140 "}\n" 1141 "default: {\n" 1142 " return true;\n" 1143 "}\n" 1144 "}", 1145 format("switch (n)\n" 1146 "{\n" 1147 "case 0: {\n" 1148 " return false;\n" 1149 "}\n" 1150 "default: {\n" 1151 " return true;\n" 1152 "}\n" 1153 "}", 1154 getLLVMStyle())); 1155 verifyFormat("switch (a) {\n" 1156 "case (b):\n" 1157 " return;\n" 1158 "}"); 1159 1160 verifyFormat("switch (a) {\n" 1161 "case some_namespace::\n" 1162 " some_constant:\n" 1163 " return;\n" 1164 "}", 1165 getLLVMStyleWithColumns(34)); 1166 1167 FormatStyle Style = getLLVMStyle(); 1168 Style.IndentCaseLabels = true; 1169 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1170 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1171 Style.BraceWrapping.AfterCaseLabel = true; 1172 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1173 EXPECT_EQ("switch (n)\n" 1174 "{\n" 1175 " case 0:\n" 1176 " {\n" 1177 " return false;\n" 1178 " }\n" 1179 " default:\n" 1180 " {\n" 1181 " return true;\n" 1182 " }\n" 1183 "}", 1184 format("switch (n) {\n" 1185 " case 0: {\n" 1186 " return false;\n" 1187 " }\n" 1188 " default: {\n" 1189 " return true;\n" 1190 " }\n" 1191 "}", 1192 Style)); 1193 Style.BraceWrapping.AfterCaseLabel = false; 1194 EXPECT_EQ("switch (n)\n" 1195 "{\n" 1196 " case 0: {\n" 1197 " return false;\n" 1198 " }\n" 1199 " default: {\n" 1200 " return true;\n" 1201 " }\n" 1202 "}", 1203 format("switch (n) {\n" 1204 " case 0:\n" 1205 " {\n" 1206 " return false;\n" 1207 " }\n" 1208 " default:\n" 1209 " {\n" 1210 " return true;\n" 1211 " }\n" 1212 "}", 1213 Style)); 1214 } 1215 1216 TEST_F(FormatTest, CaseRanges) { 1217 verifyFormat("switch (x) {\n" 1218 "case 'A' ... 'Z':\n" 1219 "case 1 ... 5:\n" 1220 "case a ... b:\n" 1221 " break;\n" 1222 "}"); 1223 } 1224 1225 TEST_F(FormatTest, ShortCaseLabels) { 1226 FormatStyle Style = getLLVMStyle(); 1227 Style.AllowShortCaseLabelsOnASingleLine = true; 1228 verifyFormat("switch (a) {\n" 1229 "case 1: x = 1; break;\n" 1230 "case 2: return;\n" 1231 "case 3:\n" 1232 "case 4:\n" 1233 "case 5: return;\n" 1234 "case 6: // comment\n" 1235 " return;\n" 1236 "case 7:\n" 1237 " // comment\n" 1238 " return;\n" 1239 "case 8:\n" 1240 " x = 8; // comment\n" 1241 " break;\n" 1242 "default: y = 1; break;\n" 1243 "}", 1244 Style); 1245 verifyFormat("switch (a) {\n" 1246 "case 0: return; // comment\n" 1247 "case 1: break; // comment\n" 1248 "case 2: return;\n" 1249 "// comment\n" 1250 "case 3: return;\n" 1251 "// comment 1\n" 1252 "// comment 2\n" 1253 "// comment 3\n" 1254 "case 4: break; /* comment */\n" 1255 "case 5:\n" 1256 " // comment\n" 1257 " break;\n" 1258 "case 6: /* comment */ x = 1; break;\n" 1259 "case 7: x = /* comment */ 1; break;\n" 1260 "case 8:\n" 1261 " x = 1; /* comment */\n" 1262 " break;\n" 1263 "case 9:\n" 1264 " break; // comment line 1\n" 1265 " // comment line 2\n" 1266 "}", 1267 Style); 1268 EXPECT_EQ("switch (a) {\n" 1269 "case 1:\n" 1270 " x = 8;\n" 1271 " // fall through\n" 1272 "case 2: x = 8;\n" 1273 "// comment\n" 1274 "case 3:\n" 1275 " return; /* comment line 1\n" 1276 " * comment line 2 */\n" 1277 "case 4: i = 8;\n" 1278 "// something else\n" 1279 "#if FOO\n" 1280 "case 5: break;\n" 1281 "#endif\n" 1282 "}", 1283 format("switch (a) {\n" 1284 "case 1: x = 8;\n" 1285 " // fall through\n" 1286 "case 2:\n" 1287 " x = 8;\n" 1288 "// comment\n" 1289 "case 3:\n" 1290 " return; /* comment line 1\n" 1291 " * comment line 2 */\n" 1292 "case 4:\n" 1293 " i = 8;\n" 1294 "// something else\n" 1295 "#if FOO\n" 1296 "case 5: break;\n" 1297 "#endif\n" 1298 "}", 1299 Style)); 1300 EXPECT_EQ("switch (a) {\n" 1301 "case 0:\n" 1302 " return; // long long long long long long long long long long " 1303 "long long comment\n" 1304 " // line\n" 1305 "}", 1306 format("switch (a) {\n" 1307 "case 0: return; // long long long long long long long long " 1308 "long long long long comment line\n" 1309 "}", 1310 Style)); 1311 EXPECT_EQ("switch (a) {\n" 1312 "case 0:\n" 1313 " return; /* long long long long long long long long long long " 1314 "long long comment\n" 1315 " line */\n" 1316 "}", 1317 format("switch (a) {\n" 1318 "case 0: return; /* long long long long long long long long " 1319 "long long long long comment line */\n" 1320 "}", 1321 Style)); 1322 verifyFormat("switch (a) {\n" 1323 "#if FOO\n" 1324 "case 0: return 0;\n" 1325 "#endif\n" 1326 "}", 1327 Style); 1328 verifyFormat("switch (a) {\n" 1329 "case 1: {\n" 1330 "}\n" 1331 "case 2: {\n" 1332 " return;\n" 1333 "}\n" 1334 "case 3: {\n" 1335 " x = 1;\n" 1336 " return;\n" 1337 "}\n" 1338 "case 4:\n" 1339 " if (x)\n" 1340 " return;\n" 1341 "}", 1342 Style); 1343 Style.ColumnLimit = 21; 1344 verifyFormat("switch (a) {\n" 1345 "case 1: x = 1; break;\n" 1346 "case 2: return;\n" 1347 "case 3:\n" 1348 "case 4:\n" 1349 "case 5: return;\n" 1350 "default:\n" 1351 " y = 1;\n" 1352 " break;\n" 1353 "}", 1354 Style); 1355 Style.ColumnLimit = 80; 1356 Style.AllowShortCaseLabelsOnASingleLine = false; 1357 Style.IndentCaseLabels = true; 1358 EXPECT_EQ("switch (n) {\n" 1359 " default /*comments*/:\n" 1360 " return true;\n" 1361 " case 0:\n" 1362 " return false;\n" 1363 "}", 1364 format("switch (n) {\n" 1365 "default/*comments*/:\n" 1366 " return true;\n" 1367 "case 0:\n" 1368 " return false;\n" 1369 "}", 1370 Style)); 1371 Style.AllowShortCaseLabelsOnASingleLine = true; 1372 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1373 Style.BraceWrapping.AfterCaseLabel = true; 1374 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1375 EXPECT_EQ("switch (n)\n" 1376 "{\n" 1377 " case 0:\n" 1378 " {\n" 1379 " return false;\n" 1380 " }\n" 1381 " default:\n" 1382 " {\n" 1383 " return true;\n" 1384 " }\n" 1385 "}", 1386 format("switch (n) {\n" 1387 " case 0: {\n" 1388 " return false;\n" 1389 " }\n" 1390 " default:\n" 1391 " {\n" 1392 " return true;\n" 1393 " }\n" 1394 "}", 1395 Style)); 1396 } 1397 1398 TEST_F(FormatTest, FormatsLabels) { 1399 verifyFormat("void f() {\n" 1400 " some_code();\n" 1401 "test_label:\n" 1402 " some_other_code();\n" 1403 " {\n" 1404 " some_more_code();\n" 1405 " another_label:\n" 1406 " some_more_code();\n" 1407 " }\n" 1408 "}"); 1409 verifyFormat("{\n" 1410 " some_code();\n" 1411 "test_label:\n" 1412 " some_other_code();\n" 1413 "}"); 1414 verifyFormat("{\n" 1415 " some_code();\n" 1416 "test_label:;\n" 1417 " int i = 0;\n" 1418 "}"); 1419 FormatStyle Style = getLLVMStyle(); 1420 Style.IndentGotoLabels = false; 1421 verifyFormat("void f() {\n" 1422 " some_code();\n" 1423 "test_label:\n" 1424 " some_other_code();\n" 1425 " {\n" 1426 " some_more_code();\n" 1427 "another_label:\n" 1428 " some_more_code();\n" 1429 " }\n" 1430 "}", 1431 Style); 1432 verifyFormat("{\n" 1433 " some_code();\n" 1434 "test_label:\n" 1435 " some_other_code();\n" 1436 "}", 1437 Style); 1438 verifyFormat("{\n" 1439 " some_code();\n" 1440 "test_label:;\n" 1441 " int i = 0;\n" 1442 "}"); 1443 } 1444 1445 TEST_F(FormatTest, MultiLineControlStatements) { 1446 FormatStyle Style = getLLVMStyle(); 1447 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1448 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; 1449 Style.ColumnLimit = 20; 1450 // Short lines should keep opening brace on same line. 1451 EXPECT_EQ("if (foo) {\n" 1452 " bar();\n" 1453 "}", 1454 format("if(foo){bar();}", Style)); 1455 EXPECT_EQ("if (foo) {\n" 1456 " bar();\n" 1457 "} else {\n" 1458 " baz();\n" 1459 "}", 1460 format("if(foo){bar();}else{baz();}", Style)); 1461 EXPECT_EQ("if (foo && bar) {\n" 1462 " baz();\n" 1463 "}", 1464 format("if(foo&&bar){baz();}", Style)); 1465 EXPECT_EQ("if (foo) {\n" 1466 " bar();\n" 1467 "} else if (baz) {\n" 1468 " quux();\n" 1469 "}", 1470 format("if(foo){bar();}else if(baz){quux();}", Style)); 1471 EXPECT_EQ( 1472 "if (foo) {\n" 1473 " bar();\n" 1474 "} else if (baz) {\n" 1475 " quux();\n" 1476 "} else {\n" 1477 " foobar();\n" 1478 "}", 1479 format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); 1480 EXPECT_EQ("for (;;) {\n" 1481 " foo();\n" 1482 "}", 1483 format("for(;;){foo();}")); 1484 EXPECT_EQ("while (1) {\n" 1485 " foo();\n" 1486 "}", 1487 format("while(1){foo();}", Style)); 1488 EXPECT_EQ("switch (foo) {\n" 1489 "case bar:\n" 1490 " return;\n" 1491 "}", 1492 format("switch(foo){case bar:return;}", Style)); 1493 EXPECT_EQ("try {\n" 1494 " foo();\n" 1495 "} catch (...) {\n" 1496 " bar();\n" 1497 "}", 1498 format("try{foo();}catch(...){bar();}", Style)); 1499 EXPECT_EQ("do {\n" 1500 " foo();\n" 1501 "} while (bar &&\n" 1502 " baz);", 1503 format("do{foo();}while(bar&&baz);", Style)); 1504 // Long lines should put opening brace on new line. 1505 EXPECT_EQ("if (foo && bar &&\n" 1506 " baz)\n" 1507 "{\n" 1508 " quux();\n" 1509 "}", 1510 format("if(foo&&bar&&baz){quux();}", Style)); 1511 EXPECT_EQ("if (foo && bar &&\n" 1512 " baz)\n" 1513 "{\n" 1514 " quux();\n" 1515 "}", 1516 format("if (foo && bar &&\n" 1517 " baz) {\n" 1518 " quux();\n" 1519 "}", 1520 Style)); 1521 EXPECT_EQ("if (foo) {\n" 1522 " bar();\n" 1523 "} else if (baz ||\n" 1524 " quux)\n" 1525 "{\n" 1526 " foobar();\n" 1527 "}", 1528 format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); 1529 EXPECT_EQ( 1530 "if (foo) {\n" 1531 " bar();\n" 1532 "} else if (baz ||\n" 1533 " quux)\n" 1534 "{\n" 1535 " foobar();\n" 1536 "} else {\n" 1537 " barbaz();\n" 1538 "}", 1539 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1540 Style)); 1541 EXPECT_EQ("for (int i = 0;\n" 1542 " i < 10; ++i)\n" 1543 "{\n" 1544 " foo();\n" 1545 "}", 1546 format("for(int i=0;i<10;++i){foo();}", Style)); 1547 EXPECT_EQ("while (foo || bar ||\n" 1548 " baz)\n" 1549 "{\n" 1550 " quux();\n" 1551 "}", 1552 format("while(foo||bar||baz){quux();}", Style)); 1553 EXPECT_EQ("switch (\n" 1554 " foo = barbaz)\n" 1555 "{\n" 1556 "case quux:\n" 1557 " return;\n" 1558 "}", 1559 format("switch(foo=barbaz){case quux:return;}", Style)); 1560 EXPECT_EQ("try {\n" 1561 " foo();\n" 1562 "} catch (\n" 1563 " Exception &bar)\n" 1564 "{\n" 1565 " baz();\n" 1566 "}", 1567 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1568 Style.ColumnLimit = 1569 40; // to concentrate at brace wrapping, not line wrap due to column limit 1570 EXPECT_EQ("try {\n" 1571 " foo();\n" 1572 "} catch (Exception &bar) {\n" 1573 " baz();\n" 1574 "}", 1575 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1576 Style.ColumnLimit = 1577 20; // to concentrate at brace wrapping, not line wrap due to column limit 1578 1579 Style.BraceWrapping.BeforeElse = true; 1580 EXPECT_EQ( 1581 "if (foo) {\n" 1582 " bar();\n" 1583 "}\n" 1584 "else if (baz ||\n" 1585 " quux)\n" 1586 "{\n" 1587 " foobar();\n" 1588 "}\n" 1589 "else {\n" 1590 " barbaz();\n" 1591 "}", 1592 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1593 Style)); 1594 1595 Style.BraceWrapping.BeforeCatch = true; 1596 EXPECT_EQ("try {\n" 1597 " foo();\n" 1598 "}\n" 1599 "catch (...) {\n" 1600 " baz();\n" 1601 "}", 1602 format("try{foo();}catch(...){baz();}", Style)); 1603 } 1604 1605 //===----------------------------------------------------------------------===// 1606 // Tests for classes, namespaces, etc. 1607 //===----------------------------------------------------------------------===// 1608 1609 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1610 verifyFormat("class A {};"); 1611 } 1612 1613 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1614 verifyFormat("class A {\n" 1615 "public:\n" 1616 "public: // comment\n" 1617 "protected:\n" 1618 "private:\n" 1619 " void f() {}\n" 1620 "};"); 1621 verifyFormat("export class A {\n" 1622 "public:\n" 1623 "public: // comment\n" 1624 "protected:\n" 1625 "private:\n" 1626 " void f() {}\n" 1627 "};"); 1628 verifyGoogleFormat("class A {\n" 1629 " public:\n" 1630 " protected:\n" 1631 " private:\n" 1632 " void f() {}\n" 1633 "};"); 1634 verifyGoogleFormat("export class A {\n" 1635 " public:\n" 1636 " protected:\n" 1637 " private:\n" 1638 " void f() {}\n" 1639 "};"); 1640 verifyFormat("class A {\n" 1641 "public slots:\n" 1642 " void f1() {}\n" 1643 "public Q_SLOTS:\n" 1644 " void f2() {}\n" 1645 "protected slots:\n" 1646 " void f3() {}\n" 1647 "protected Q_SLOTS:\n" 1648 " void f4() {}\n" 1649 "private slots:\n" 1650 " void f5() {}\n" 1651 "private Q_SLOTS:\n" 1652 " void f6() {}\n" 1653 "signals:\n" 1654 " void g1();\n" 1655 "Q_SIGNALS:\n" 1656 " void g2();\n" 1657 "};"); 1658 1659 // Don't interpret 'signals' the wrong way. 1660 verifyFormat("signals.set();"); 1661 verifyFormat("for (Signals signals : f()) {\n}"); 1662 verifyFormat("{\n" 1663 " signals.set(); // This needs indentation.\n" 1664 "}"); 1665 verifyFormat("void f() {\n" 1666 "label:\n" 1667 " signals.baz();\n" 1668 "}"); 1669 } 1670 1671 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1672 EXPECT_EQ("class A {\n" 1673 "public:\n" 1674 " void f();\n" 1675 "\n" 1676 "private:\n" 1677 " void g() {}\n" 1678 " // test\n" 1679 "protected:\n" 1680 " int h;\n" 1681 "};", 1682 format("class A {\n" 1683 "public:\n" 1684 "void f();\n" 1685 "private:\n" 1686 "void g() {}\n" 1687 "// test\n" 1688 "protected:\n" 1689 "int h;\n" 1690 "};")); 1691 EXPECT_EQ("class A {\n" 1692 "protected:\n" 1693 "public:\n" 1694 " void f();\n" 1695 "};", 1696 format("class A {\n" 1697 "protected:\n" 1698 "\n" 1699 "public:\n" 1700 "\n" 1701 " void f();\n" 1702 "};")); 1703 1704 // Even ensure proper spacing inside macros. 1705 EXPECT_EQ("#define B \\\n" 1706 " class A { \\\n" 1707 " protected: \\\n" 1708 " public: \\\n" 1709 " void f(); \\\n" 1710 " };", 1711 format("#define B \\\n" 1712 " class A { \\\n" 1713 " protected: \\\n" 1714 " \\\n" 1715 " public: \\\n" 1716 " \\\n" 1717 " void f(); \\\n" 1718 " };", 1719 getGoogleStyle())); 1720 // But don't remove empty lines after macros ending in access specifiers. 1721 EXPECT_EQ("#define A private:\n" 1722 "\n" 1723 "int i;", 1724 format("#define A private:\n" 1725 "\n" 1726 "int i;")); 1727 } 1728 1729 TEST_F(FormatTest, FormatsClasses) { 1730 verifyFormat("class A : public B {};"); 1731 verifyFormat("class A : public ::B {};"); 1732 1733 verifyFormat( 1734 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1735 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1736 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1737 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1738 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1739 verifyFormat( 1740 "class A : public B, public C, public D, public E, public F {};"); 1741 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1742 " public C,\n" 1743 " public D,\n" 1744 " public E,\n" 1745 " public F,\n" 1746 " public G {};"); 1747 1748 verifyFormat("class\n" 1749 " ReallyReallyLongClassName {\n" 1750 " int i;\n" 1751 "};", 1752 getLLVMStyleWithColumns(32)); 1753 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1754 " aaaaaaaaaaaaaaaa> {};"); 1755 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1756 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1757 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1758 verifyFormat("template <class R, class C>\n" 1759 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1760 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1761 verifyFormat("class ::A::B {};"); 1762 } 1763 1764 TEST_F(FormatTest, BreakInheritanceStyle) { 1765 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1766 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1767 FormatStyle::BILS_BeforeComma; 1768 verifyFormat("class MyClass : public X {};", 1769 StyleWithInheritanceBreakBeforeComma); 1770 verifyFormat("class MyClass\n" 1771 " : public X\n" 1772 " , public Y {};", 1773 StyleWithInheritanceBreakBeforeComma); 1774 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1775 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1776 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1777 StyleWithInheritanceBreakBeforeComma); 1778 verifyFormat("struct aaaaaaaaaaaaa\n" 1779 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1780 " aaaaaaaaaaaaaaaa> {};", 1781 StyleWithInheritanceBreakBeforeComma); 1782 1783 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1784 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1785 FormatStyle::BILS_AfterColon; 1786 verifyFormat("class MyClass : public X {};", 1787 StyleWithInheritanceBreakAfterColon); 1788 verifyFormat("class MyClass : public X, public Y {};", 1789 StyleWithInheritanceBreakAfterColon); 1790 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1791 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1792 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1793 StyleWithInheritanceBreakAfterColon); 1794 verifyFormat("struct aaaaaaaaaaaaa :\n" 1795 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1796 " aaaaaaaaaaaaaaaa> {};", 1797 StyleWithInheritanceBreakAfterColon); 1798 } 1799 1800 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1801 verifyFormat("class A {\n} a, b;"); 1802 verifyFormat("struct A {\n} a, b;"); 1803 verifyFormat("union A {\n} a;"); 1804 } 1805 1806 TEST_F(FormatTest, FormatsEnum) { 1807 verifyFormat("enum {\n" 1808 " Zero,\n" 1809 " One = 1,\n" 1810 " Two = One + 1,\n" 1811 " Three = (One + Two),\n" 1812 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1813 " Five = (One, Two, Three, Four, 5)\n" 1814 "};"); 1815 verifyGoogleFormat("enum {\n" 1816 " Zero,\n" 1817 " One = 1,\n" 1818 " Two = One + 1,\n" 1819 " Three = (One + Two),\n" 1820 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1821 " Five = (One, Two, Three, Four, 5)\n" 1822 "};"); 1823 verifyFormat("enum Enum {};"); 1824 verifyFormat("enum {};"); 1825 verifyFormat("enum X E {} d;"); 1826 verifyFormat("enum __attribute__((...)) E {} d;"); 1827 verifyFormat("enum __declspec__((...)) E {} d;"); 1828 verifyFormat("enum {\n" 1829 " Bar = Foo<int, int>::value\n" 1830 "};", 1831 getLLVMStyleWithColumns(30)); 1832 1833 verifyFormat("enum ShortEnum { A, B, C };"); 1834 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1835 1836 EXPECT_EQ("enum KeepEmptyLines {\n" 1837 " ONE,\n" 1838 "\n" 1839 " TWO,\n" 1840 "\n" 1841 " THREE\n" 1842 "}", 1843 format("enum KeepEmptyLines {\n" 1844 " ONE,\n" 1845 "\n" 1846 " TWO,\n" 1847 "\n" 1848 "\n" 1849 " THREE\n" 1850 "}")); 1851 verifyFormat("enum E { // comment\n" 1852 " ONE,\n" 1853 " TWO\n" 1854 "};\n" 1855 "int i;"); 1856 // Not enums. 1857 verifyFormat("enum X f() {\n" 1858 " a();\n" 1859 " return 42;\n" 1860 "}"); 1861 verifyFormat("enum X Type::f() {\n" 1862 " a();\n" 1863 " return 42;\n" 1864 "}"); 1865 verifyFormat("enum ::X f() {\n" 1866 " a();\n" 1867 " return 42;\n" 1868 "}"); 1869 verifyFormat("enum ns::X f() {\n" 1870 " a();\n" 1871 " return 42;\n" 1872 "}"); 1873 } 1874 1875 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1876 verifyFormat("enum Type {\n" 1877 " One = 0; // These semicolons should be commas.\n" 1878 " Two = 1;\n" 1879 "};"); 1880 verifyFormat("namespace n {\n" 1881 "enum Type {\n" 1882 " One,\n" 1883 " Two, // missing };\n" 1884 " int i;\n" 1885 "}\n" 1886 "void g() {}"); 1887 } 1888 1889 TEST_F(FormatTest, FormatsEnumStruct) { 1890 verifyFormat("enum struct {\n" 1891 " Zero,\n" 1892 " One = 1,\n" 1893 " Two = One + 1,\n" 1894 " Three = (One + Two),\n" 1895 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1896 " Five = (One, Two, Three, Four, 5)\n" 1897 "};"); 1898 verifyFormat("enum struct Enum {};"); 1899 verifyFormat("enum struct {};"); 1900 verifyFormat("enum struct X E {} d;"); 1901 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1902 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1903 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1904 } 1905 1906 TEST_F(FormatTest, FormatsEnumClass) { 1907 verifyFormat("enum class {\n" 1908 " Zero,\n" 1909 " One = 1,\n" 1910 " Two = One + 1,\n" 1911 " Three = (One + Two),\n" 1912 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1913 " Five = (One, Two, Three, Four, 5)\n" 1914 "};"); 1915 verifyFormat("enum class Enum {};"); 1916 verifyFormat("enum class {};"); 1917 verifyFormat("enum class X E {} d;"); 1918 verifyFormat("enum class __attribute__((...)) E {} d;"); 1919 verifyFormat("enum class __declspec__((...)) E {} d;"); 1920 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1921 } 1922 1923 TEST_F(FormatTest, FormatsEnumTypes) { 1924 verifyFormat("enum X : int {\n" 1925 " A, // Force multiple lines.\n" 1926 " B\n" 1927 "};"); 1928 verifyFormat("enum X : int { A, B };"); 1929 verifyFormat("enum X : std::uint32_t { A, B };"); 1930 } 1931 1932 TEST_F(FormatTest, FormatsTypedefEnum) { 1933 FormatStyle Style = getLLVMStyle(); 1934 Style.ColumnLimit = 40; 1935 verifyFormat("typedef enum {} EmptyEnum;"); 1936 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1937 verifyFormat("typedef enum {\n" 1938 " ZERO = 0,\n" 1939 " ONE = 1,\n" 1940 " TWO = 2,\n" 1941 " THREE = 3\n" 1942 "} LongEnum;", 1943 Style); 1944 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1945 Style.BraceWrapping.AfterEnum = true; 1946 verifyFormat("typedef enum {} EmptyEnum;"); 1947 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1948 verifyFormat("typedef enum\n" 1949 "{\n" 1950 " ZERO = 0,\n" 1951 " ONE = 1,\n" 1952 " TWO = 2,\n" 1953 " THREE = 3\n" 1954 "} LongEnum;", 1955 Style); 1956 } 1957 1958 TEST_F(FormatTest, FormatsNSEnums) { 1959 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1960 verifyGoogleFormat( 1961 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1962 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 1963 " // Information about someDecentlyLongValue.\n" 1964 " someDecentlyLongValue,\n" 1965 " // Information about anotherDecentlyLongValue.\n" 1966 " anotherDecentlyLongValue,\n" 1967 " // Information about aThirdDecentlyLongValue.\n" 1968 " aThirdDecentlyLongValue\n" 1969 "};"); 1970 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 1971 " // Information about someDecentlyLongValue.\n" 1972 " someDecentlyLongValue,\n" 1973 " // Information about anotherDecentlyLongValue.\n" 1974 " anotherDecentlyLongValue,\n" 1975 " // Information about aThirdDecentlyLongValue.\n" 1976 " aThirdDecentlyLongValue\n" 1977 "};"); 1978 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 1979 " a = 1,\n" 1980 " b = 2,\n" 1981 " c = 3,\n" 1982 "};"); 1983 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 1984 " a = 1,\n" 1985 " b = 2,\n" 1986 " c = 3,\n" 1987 "};"); 1988 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 1989 " a = 1,\n" 1990 " b = 2,\n" 1991 " c = 3,\n" 1992 "};"); 1993 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 1994 " a = 1,\n" 1995 " b = 2,\n" 1996 " c = 3,\n" 1997 "};"); 1998 } 1999 2000 TEST_F(FormatTest, FormatsBitfields) { 2001 verifyFormat("struct Bitfields {\n" 2002 " unsigned sClass : 8;\n" 2003 " unsigned ValueKind : 2;\n" 2004 "};"); 2005 verifyFormat("struct A {\n" 2006 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 2007 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 2008 "};"); 2009 verifyFormat("struct MyStruct {\n" 2010 " uchar data;\n" 2011 " uchar : 8;\n" 2012 " uchar : 8;\n" 2013 " uchar other;\n" 2014 "};"); 2015 } 2016 2017 TEST_F(FormatTest, FormatsNamespaces) { 2018 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 2019 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 2020 2021 verifyFormat("namespace some_namespace {\n" 2022 "class A {};\n" 2023 "void f() { f(); }\n" 2024 "}", 2025 LLVMWithNoNamespaceFix); 2026 verifyFormat("namespace N::inline D {\n" 2027 "class A {};\n" 2028 "void f() { f(); }\n" 2029 "}", 2030 LLVMWithNoNamespaceFix); 2031 verifyFormat("namespace N::inline D::E {\n" 2032 "class A {};\n" 2033 "void f() { f(); }\n" 2034 "}", 2035 LLVMWithNoNamespaceFix); 2036 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 2037 "class A {};\n" 2038 "void f() { f(); }\n" 2039 "}", 2040 LLVMWithNoNamespaceFix); 2041 verifyFormat("/* something */ namespace some_namespace {\n" 2042 "class A {};\n" 2043 "void f() { f(); }\n" 2044 "}", 2045 LLVMWithNoNamespaceFix); 2046 verifyFormat("namespace {\n" 2047 "class A {};\n" 2048 "void f() { f(); }\n" 2049 "}", 2050 LLVMWithNoNamespaceFix); 2051 verifyFormat("/* something */ namespace {\n" 2052 "class A {};\n" 2053 "void f() { f(); }\n" 2054 "}", 2055 LLVMWithNoNamespaceFix); 2056 verifyFormat("inline namespace X {\n" 2057 "class A {};\n" 2058 "void f() { f(); }\n" 2059 "}", 2060 LLVMWithNoNamespaceFix); 2061 verifyFormat("/* something */ inline namespace X {\n" 2062 "class A {};\n" 2063 "void f() { f(); }\n" 2064 "}", 2065 LLVMWithNoNamespaceFix); 2066 verifyFormat("export namespace X {\n" 2067 "class A {};\n" 2068 "void f() { f(); }\n" 2069 "}", 2070 LLVMWithNoNamespaceFix); 2071 verifyFormat("using namespace some_namespace;\n" 2072 "class A {};\n" 2073 "void f() { f(); }", 2074 LLVMWithNoNamespaceFix); 2075 2076 // This code is more common than we thought; if we 2077 // layout this correctly the semicolon will go into 2078 // its own line, which is undesirable. 2079 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 2080 verifyFormat("namespace {\n" 2081 "class A {};\n" 2082 "};", 2083 LLVMWithNoNamespaceFix); 2084 2085 verifyFormat("namespace {\n" 2086 "int SomeVariable = 0; // comment\n" 2087 "} // namespace", 2088 LLVMWithNoNamespaceFix); 2089 EXPECT_EQ("#ifndef HEADER_GUARD\n" 2090 "#define HEADER_GUARD\n" 2091 "namespace my_namespace {\n" 2092 "int i;\n" 2093 "} // my_namespace\n" 2094 "#endif // HEADER_GUARD", 2095 format("#ifndef HEADER_GUARD\n" 2096 " #define HEADER_GUARD\n" 2097 " namespace my_namespace {\n" 2098 "int i;\n" 2099 "} // my_namespace\n" 2100 "#endif // HEADER_GUARD", 2101 LLVMWithNoNamespaceFix)); 2102 2103 EXPECT_EQ("namespace A::B {\n" 2104 "class C {};\n" 2105 "}", 2106 format("namespace A::B {\n" 2107 "class C {};\n" 2108 "}", 2109 LLVMWithNoNamespaceFix)); 2110 2111 FormatStyle Style = getLLVMStyle(); 2112 Style.NamespaceIndentation = FormatStyle::NI_All; 2113 EXPECT_EQ("namespace out {\n" 2114 " int i;\n" 2115 " namespace in {\n" 2116 " int i;\n" 2117 " } // namespace in\n" 2118 "} // namespace out", 2119 format("namespace out {\n" 2120 "int i;\n" 2121 "namespace in {\n" 2122 "int i;\n" 2123 "} // namespace in\n" 2124 "} // namespace out", 2125 Style)); 2126 2127 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2128 EXPECT_EQ("namespace out {\n" 2129 "int i;\n" 2130 "namespace in {\n" 2131 " int i;\n" 2132 "} // namespace in\n" 2133 "} // namespace out", 2134 format("namespace out {\n" 2135 "int i;\n" 2136 "namespace in {\n" 2137 "int i;\n" 2138 "} // namespace in\n" 2139 "} // namespace out", 2140 Style)); 2141 } 2142 2143 TEST_F(FormatTest, NamespaceMacros) { 2144 FormatStyle Style = getLLVMStyle(); 2145 Style.NamespaceMacros.push_back("TESTSUITE"); 2146 2147 verifyFormat("TESTSUITE(A) {\n" 2148 "int foo();\n" 2149 "} // TESTSUITE(A)", 2150 Style); 2151 2152 verifyFormat("TESTSUITE(A, B) {\n" 2153 "int foo();\n" 2154 "} // TESTSUITE(A)", 2155 Style); 2156 2157 // Properly indent according to NamespaceIndentation style 2158 Style.NamespaceIndentation = FormatStyle::NI_All; 2159 verifyFormat("TESTSUITE(A) {\n" 2160 " int foo();\n" 2161 "} // TESTSUITE(A)", 2162 Style); 2163 verifyFormat("TESTSUITE(A) {\n" 2164 " namespace B {\n" 2165 " int foo();\n" 2166 " } // namespace B\n" 2167 "} // TESTSUITE(A)", 2168 Style); 2169 verifyFormat("namespace A {\n" 2170 " TESTSUITE(B) {\n" 2171 " int foo();\n" 2172 " } // TESTSUITE(B)\n" 2173 "} // namespace A", 2174 Style); 2175 2176 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2177 verifyFormat("TESTSUITE(A) {\n" 2178 "TESTSUITE(B) {\n" 2179 " int foo();\n" 2180 "} // TESTSUITE(B)\n" 2181 "} // TESTSUITE(A)", 2182 Style); 2183 verifyFormat("TESTSUITE(A) {\n" 2184 "namespace B {\n" 2185 " int foo();\n" 2186 "} // namespace B\n" 2187 "} // TESTSUITE(A)", 2188 Style); 2189 verifyFormat("namespace A {\n" 2190 "TESTSUITE(B) {\n" 2191 " int foo();\n" 2192 "} // TESTSUITE(B)\n" 2193 "} // namespace A", 2194 Style); 2195 2196 // Properly merge namespace-macros blocks in CompactNamespaces mode 2197 Style.NamespaceIndentation = FormatStyle::NI_None; 2198 Style.CompactNamespaces = true; 2199 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2200 "}} // TESTSUITE(A::B)", 2201 Style); 2202 2203 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2204 "}} // TESTSUITE(out::in)", 2205 format("TESTSUITE(out) {\n" 2206 "TESTSUITE(in) {\n" 2207 "} // TESTSUITE(in)\n" 2208 "} // TESTSUITE(out)", 2209 Style)); 2210 2211 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2212 "}} // TESTSUITE(out::in)", 2213 format("TESTSUITE(out) {\n" 2214 "TESTSUITE(in) {\n" 2215 "} // TESTSUITE(in)\n" 2216 "} // TESTSUITE(out)", 2217 Style)); 2218 2219 // Do not merge different namespaces/macros 2220 EXPECT_EQ("namespace out {\n" 2221 "TESTSUITE(in) {\n" 2222 "} // TESTSUITE(in)\n" 2223 "} // namespace out", 2224 format("namespace out {\n" 2225 "TESTSUITE(in) {\n" 2226 "} // TESTSUITE(in)\n" 2227 "} // namespace out", 2228 Style)); 2229 EXPECT_EQ("TESTSUITE(out) {\n" 2230 "namespace in {\n" 2231 "} // namespace in\n" 2232 "} // TESTSUITE(out)", 2233 format("TESTSUITE(out) {\n" 2234 "namespace in {\n" 2235 "} // namespace in\n" 2236 "} // TESTSUITE(out)", 2237 Style)); 2238 Style.NamespaceMacros.push_back("FOOBAR"); 2239 EXPECT_EQ("TESTSUITE(out) {\n" 2240 "FOOBAR(in) {\n" 2241 "} // FOOBAR(in)\n" 2242 "} // TESTSUITE(out)", 2243 format("TESTSUITE(out) {\n" 2244 "FOOBAR(in) {\n" 2245 "} // FOOBAR(in)\n" 2246 "} // TESTSUITE(out)", 2247 Style)); 2248 } 2249 2250 TEST_F(FormatTest, FormatsCompactNamespaces) { 2251 FormatStyle Style = getLLVMStyle(); 2252 Style.CompactNamespaces = true; 2253 Style.NamespaceMacros.push_back("TESTSUITE"); 2254 2255 verifyFormat("namespace A { namespace B {\n" 2256 "}} // namespace A::B", 2257 Style); 2258 2259 EXPECT_EQ("namespace out { namespace in {\n" 2260 "}} // namespace out::in", 2261 format("namespace out {\n" 2262 "namespace in {\n" 2263 "} // namespace in\n" 2264 "} // namespace out", 2265 Style)); 2266 2267 // Only namespaces which have both consecutive opening and end get compacted 2268 EXPECT_EQ("namespace out {\n" 2269 "namespace in1 {\n" 2270 "} // namespace in1\n" 2271 "namespace in2 {\n" 2272 "} // namespace in2\n" 2273 "} // namespace out", 2274 format("namespace out {\n" 2275 "namespace in1 {\n" 2276 "} // namespace in1\n" 2277 "namespace in2 {\n" 2278 "} // namespace in2\n" 2279 "} // namespace out", 2280 Style)); 2281 2282 EXPECT_EQ("namespace out {\n" 2283 "int i;\n" 2284 "namespace in {\n" 2285 "int j;\n" 2286 "} // namespace in\n" 2287 "int k;\n" 2288 "} // namespace out", 2289 format("namespace out { int i;\n" 2290 "namespace in { int j; } // namespace in\n" 2291 "int k; } // namespace out", 2292 Style)); 2293 2294 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2295 "}}} // namespace A::B::C\n", 2296 format("namespace A { namespace B {\n" 2297 "namespace C {\n" 2298 "}} // namespace B::C\n" 2299 "} // namespace A\n", 2300 Style)); 2301 2302 Style.ColumnLimit = 40; 2303 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2304 "namespace bbbbbbbbbb {\n" 2305 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2306 format("namespace aaaaaaaaaa {\n" 2307 "namespace bbbbbbbbbb {\n" 2308 "} // namespace bbbbbbbbbb\n" 2309 "} // namespace aaaaaaaaaa", 2310 Style)); 2311 2312 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2313 "namespace cccccc {\n" 2314 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2315 format("namespace aaaaaa {\n" 2316 "namespace bbbbbb {\n" 2317 "namespace cccccc {\n" 2318 "} // namespace cccccc\n" 2319 "} // namespace bbbbbb\n" 2320 "} // namespace aaaaaa", 2321 Style)); 2322 Style.ColumnLimit = 80; 2323 2324 // Extra semicolon after 'inner' closing brace prevents merging 2325 EXPECT_EQ("namespace out { namespace in {\n" 2326 "}; } // namespace out::in", 2327 format("namespace out {\n" 2328 "namespace in {\n" 2329 "}; // namespace in\n" 2330 "} // namespace out", 2331 Style)); 2332 2333 // Extra semicolon after 'outer' closing brace is conserved 2334 EXPECT_EQ("namespace out { namespace in {\n" 2335 "}}; // namespace out::in", 2336 format("namespace out {\n" 2337 "namespace in {\n" 2338 "} // namespace in\n" 2339 "}; // namespace out", 2340 Style)); 2341 2342 Style.NamespaceIndentation = FormatStyle::NI_All; 2343 EXPECT_EQ("namespace out { namespace in {\n" 2344 " int i;\n" 2345 "}} // namespace out::in", 2346 format("namespace out {\n" 2347 "namespace in {\n" 2348 "int i;\n" 2349 "} // namespace in\n" 2350 "} // namespace out", 2351 Style)); 2352 EXPECT_EQ("namespace out { namespace mid {\n" 2353 " namespace in {\n" 2354 " int j;\n" 2355 " } // namespace in\n" 2356 " int k;\n" 2357 "}} // namespace out::mid", 2358 format("namespace out { namespace mid {\n" 2359 "namespace in { int j; } // namespace in\n" 2360 "int k; }} // namespace out::mid", 2361 Style)); 2362 2363 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2364 EXPECT_EQ("namespace out { namespace in {\n" 2365 " int i;\n" 2366 "}} // namespace out::in", 2367 format("namespace out {\n" 2368 "namespace in {\n" 2369 "int i;\n" 2370 "} // namespace in\n" 2371 "} // namespace out", 2372 Style)); 2373 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2374 " int i;\n" 2375 "}}} // namespace out::mid::in", 2376 format("namespace out {\n" 2377 "namespace mid {\n" 2378 "namespace in {\n" 2379 "int i;\n" 2380 "} // namespace in\n" 2381 "} // namespace mid\n" 2382 "} // namespace out", 2383 Style)); 2384 } 2385 2386 TEST_F(FormatTest, FormatsExternC) { 2387 verifyFormat("extern \"C\" {\nint a;"); 2388 verifyFormat("extern \"C\" {}"); 2389 verifyFormat("extern \"C\" {\n" 2390 "int foo();\n" 2391 "}"); 2392 verifyFormat("extern \"C\" int foo() {}"); 2393 verifyFormat("extern \"C\" int foo();"); 2394 verifyFormat("extern \"C\" int foo() {\n" 2395 " int i = 42;\n" 2396 " return i;\n" 2397 "}"); 2398 2399 FormatStyle Style = getLLVMStyle(); 2400 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2401 Style.BraceWrapping.AfterFunction = true; 2402 verifyFormat("extern \"C\" int foo() {}", Style); 2403 verifyFormat("extern \"C\" int foo();", Style); 2404 verifyFormat("extern \"C\" int foo()\n" 2405 "{\n" 2406 " int i = 42;\n" 2407 " return i;\n" 2408 "}", 2409 Style); 2410 2411 Style.BraceWrapping.AfterExternBlock = true; 2412 Style.BraceWrapping.SplitEmptyRecord = false; 2413 verifyFormat("extern \"C\"\n" 2414 "{}", 2415 Style); 2416 verifyFormat("extern \"C\"\n" 2417 "{\n" 2418 " int foo();\n" 2419 "}", 2420 Style); 2421 } 2422 2423 TEST_F(FormatTest, FormatsInlineASM) { 2424 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2425 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2426 verifyFormat( 2427 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2428 " \"cpuid\\n\\t\"\n" 2429 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2430 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2431 " : \"a\"(value));"); 2432 EXPECT_EQ( 2433 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2434 " __asm {\n" 2435 " mov edx,[that] // vtable in edx\n" 2436 " mov eax,methodIndex\n" 2437 " call [edx][eax*4] // stdcall\n" 2438 " }\n" 2439 "}", 2440 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2441 " __asm {\n" 2442 " mov edx,[that] // vtable in edx\n" 2443 " mov eax,methodIndex\n" 2444 " call [edx][eax*4] // stdcall\n" 2445 " }\n" 2446 "}")); 2447 EXPECT_EQ("_asm {\n" 2448 " xor eax, eax;\n" 2449 " cpuid;\n" 2450 "}", 2451 format("_asm {\n" 2452 " xor eax, eax;\n" 2453 " cpuid;\n" 2454 "}")); 2455 verifyFormat("void function() {\n" 2456 " // comment\n" 2457 " asm(\"\");\n" 2458 "}"); 2459 EXPECT_EQ("__asm {\n" 2460 "}\n" 2461 "int i;", 2462 format("__asm {\n" 2463 "}\n" 2464 "int i;")); 2465 } 2466 2467 TEST_F(FormatTest, FormatTryCatch) { 2468 verifyFormat("try {\n" 2469 " throw a * b;\n" 2470 "} catch (int a) {\n" 2471 " // Do nothing.\n" 2472 "} catch (...) {\n" 2473 " exit(42);\n" 2474 "}"); 2475 2476 // Function-level try statements. 2477 verifyFormat("int f() try { return 4; } catch (...) {\n" 2478 " return 5;\n" 2479 "}"); 2480 verifyFormat("class A {\n" 2481 " int a;\n" 2482 " A() try : a(0) {\n" 2483 " } catch (...) {\n" 2484 " throw;\n" 2485 " }\n" 2486 "};\n"); 2487 2488 // Incomplete try-catch blocks. 2489 verifyIncompleteFormat("try {} catch ("); 2490 } 2491 2492 TEST_F(FormatTest, FormatSEHTryCatch) { 2493 verifyFormat("__try {\n" 2494 " int a = b * c;\n" 2495 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2496 " // Do nothing.\n" 2497 "}"); 2498 2499 verifyFormat("__try {\n" 2500 " int a = b * c;\n" 2501 "} __finally {\n" 2502 " // Do nothing.\n" 2503 "}"); 2504 2505 verifyFormat("DEBUG({\n" 2506 " __try {\n" 2507 " } __finally {\n" 2508 " }\n" 2509 "});\n"); 2510 } 2511 2512 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2513 verifyFormat("try {\n" 2514 " f();\n" 2515 "} catch {\n" 2516 " g();\n" 2517 "}"); 2518 verifyFormat("try {\n" 2519 " f();\n" 2520 "} catch (A a) MACRO(x) {\n" 2521 " g();\n" 2522 "} catch (B b) MACRO(x) {\n" 2523 " g();\n" 2524 "}"); 2525 } 2526 2527 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2528 FormatStyle Style = getLLVMStyle(); 2529 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2530 FormatStyle::BS_WebKit}) { 2531 Style.BreakBeforeBraces = BraceStyle; 2532 verifyFormat("try {\n" 2533 " // something\n" 2534 "} catch (...) {\n" 2535 " // something\n" 2536 "}", 2537 Style); 2538 } 2539 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2540 verifyFormat("try {\n" 2541 " // something\n" 2542 "}\n" 2543 "catch (...) {\n" 2544 " // something\n" 2545 "}", 2546 Style); 2547 verifyFormat("__try {\n" 2548 " // something\n" 2549 "}\n" 2550 "__finally {\n" 2551 " // something\n" 2552 "}", 2553 Style); 2554 verifyFormat("@try {\n" 2555 " // something\n" 2556 "}\n" 2557 "@finally {\n" 2558 " // something\n" 2559 "}", 2560 Style); 2561 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2562 verifyFormat("try\n" 2563 "{\n" 2564 " // something\n" 2565 "}\n" 2566 "catch (...)\n" 2567 "{\n" 2568 " // something\n" 2569 "}", 2570 Style); 2571 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2572 verifyFormat("try\n" 2573 " {\n" 2574 " // something white\n" 2575 " }\n" 2576 "catch (...)\n" 2577 " {\n" 2578 " // something white\n" 2579 " }", 2580 Style); 2581 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2582 verifyFormat("try\n" 2583 " {\n" 2584 " // something\n" 2585 " }\n" 2586 "catch (...)\n" 2587 " {\n" 2588 " // something\n" 2589 " }", 2590 Style); 2591 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2592 Style.BraceWrapping.BeforeCatch = true; 2593 verifyFormat("try {\n" 2594 " // something\n" 2595 "}\n" 2596 "catch (...) {\n" 2597 " // something\n" 2598 "}", 2599 Style); 2600 } 2601 2602 TEST_F(FormatTest, StaticInitializers) { 2603 verifyFormat("static SomeClass SC = {1, 'a'};"); 2604 2605 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2606 " 100000000, " 2607 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2608 2609 // Here, everything other than the "}" would fit on a line. 2610 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2611 " 10000000000000000000000000};"); 2612 EXPECT_EQ("S s = {a,\n" 2613 "\n" 2614 " b};", 2615 format("S s = {\n" 2616 " a,\n" 2617 "\n" 2618 " b\n" 2619 "};")); 2620 2621 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2622 // line. However, the formatting looks a bit off and this probably doesn't 2623 // happen often in practice. 2624 verifyFormat("static int Variable[1] = {\n" 2625 " {1000000000000000000000000000000000000}};", 2626 getLLVMStyleWithColumns(40)); 2627 } 2628 2629 TEST_F(FormatTest, DesignatedInitializers) { 2630 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2631 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2632 " .bbbbbbbbbb = 2,\n" 2633 " .cccccccccc = 3,\n" 2634 " .dddddddddd = 4,\n" 2635 " .eeeeeeeeee = 5};"); 2636 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2637 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2638 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2639 " .ccccccccccccccccccccccccccc = 3,\n" 2640 " .ddddddddddddddddddddddddddd = 4,\n" 2641 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2642 2643 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2644 2645 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2646 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2647 " [2] = bbbbbbbbbb,\n" 2648 " [3] = cccccccccc,\n" 2649 " [4] = dddddddddd,\n" 2650 " [5] = eeeeeeeeee};"); 2651 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2652 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2653 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2654 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2655 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2656 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2657 } 2658 2659 TEST_F(FormatTest, NestedStaticInitializers) { 2660 verifyFormat("static A x = {{{}}};\n"); 2661 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2662 " {init1, init2, init3, init4}}};", 2663 getLLVMStyleWithColumns(50)); 2664 2665 verifyFormat("somes Status::global_reps[3] = {\n" 2666 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2667 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2668 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2669 getLLVMStyleWithColumns(60)); 2670 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2671 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2672 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2673 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2674 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2675 " {rect.fRight - rect.fLeft, rect.fBottom - " 2676 "rect.fTop}};"); 2677 2678 verifyFormat( 2679 "SomeArrayOfSomeType a = {\n" 2680 " {{1, 2, 3},\n" 2681 " {1, 2, 3},\n" 2682 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2683 " 333333333333333333333333333333},\n" 2684 " {1, 2, 3},\n" 2685 " {1, 2, 3}}};"); 2686 verifyFormat( 2687 "SomeArrayOfSomeType a = {\n" 2688 " {{1, 2, 3}},\n" 2689 " {{1, 2, 3}},\n" 2690 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2691 " 333333333333333333333333333333}},\n" 2692 " {{1, 2, 3}},\n" 2693 " {{1, 2, 3}}};"); 2694 2695 verifyFormat("struct {\n" 2696 " unsigned bit;\n" 2697 " const char *const name;\n" 2698 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2699 " {kOsWin, \"Windows\"},\n" 2700 " {kOsLinux, \"Linux\"},\n" 2701 " {kOsCrOS, \"Chrome OS\"}};"); 2702 verifyFormat("struct {\n" 2703 " unsigned bit;\n" 2704 " const char *const name;\n" 2705 "} kBitsToOs[] = {\n" 2706 " {kOsMac, \"Mac\"},\n" 2707 " {kOsWin, \"Windows\"},\n" 2708 " {kOsLinux, \"Linux\"},\n" 2709 " {kOsCrOS, \"Chrome OS\"},\n" 2710 "};"); 2711 } 2712 2713 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2714 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2715 " \\\n" 2716 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2717 } 2718 2719 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2720 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2721 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2722 2723 // Do break defaulted and deleted functions. 2724 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2725 " default;", 2726 getLLVMStyleWithColumns(40)); 2727 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2728 " delete;", 2729 getLLVMStyleWithColumns(40)); 2730 } 2731 2732 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2733 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2734 getLLVMStyleWithColumns(40)); 2735 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2736 getLLVMStyleWithColumns(40)); 2737 EXPECT_EQ("#define Q \\\n" 2738 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2739 " \"aaaaaaaa.cpp\"", 2740 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2741 getLLVMStyleWithColumns(40))); 2742 } 2743 2744 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2745 EXPECT_EQ("# 123 \"A string literal\"", 2746 format(" # 123 \"A string literal\"")); 2747 } 2748 2749 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2750 EXPECT_EQ("#;", format("#;")); 2751 verifyFormat("#\n;\n;\n;"); 2752 } 2753 2754 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2755 EXPECT_EQ("#line 42 \"test\"\n", 2756 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2757 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2758 getLLVMStyleWithColumns(12))); 2759 } 2760 2761 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2762 EXPECT_EQ("#line 42 \"test\"", 2763 format("# \\\n line \\\n 42 \\\n \"test\"")); 2764 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2765 } 2766 2767 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2768 verifyFormat("#define A \\x20"); 2769 verifyFormat("#define A \\ x20"); 2770 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2771 verifyFormat("#define A ''"); 2772 verifyFormat("#define A ''qqq"); 2773 verifyFormat("#define A `qqq"); 2774 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2775 EXPECT_EQ("const char *c = STRINGIFY(\n" 2776 "\\na : b);", 2777 format("const char * c = STRINGIFY(\n" 2778 "\\na : b);")); 2779 2780 verifyFormat("a\r\\"); 2781 verifyFormat("a\v\\"); 2782 verifyFormat("a\f\\"); 2783 } 2784 2785 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2786 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2787 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2788 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2789 // FIXME: We never break before the macro name. 2790 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2791 2792 verifyFormat("#define A A\n#define A A"); 2793 verifyFormat("#define A(X) A\n#define A A"); 2794 2795 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2796 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2797 } 2798 2799 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2800 EXPECT_EQ("// somecomment\n" 2801 "#include \"a.h\"\n" 2802 "#define A( \\\n" 2803 " A, B)\n" 2804 "#include \"b.h\"\n" 2805 "// somecomment\n", 2806 format(" // somecomment\n" 2807 " #include \"a.h\"\n" 2808 "#define A(A,\\\n" 2809 " B)\n" 2810 " #include \"b.h\"\n" 2811 " // somecomment\n", 2812 getLLVMStyleWithColumns(13))); 2813 } 2814 2815 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2816 2817 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2818 EXPECT_EQ("#define A \\\n" 2819 " c; \\\n" 2820 " e;\n" 2821 "f;", 2822 format("#define A c; e;\n" 2823 "f;", 2824 getLLVMStyleWithColumns(14))); 2825 } 2826 2827 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2828 2829 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2830 EXPECT_EQ("int x,\n" 2831 "#define A\n" 2832 " y;", 2833 format("int x,\n#define A\ny;")); 2834 } 2835 2836 TEST_F(FormatTest, HashInMacroDefinition) { 2837 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2838 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2839 verifyFormat("#define A \\\n" 2840 " { \\\n" 2841 " f(#c); \\\n" 2842 " }", 2843 getLLVMStyleWithColumns(11)); 2844 2845 verifyFormat("#define A(X) \\\n" 2846 " void function##X()", 2847 getLLVMStyleWithColumns(22)); 2848 2849 verifyFormat("#define A(a, b, c) \\\n" 2850 " void a##b##c()", 2851 getLLVMStyleWithColumns(22)); 2852 2853 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2854 } 2855 2856 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2857 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2858 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2859 2860 FormatStyle Style = getLLVMStyle(); 2861 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2862 verifyFormat("#define true ((foo)1)", Style); 2863 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2864 verifyFormat("#define false((foo)0)", Style); 2865 } 2866 2867 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2868 EXPECT_EQ("#define A b;", format("#define A \\\n" 2869 " \\\n" 2870 " b;", 2871 getLLVMStyleWithColumns(25))); 2872 EXPECT_EQ("#define A \\\n" 2873 " \\\n" 2874 " a; \\\n" 2875 " b;", 2876 format("#define A \\\n" 2877 " \\\n" 2878 " a; \\\n" 2879 " b;", 2880 getLLVMStyleWithColumns(11))); 2881 EXPECT_EQ("#define A \\\n" 2882 " a; \\\n" 2883 " \\\n" 2884 " b;", 2885 format("#define A \\\n" 2886 " a; \\\n" 2887 " \\\n" 2888 " b;", 2889 getLLVMStyleWithColumns(11))); 2890 } 2891 2892 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2893 verifyIncompleteFormat("#define A :"); 2894 verifyFormat("#define SOMECASES \\\n" 2895 " case 1: \\\n" 2896 " case 2\n", 2897 getLLVMStyleWithColumns(20)); 2898 verifyFormat("#define MACRO(a) \\\n" 2899 " if (a) \\\n" 2900 " f(); \\\n" 2901 " else \\\n" 2902 " g()", 2903 getLLVMStyleWithColumns(18)); 2904 verifyFormat("#define A template <typename T>"); 2905 verifyIncompleteFormat("#define STR(x) #x\n" 2906 "f(STR(this_is_a_string_literal{));"); 2907 verifyFormat("#pragma omp threadprivate( \\\n" 2908 " y)), // expected-warning", 2909 getLLVMStyleWithColumns(28)); 2910 verifyFormat("#d, = };"); 2911 verifyFormat("#if \"a"); 2912 verifyIncompleteFormat("({\n" 2913 "#define b \\\n" 2914 " } \\\n" 2915 " a\n" 2916 "a", 2917 getLLVMStyleWithColumns(15)); 2918 verifyFormat("#define A \\\n" 2919 " { \\\n" 2920 " {\n" 2921 "#define B \\\n" 2922 " } \\\n" 2923 " }", 2924 getLLVMStyleWithColumns(15)); 2925 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 2926 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 2927 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 2928 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 2929 } 2930 2931 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 2932 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 2933 EXPECT_EQ("class A : public QObject {\n" 2934 " Q_OBJECT\n" 2935 "\n" 2936 " A() {}\n" 2937 "};", 2938 format("class A : public QObject {\n" 2939 " Q_OBJECT\n" 2940 "\n" 2941 " A() {\n}\n" 2942 "} ;")); 2943 EXPECT_EQ("MACRO\n" 2944 "/*static*/ int i;", 2945 format("MACRO\n" 2946 " /*static*/ int i;")); 2947 EXPECT_EQ("SOME_MACRO\n" 2948 "namespace {\n" 2949 "void f();\n" 2950 "} // namespace", 2951 format("SOME_MACRO\n" 2952 " namespace {\n" 2953 "void f( );\n" 2954 "} // namespace")); 2955 // Only if the identifier contains at least 5 characters. 2956 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 2957 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 2958 // Only if everything is upper case. 2959 EXPECT_EQ("class A : public QObject {\n" 2960 " Q_Object A() {}\n" 2961 "};", 2962 format("class A : public QObject {\n" 2963 " Q_Object\n" 2964 " A() {\n}\n" 2965 "} ;")); 2966 2967 // Only if the next line can actually start an unwrapped line. 2968 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 2969 format("SOME_WEIRD_LOG_MACRO\n" 2970 "<< SomeThing;")); 2971 2972 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 2973 "(n, buffers))\n", 2974 getChromiumStyle(FormatStyle::LK_Cpp)); 2975 2976 // See PR41483 2977 EXPECT_EQ("/**/ FOO(a)\n" 2978 "FOO(b)", 2979 format("/**/ FOO(a)\n" 2980 "FOO(b)")); 2981 } 2982 2983 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 2984 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2985 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2986 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2987 "class X {};\n" 2988 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2989 "int *createScopDetectionPass() { return 0; }", 2990 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2991 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2992 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2993 " class X {};\n" 2994 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2995 " int *createScopDetectionPass() { return 0; }")); 2996 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 2997 // braces, so that inner block is indented one level more. 2998 EXPECT_EQ("int q() {\n" 2999 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3000 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3001 " IPC_END_MESSAGE_MAP()\n" 3002 "}", 3003 format("int q() {\n" 3004 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3005 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3006 " IPC_END_MESSAGE_MAP()\n" 3007 "}")); 3008 3009 // Same inside macros. 3010 EXPECT_EQ("#define LIST(L) \\\n" 3011 " L(A) \\\n" 3012 " L(B) \\\n" 3013 " L(C)", 3014 format("#define LIST(L) \\\n" 3015 " L(A) \\\n" 3016 " L(B) \\\n" 3017 " L(C)", 3018 getGoogleStyle())); 3019 3020 // These must not be recognized as macros. 3021 EXPECT_EQ("int q() {\n" 3022 " f(x);\n" 3023 " f(x) {}\n" 3024 " f(x)->g();\n" 3025 " f(x)->*g();\n" 3026 " f(x).g();\n" 3027 " f(x) = x;\n" 3028 " f(x) += x;\n" 3029 " f(x) -= x;\n" 3030 " f(x) *= x;\n" 3031 " f(x) /= x;\n" 3032 " f(x) %= x;\n" 3033 " f(x) &= x;\n" 3034 " f(x) |= x;\n" 3035 " f(x) ^= x;\n" 3036 " f(x) >>= x;\n" 3037 " f(x) <<= x;\n" 3038 " f(x)[y].z();\n" 3039 " LOG(INFO) << x;\n" 3040 " ifstream(x) >> x;\n" 3041 "}\n", 3042 format("int q() {\n" 3043 " f(x)\n;\n" 3044 " f(x)\n {}\n" 3045 " f(x)\n->g();\n" 3046 " f(x)\n->*g();\n" 3047 " f(x)\n.g();\n" 3048 " f(x)\n = x;\n" 3049 " f(x)\n += x;\n" 3050 " f(x)\n -= x;\n" 3051 " f(x)\n *= x;\n" 3052 " f(x)\n /= x;\n" 3053 " f(x)\n %= x;\n" 3054 " f(x)\n &= x;\n" 3055 " f(x)\n |= x;\n" 3056 " f(x)\n ^= x;\n" 3057 " f(x)\n >>= x;\n" 3058 " f(x)\n <<= x;\n" 3059 " f(x)\n[y].z();\n" 3060 " LOG(INFO)\n << x;\n" 3061 " ifstream(x)\n >> x;\n" 3062 "}\n")); 3063 EXPECT_EQ("int q() {\n" 3064 " F(x)\n" 3065 " if (1) {\n" 3066 " }\n" 3067 " F(x)\n" 3068 " while (1) {\n" 3069 " }\n" 3070 " F(x)\n" 3071 " G(x);\n" 3072 " F(x)\n" 3073 " try {\n" 3074 " Q();\n" 3075 " } catch (...) {\n" 3076 " }\n" 3077 "}\n", 3078 format("int q() {\n" 3079 "F(x)\n" 3080 "if (1) {}\n" 3081 "F(x)\n" 3082 "while (1) {}\n" 3083 "F(x)\n" 3084 "G(x);\n" 3085 "F(x)\n" 3086 "try { Q(); } catch (...) {}\n" 3087 "}\n")); 3088 EXPECT_EQ("class A {\n" 3089 " A() : t(0) {}\n" 3090 " A(int i) noexcept() : {}\n" 3091 " A(X x)\n" // FIXME: function-level try blocks are broken. 3092 " try : t(0) {\n" 3093 " } catch (...) {\n" 3094 " }\n" 3095 "};", 3096 format("class A {\n" 3097 " A()\n : t(0) {}\n" 3098 " A(int i)\n noexcept() : {}\n" 3099 " A(X x)\n" 3100 " try : t(0) {} catch (...) {}\n" 3101 "};")); 3102 FormatStyle Style = getLLVMStyle(); 3103 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3104 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3105 Style.BraceWrapping.AfterFunction = true; 3106 EXPECT_EQ("void f()\n" 3107 "try\n" 3108 "{\n" 3109 "}", 3110 format("void f() try {\n" 3111 "}", 3112 Style)); 3113 EXPECT_EQ("class SomeClass {\n" 3114 "public:\n" 3115 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3116 "};", 3117 format("class SomeClass {\n" 3118 "public:\n" 3119 " SomeClass()\n" 3120 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3121 "};")); 3122 EXPECT_EQ("class SomeClass {\n" 3123 "public:\n" 3124 " SomeClass()\n" 3125 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3126 "};", 3127 format("class SomeClass {\n" 3128 "public:\n" 3129 " SomeClass()\n" 3130 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3131 "};", 3132 getLLVMStyleWithColumns(40))); 3133 3134 verifyFormat("MACRO(>)"); 3135 3136 // Some macros contain an implicit semicolon. 3137 Style = getLLVMStyle(); 3138 Style.StatementMacros.push_back("FOO"); 3139 verifyFormat("FOO(a) int b = 0;"); 3140 verifyFormat("FOO(a)\n" 3141 "int b = 0;", 3142 Style); 3143 verifyFormat("FOO(a);\n" 3144 "int b = 0;", 3145 Style); 3146 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3147 "int b = 0;", 3148 Style); 3149 verifyFormat("FOO()\n" 3150 "int b = 0;", 3151 Style); 3152 verifyFormat("FOO\n" 3153 "int b = 0;", 3154 Style); 3155 verifyFormat("void f() {\n" 3156 " FOO(a)\n" 3157 " return a;\n" 3158 "}", 3159 Style); 3160 verifyFormat("FOO(a)\n" 3161 "FOO(b)", 3162 Style); 3163 verifyFormat("int a = 0;\n" 3164 "FOO(b)\n" 3165 "int c = 0;", 3166 Style); 3167 verifyFormat("int a = 0;\n" 3168 "int x = FOO(a)\n" 3169 "int b = 0;", 3170 Style); 3171 verifyFormat("void foo(int a) { FOO(a) }\n" 3172 "uint32_t bar() {}", 3173 Style); 3174 } 3175 3176 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3177 verifyFormat("#define A \\\n" 3178 " f({ \\\n" 3179 " g(); \\\n" 3180 " });", 3181 getLLVMStyleWithColumns(11)); 3182 } 3183 3184 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3185 FormatStyle Style = getLLVMStyle(); 3186 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3187 Style.ColumnLimit = 40; 3188 verifyFormat("#ifdef _WIN32\n" 3189 "#define A 0\n" 3190 "#ifdef VAR2\n" 3191 "#define B 1\n" 3192 "#include <someheader.h>\n" 3193 "#define MACRO \\\n" 3194 " some_very_long_func_aaaaaaaaaa();\n" 3195 "#endif\n" 3196 "#else\n" 3197 "#define A 1\n" 3198 "#endif", 3199 Style); 3200 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3201 verifyFormat("#ifdef _WIN32\n" 3202 "# define A 0\n" 3203 "# ifdef VAR2\n" 3204 "# define B 1\n" 3205 "# include <someheader.h>\n" 3206 "# define MACRO \\\n" 3207 " some_very_long_func_aaaaaaaaaa();\n" 3208 "# endif\n" 3209 "#else\n" 3210 "# define A 1\n" 3211 "#endif", 3212 Style); 3213 verifyFormat("#if A\n" 3214 "# define MACRO \\\n" 3215 " void a(int x) { \\\n" 3216 " b(); \\\n" 3217 " c(); \\\n" 3218 " d(); \\\n" 3219 " e(); \\\n" 3220 " f(); \\\n" 3221 " }\n" 3222 "#endif", 3223 Style); 3224 // Comments before include guard. 3225 verifyFormat("// file comment\n" 3226 "// file comment\n" 3227 "#ifndef HEADER_H\n" 3228 "#define HEADER_H\n" 3229 "code();\n" 3230 "#endif", 3231 Style); 3232 // Test with include guards. 3233 verifyFormat("#ifndef HEADER_H\n" 3234 "#define HEADER_H\n" 3235 "code();\n" 3236 "#endif", 3237 Style); 3238 // Include guards must have a #define with the same variable immediately 3239 // after #ifndef. 3240 verifyFormat("#ifndef NOT_GUARD\n" 3241 "# define FOO\n" 3242 "code();\n" 3243 "#endif", 3244 Style); 3245 3246 // Include guards must cover the entire file. 3247 verifyFormat("code();\n" 3248 "code();\n" 3249 "#ifndef NOT_GUARD\n" 3250 "# define NOT_GUARD\n" 3251 "code();\n" 3252 "#endif", 3253 Style); 3254 verifyFormat("#ifndef NOT_GUARD\n" 3255 "# define NOT_GUARD\n" 3256 "code();\n" 3257 "#endif\n" 3258 "code();", 3259 Style); 3260 // Test with trailing blank lines. 3261 verifyFormat("#ifndef HEADER_H\n" 3262 "#define HEADER_H\n" 3263 "code();\n" 3264 "#endif\n", 3265 Style); 3266 // Include guards don't have #else. 3267 verifyFormat("#ifndef NOT_GUARD\n" 3268 "# define NOT_GUARD\n" 3269 "code();\n" 3270 "#else\n" 3271 "#endif", 3272 Style); 3273 verifyFormat("#ifndef NOT_GUARD\n" 3274 "# define NOT_GUARD\n" 3275 "code();\n" 3276 "#elif FOO\n" 3277 "#endif", 3278 Style); 3279 // Non-identifier #define after potential include guard. 3280 verifyFormat("#ifndef FOO\n" 3281 "# define 1\n" 3282 "#endif\n", 3283 Style); 3284 // #if closes past last non-preprocessor line. 3285 verifyFormat("#ifndef FOO\n" 3286 "#define FOO\n" 3287 "#if 1\n" 3288 "int i;\n" 3289 "# define A 0\n" 3290 "#endif\n" 3291 "#endif\n", 3292 Style); 3293 // Don't crash if there is an #elif directive without a condition. 3294 verifyFormat("#if 1\n" 3295 "int x;\n" 3296 "#elif\n" 3297 "int y;\n" 3298 "#else\n" 3299 "int z;\n" 3300 "#endif", 3301 Style); 3302 // FIXME: This doesn't handle the case where there's code between the 3303 // #ifndef and #define but all other conditions hold. This is because when 3304 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3305 // previous code line yet, so we can't detect it. 3306 EXPECT_EQ("#ifndef NOT_GUARD\n" 3307 "code();\n" 3308 "#define NOT_GUARD\n" 3309 "code();\n" 3310 "#endif", 3311 format("#ifndef NOT_GUARD\n" 3312 "code();\n" 3313 "# define NOT_GUARD\n" 3314 "code();\n" 3315 "#endif", 3316 Style)); 3317 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3318 // be outside an include guard. Examples are #pragma once and 3319 // #pragma GCC diagnostic, or anything else that does not change the meaning 3320 // of the file if it's included multiple times. 3321 EXPECT_EQ("#ifdef WIN32\n" 3322 "# pragma once\n" 3323 "#endif\n" 3324 "#ifndef HEADER_H\n" 3325 "# define HEADER_H\n" 3326 "code();\n" 3327 "#endif", 3328 format("#ifdef WIN32\n" 3329 "# pragma once\n" 3330 "#endif\n" 3331 "#ifndef HEADER_H\n" 3332 "#define HEADER_H\n" 3333 "code();\n" 3334 "#endif", 3335 Style)); 3336 // FIXME: This does not detect when there is a single non-preprocessor line 3337 // in front of an include-guard-like structure where other conditions hold 3338 // because ScopedLineState hides the line. 3339 EXPECT_EQ("code();\n" 3340 "#ifndef HEADER_H\n" 3341 "#define HEADER_H\n" 3342 "code();\n" 3343 "#endif", 3344 format("code();\n" 3345 "#ifndef HEADER_H\n" 3346 "# define HEADER_H\n" 3347 "code();\n" 3348 "#endif", 3349 Style)); 3350 // Keep comments aligned with #, otherwise indent comments normally. These 3351 // tests cannot use verifyFormat because messUp manipulates leading 3352 // whitespace. 3353 { 3354 const char *Expected = "" 3355 "void f() {\n" 3356 "#if 1\n" 3357 "// Preprocessor aligned.\n" 3358 "# define A 0\n" 3359 " // Code. Separated by blank line.\n" 3360 "\n" 3361 "# define B 0\n" 3362 " // Code. Not aligned with #\n" 3363 "# define C 0\n" 3364 "#endif"; 3365 const char *ToFormat = "" 3366 "void f() {\n" 3367 "#if 1\n" 3368 "// Preprocessor aligned.\n" 3369 "# define A 0\n" 3370 "// Code. Separated by blank line.\n" 3371 "\n" 3372 "# define B 0\n" 3373 " // Code. Not aligned with #\n" 3374 "# define C 0\n" 3375 "#endif"; 3376 EXPECT_EQ(Expected, format(ToFormat, Style)); 3377 EXPECT_EQ(Expected, format(Expected, Style)); 3378 } 3379 // Keep block quotes aligned. 3380 { 3381 const char *Expected = "" 3382 "void f() {\n" 3383 "#if 1\n" 3384 "/* Preprocessor aligned. */\n" 3385 "# define A 0\n" 3386 " /* Code. Separated by blank line. */\n" 3387 "\n" 3388 "# define B 0\n" 3389 " /* Code. Not aligned with # */\n" 3390 "# define C 0\n" 3391 "#endif"; 3392 const char *ToFormat = "" 3393 "void f() {\n" 3394 "#if 1\n" 3395 "/* Preprocessor aligned. */\n" 3396 "# define A 0\n" 3397 "/* Code. Separated by blank line. */\n" 3398 "\n" 3399 "# define B 0\n" 3400 " /* Code. Not aligned with # */\n" 3401 "# define C 0\n" 3402 "#endif"; 3403 EXPECT_EQ(Expected, format(ToFormat, Style)); 3404 EXPECT_EQ(Expected, format(Expected, Style)); 3405 } 3406 // Keep comments aligned with un-indented directives. 3407 { 3408 const char *Expected = "" 3409 "void f() {\n" 3410 "// Preprocessor aligned.\n" 3411 "#define A 0\n" 3412 " // Code. Separated by blank line.\n" 3413 "\n" 3414 "#define B 0\n" 3415 " // Code. Not aligned with #\n" 3416 "#define C 0\n"; 3417 const char *ToFormat = "" 3418 "void f() {\n" 3419 "// Preprocessor aligned.\n" 3420 "#define A 0\n" 3421 "// Code. Separated by blank line.\n" 3422 "\n" 3423 "#define B 0\n" 3424 " // Code. Not aligned with #\n" 3425 "#define C 0\n"; 3426 EXPECT_EQ(Expected, format(ToFormat, Style)); 3427 EXPECT_EQ(Expected, format(Expected, Style)); 3428 } 3429 // Test AfterHash with tabs. 3430 { 3431 FormatStyle Tabbed = Style; 3432 Tabbed.UseTab = FormatStyle::UT_Always; 3433 Tabbed.IndentWidth = 8; 3434 Tabbed.TabWidth = 8; 3435 verifyFormat("#ifdef _WIN32\n" 3436 "#\tdefine A 0\n" 3437 "#\tifdef VAR2\n" 3438 "#\t\tdefine B 1\n" 3439 "#\t\tinclude <someheader.h>\n" 3440 "#\t\tdefine MACRO \\\n" 3441 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3442 "#\tendif\n" 3443 "#else\n" 3444 "#\tdefine A 1\n" 3445 "#endif", 3446 Tabbed); 3447 } 3448 3449 // Regression test: Multiline-macro inside include guards. 3450 verifyFormat("#ifndef HEADER_H\n" 3451 "#define HEADER_H\n" 3452 "#define A() \\\n" 3453 " int i; \\\n" 3454 " int j;\n" 3455 "#endif // HEADER_H", 3456 getLLVMStyleWithColumns(20)); 3457 3458 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3459 // Basic before hash indent tests 3460 verifyFormat("#ifdef _WIN32\n" 3461 " #define A 0\n" 3462 " #ifdef VAR2\n" 3463 " #define B 1\n" 3464 " #include <someheader.h>\n" 3465 " #define MACRO \\\n" 3466 " some_very_long_func_aaaaaaaaaa();\n" 3467 " #endif\n" 3468 "#else\n" 3469 " #define A 1\n" 3470 "#endif", 3471 Style); 3472 verifyFormat("#if A\n" 3473 " #define MACRO \\\n" 3474 " void a(int x) { \\\n" 3475 " b(); \\\n" 3476 " c(); \\\n" 3477 " d(); \\\n" 3478 " e(); \\\n" 3479 " f(); \\\n" 3480 " }\n" 3481 "#endif", 3482 Style); 3483 // Keep comments aligned with indented directives. These 3484 // tests cannot use verifyFormat because messUp manipulates leading 3485 // whitespace. 3486 { 3487 const char *Expected = "void f() {\n" 3488 "// Aligned to preprocessor.\n" 3489 "#if 1\n" 3490 " // Aligned to code.\n" 3491 " int a;\n" 3492 " #if 1\n" 3493 " // Aligned to preprocessor.\n" 3494 " #define A 0\n" 3495 " // Aligned to code.\n" 3496 " int b;\n" 3497 " #endif\n" 3498 "#endif\n" 3499 "}"; 3500 const char *ToFormat = "void f() {\n" 3501 "// Aligned to preprocessor.\n" 3502 "#if 1\n" 3503 "// Aligned to code.\n" 3504 "int a;\n" 3505 "#if 1\n" 3506 "// Aligned to preprocessor.\n" 3507 "#define A 0\n" 3508 "// Aligned to code.\n" 3509 "int b;\n" 3510 "#endif\n" 3511 "#endif\n" 3512 "}"; 3513 EXPECT_EQ(Expected, format(ToFormat, Style)); 3514 EXPECT_EQ(Expected, format(Expected, Style)); 3515 } 3516 { 3517 const char *Expected = "void f() {\n" 3518 "/* Aligned to preprocessor. */\n" 3519 "#if 1\n" 3520 " /* Aligned to code. */\n" 3521 " int a;\n" 3522 " #if 1\n" 3523 " /* Aligned to preprocessor. */\n" 3524 " #define A 0\n" 3525 " /* Aligned to code. */\n" 3526 " int b;\n" 3527 " #endif\n" 3528 "#endif\n" 3529 "}"; 3530 const char *ToFormat = "void f() {\n" 3531 "/* Aligned to preprocessor. */\n" 3532 "#if 1\n" 3533 "/* Aligned to code. */\n" 3534 "int a;\n" 3535 "#if 1\n" 3536 "/* Aligned to preprocessor. */\n" 3537 "#define A 0\n" 3538 "/* Aligned to code. */\n" 3539 "int b;\n" 3540 "#endif\n" 3541 "#endif\n" 3542 "}"; 3543 EXPECT_EQ(Expected, format(ToFormat, Style)); 3544 EXPECT_EQ(Expected, format(Expected, Style)); 3545 } 3546 3547 // Test single comment before preprocessor 3548 verifyFormat("// Comment\n" 3549 "\n" 3550 "#if 1\n" 3551 "#endif", 3552 Style); 3553 } 3554 3555 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3556 verifyFormat("{\n { a #c; }\n}"); 3557 } 3558 3559 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3560 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3561 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3562 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3563 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3564 } 3565 3566 TEST_F(FormatTest, EscapedNewlines) { 3567 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3568 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3569 format("#define A \\\nint i;\\\n int j;", Narrow)); 3570 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3571 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3572 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3573 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3574 3575 FormatStyle AlignLeft = getLLVMStyle(); 3576 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3577 EXPECT_EQ("#define MACRO(x) \\\n" 3578 "private: \\\n" 3579 " int x(int a);\n", 3580 format("#define MACRO(x) \\\n" 3581 "private: \\\n" 3582 " int x(int a);\n", 3583 AlignLeft)); 3584 3585 // CRLF line endings 3586 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3587 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3588 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3589 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3590 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3591 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3592 EXPECT_EQ("#define MACRO(x) \\\r\n" 3593 "private: \\\r\n" 3594 " int x(int a);\r\n", 3595 format("#define MACRO(x) \\\r\n" 3596 "private: \\\r\n" 3597 " int x(int a);\r\n", 3598 AlignLeft)); 3599 3600 FormatStyle DontAlign = getLLVMStyle(); 3601 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3602 DontAlign.MaxEmptyLinesToKeep = 3; 3603 // FIXME: can't use verifyFormat here because the newline before 3604 // "public:" is not inserted the first time it's reformatted 3605 EXPECT_EQ("#define A \\\n" 3606 " class Foo { \\\n" 3607 " void bar(); \\\n" 3608 "\\\n" 3609 "\\\n" 3610 "\\\n" 3611 " public: \\\n" 3612 " void baz(); \\\n" 3613 " };", 3614 format("#define A \\\n" 3615 " class Foo { \\\n" 3616 " void bar(); \\\n" 3617 "\\\n" 3618 "\\\n" 3619 "\\\n" 3620 " public: \\\n" 3621 " void baz(); \\\n" 3622 " };", 3623 DontAlign)); 3624 } 3625 3626 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3627 verifyFormat("#define A \\\n" 3628 " int v( \\\n" 3629 " a); \\\n" 3630 " int i;", 3631 getLLVMStyleWithColumns(11)); 3632 } 3633 3634 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3635 EXPECT_EQ( 3636 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3637 " \\\n" 3638 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3639 "\n" 3640 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3641 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3642 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3643 "\\\n" 3644 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3645 " \n" 3646 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3647 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3648 } 3649 3650 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3651 EXPECT_EQ("int\n" 3652 "#define A\n" 3653 " a;", 3654 format("int\n#define A\na;")); 3655 verifyFormat("functionCallTo(\n" 3656 " someOtherFunction(\n" 3657 " withSomeParameters, whichInSequence,\n" 3658 " areLongerThanALine(andAnotherCall,\n" 3659 "#define A B\n" 3660 " withMoreParamters,\n" 3661 " whichStronglyInfluenceTheLayout),\n" 3662 " andMoreParameters),\n" 3663 " trailing);", 3664 getLLVMStyleWithColumns(69)); 3665 verifyFormat("Foo::Foo()\n" 3666 "#ifdef BAR\n" 3667 " : baz(0)\n" 3668 "#endif\n" 3669 "{\n" 3670 "}"); 3671 verifyFormat("void f() {\n" 3672 " if (true)\n" 3673 "#ifdef A\n" 3674 " f(42);\n" 3675 " x();\n" 3676 "#else\n" 3677 " g();\n" 3678 " x();\n" 3679 "#endif\n" 3680 "}"); 3681 verifyFormat("void f(param1, param2,\n" 3682 " param3,\n" 3683 "#ifdef A\n" 3684 " param4(param5,\n" 3685 "#ifdef A1\n" 3686 " param6,\n" 3687 "#ifdef A2\n" 3688 " param7),\n" 3689 "#else\n" 3690 " param8),\n" 3691 " param9,\n" 3692 "#endif\n" 3693 " param10,\n" 3694 "#endif\n" 3695 " param11)\n" 3696 "#else\n" 3697 " param12)\n" 3698 "#endif\n" 3699 "{\n" 3700 " x();\n" 3701 "}", 3702 getLLVMStyleWithColumns(28)); 3703 verifyFormat("#if 1\n" 3704 "int i;"); 3705 verifyFormat("#if 1\n" 3706 "#endif\n" 3707 "#if 1\n" 3708 "#else\n" 3709 "#endif\n"); 3710 verifyFormat("DEBUG({\n" 3711 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3713 "});\n" 3714 "#if a\n" 3715 "#else\n" 3716 "#endif"); 3717 3718 verifyIncompleteFormat("void f(\n" 3719 "#if A\n" 3720 ");\n" 3721 "#else\n" 3722 "#endif"); 3723 } 3724 3725 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3726 verifyFormat("#endif\n" 3727 "#if B"); 3728 } 3729 3730 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3731 FormatStyle SingleLine = getLLVMStyle(); 3732 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3733 verifyFormat("#if 0\n" 3734 "#elif 1\n" 3735 "#endif\n" 3736 "void foo() {\n" 3737 " if (test) foo2();\n" 3738 "}", 3739 SingleLine); 3740 } 3741 3742 TEST_F(FormatTest, LayoutBlockInsideParens) { 3743 verifyFormat("functionCall({ int i; });"); 3744 verifyFormat("functionCall({\n" 3745 " int i;\n" 3746 " int j;\n" 3747 "});"); 3748 verifyFormat("functionCall(\n" 3749 " {\n" 3750 " int i;\n" 3751 " int j;\n" 3752 " },\n" 3753 " aaaa, bbbb, cccc);"); 3754 verifyFormat("functionA(functionB({\n" 3755 " int i;\n" 3756 " int j;\n" 3757 " }),\n" 3758 " aaaa, bbbb, cccc);"); 3759 verifyFormat("functionCall(\n" 3760 " {\n" 3761 " int i;\n" 3762 " int j;\n" 3763 " },\n" 3764 " aaaa, bbbb, // comment\n" 3765 " cccc);"); 3766 verifyFormat("functionA(functionB({\n" 3767 " int i;\n" 3768 " int j;\n" 3769 " }),\n" 3770 " aaaa, bbbb, // comment\n" 3771 " cccc);"); 3772 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3773 verifyFormat("functionCall(aaaa, bbbb, {\n" 3774 " int i;\n" 3775 " int j;\n" 3776 "});"); 3777 verifyFormat( 3778 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3779 " {\n" 3780 " int i; // break\n" 3781 " },\n" 3782 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3783 " ccccccccccccccccc));"); 3784 verifyFormat("DEBUG({\n" 3785 " if (a)\n" 3786 " f();\n" 3787 "});"); 3788 } 3789 3790 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3791 EXPECT_EQ("SOME_MACRO { int i; }\n" 3792 "int i;", 3793 format(" SOME_MACRO {int i;} int i;")); 3794 } 3795 3796 TEST_F(FormatTest, LayoutNestedBlocks) { 3797 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3798 " struct s {\n" 3799 " int i;\n" 3800 " };\n" 3801 " s kBitsToOs[] = {{10}};\n" 3802 " for (int i = 0; i < 10; ++i)\n" 3803 " return;\n" 3804 "}"); 3805 verifyFormat("call(parameter, {\n" 3806 " something();\n" 3807 " // Comment using all columns.\n" 3808 " somethingelse();\n" 3809 "});", 3810 getLLVMStyleWithColumns(40)); 3811 verifyFormat("DEBUG( //\n" 3812 " { f(); }, a);"); 3813 verifyFormat("DEBUG( //\n" 3814 " {\n" 3815 " f(); //\n" 3816 " },\n" 3817 " a);"); 3818 3819 EXPECT_EQ("call(parameter, {\n" 3820 " something();\n" 3821 " // Comment too\n" 3822 " // looooooooooong.\n" 3823 " somethingElse();\n" 3824 "});", 3825 format("call(parameter, {\n" 3826 " something();\n" 3827 " // Comment too looooooooooong.\n" 3828 " somethingElse();\n" 3829 "});", 3830 getLLVMStyleWithColumns(29))); 3831 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3832 EXPECT_EQ("DEBUG({ // comment\n" 3833 " int i;\n" 3834 "});", 3835 format("DEBUG({ // comment\n" 3836 "int i;\n" 3837 "});")); 3838 EXPECT_EQ("DEBUG({\n" 3839 " int i;\n" 3840 "\n" 3841 " // comment\n" 3842 " int j;\n" 3843 "});", 3844 format("DEBUG({\n" 3845 " int i;\n" 3846 "\n" 3847 " // comment\n" 3848 " int j;\n" 3849 "});")); 3850 3851 verifyFormat("DEBUG({\n" 3852 " if (a)\n" 3853 " return;\n" 3854 "});"); 3855 verifyGoogleFormat("DEBUG({\n" 3856 " if (a) return;\n" 3857 "});"); 3858 FormatStyle Style = getGoogleStyle(); 3859 Style.ColumnLimit = 45; 3860 verifyFormat("Debug(\n" 3861 " aaaaa,\n" 3862 " {\n" 3863 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3864 " },\n" 3865 " a);", 3866 Style); 3867 3868 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3869 3870 verifyNoCrash("^{v^{a}}"); 3871 } 3872 3873 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3874 EXPECT_EQ("#define MACRO() \\\n" 3875 " Debug(aaa, /* force line break */ \\\n" 3876 " { \\\n" 3877 " int i; \\\n" 3878 " int j; \\\n" 3879 " })", 3880 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3881 " { int i; int j; })", 3882 getGoogleStyle())); 3883 3884 EXPECT_EQ("#define A \\\n" 3885 " [] { \\\n" 3886 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3887 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3888 " }", 3889 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3890 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3891 getGoogleStyle())); 3892 } 3893 3894 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3895 EXPECT_EQ("{}", format("{}")); 3896 verifyFormat("enum E {};"); 3897 verifyFormat("enum E {}"); 3898 FormatStyle Style = getLLVMStyle(); 3899 Style.SpaceInEmptyBlock = true; 3900 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 3901 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 3902 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 3903 } 3904 3905 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 3906 FormatStyle Style = getLLVMStyle(); 3907 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 3908 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 3909 verifyFormat("FOO_BEGIN\n" 3910 " FOO_ENTRY\n" 3911 "FOO_END", 3912 Style); 3913 verifyFormat("FOO_BEGIN\n" 3914 " NESTED_FOO_BEGIN\n" 3915 " NESTED_FOO_ENTRY\n" 3916 " NESTED_FOO_END\n" 3917 "FOO_END", 3918 Style); 3919 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 3920 " int x;\n" 3921 " x = 1;\n" 3922 "FOO_END(Baz)", 3923 Style); 3924 } 3925 3926 //===----------------------------------------------------------------------===// 3927 // Line break tests. 3928 //===----------------------------------------------------------------------===// 3929 3930 TEST_F(FormatTest, PreventConfusingIndents) { 3931 verifyFormat( 3932 "void f() {\n" 3933 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 3934 " parameter, parameter, parameter)),\n" 3935 " SecondLongCall(parameter));\n" 3936 "}"); 3937 verifyFormat( 3938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3939 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3940 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3941 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 3942 verifyFormat( 3943 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3944 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 3945 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 3946 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 3947 verifyFormat( 3948 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 3949 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 3950 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 3951 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 3952 verifyFormat("int a = bbbb && ccc &&\n" 3953 " fffff(\n" 3954 "#define A Just forcing a new line\n" 3955 " ddd);"); 3956 } 3957 3958 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 3959 verifyFormat( 3960 "bool aaaaaaa =\n" 3961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 3962 " bbbbbbbb();"); 3963 verifyFormat( 3964 "bool aaaaaaa =\n" 3965 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 3966 " bbbbbbbb();"); 3967 3968 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 3970 " ccccccccc == ddddddddddd;"); 3971 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 3973 " ccccccccc == ddddddddddd;"); 3974 verifyFormat( 3975 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 3976 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 3977 " ccccccccc == ddddddddddd;"); 3978 3979 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3980 " aaaaaa) &&\n" 3981 " bbbbbb && cccccc;"); 3982 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3983 " aaaaaa) >>\n" 3984 " bbbbbb;"); 3985 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 3986 " SourceMgr.getSpellingColumnNumber(\n" 3987 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 3988 " 1);"); 3989 3990 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3991 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 3992 " cccccc) {\n}"); 3993 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3994 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3995 " cccccc) {\n}"); 3996 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3997 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3998 " cccccc) {\n}"); 3999 verifyFormat("b = a &&\n" 4000 " // Comment\n" 4001 " b.c && d;"); 4002 4003 // If the LHS of a comparison is not a binary expression itself, the 4004 // additional linebreak confuses many people. 4005 verifyFormat( 4006 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 4008 "}"); 4009 verifyFormat( 4010 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4011 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4012 "}"); 4013 verifyFormat( 4014 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 4015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4016 "}"); 4017 verifyFormat( 4018 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 4020 "}"); 4021 // Even explicit parentheses stress the precedence enough to make the 4022 // additional break unnecessary. 4023 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4025 "}"); 4026 // This cases is borderline, but with the indentation it is still readable. 4027 verifyFormat( 4028 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4029 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4031 "}", 4032 getLLVMStyleWithColumns(75)); 4033 4034 // If the LHS is a binary expression, we should still use the additional break 4035 // as otherwise the formatting hides the operator precedence. 4036 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4038 " 5) {\n" 4039 "}"); 4040 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4042 " 5) {\n" 4043 "}"); 4044 4045 FormatStyle OnePerLine = getLLVMStyle(); 4046 OnePerLine.BinPackParameters = false; 4047 verifyFormat( 4048 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4051 OnePerLine); 4052 4053 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4054 " .aaa(aaaaaaaaaaaaa) *\n" 4055 " aaaaaaa +\n" 4056 " aaaaaaa;", 4057 getLLVMStyleWithColumns(40)); 4058 } 4059 4060 TEST_F(FormatTest, ExpressionIndentation) { 4061 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4065 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4066 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4069 " ccccccccccccccccccccccccccccccccccccccccc;"); 4070 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4073 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4074 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4075 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4076 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4077 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4078 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4079 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4081 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4082 verifyFormat("if () {\n" 4083 "} else if (aaaaa && bbbbb > // break\n" 4084 " ccccc) {\n" 4085 "}"); 4086 verifyFormat("if () {\n" 4087 "} else if constexpr (aaaaa && bbbbb > // break\n" 4088 " ccccc) {\n" 4089 "}"); 4090 verifyFormat("if () {\n" 4091 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4092 " ccccc) {\n" 4093 "}"); 4094 verifyFormat("if () {\n" 4095 "} else if (aaaaa &&\n" 4096 " bbbbb > // break\n" 4097 " ccccc &&\n" 4098 " ddddd) {\n" 4099 "}"); 4100 4101 // Presence of a trailing comment used to change indentation of b. 4102 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4103 " b;\n" 4104 "return aaaaaaaaaaaaaaaaaaa +\n" 4105 " b; //", 4106 getLLVMStyleWithColumns(30)); 4107 } 4108 4109 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4110 // Not sure what the best system is here. Like this, the LHS can be found 4111 // immediately above an operator (everything with the same or a higher 4112 // indent). The RHS is aligned right of the operator and so compasses 4113 // everything until something with the same indent as the operator is found. 4114 // FIXME: Is this a good system? 4115 FormatStyle Style = getLLVMStyle(); 4116 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4117 verifyFormat( 4118 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4119 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4120 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4121 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4122 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4123 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4124 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4125 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4126 " > ccccccccccccccccccccccccccccccccccccccccc;", 4127 Style); 4128 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4129 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4130 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4131 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4132 Style); 4133 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4134 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4135 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4136 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4137 Style); 4138 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4139 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4140 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4141 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4142 Style); 4143 verifyFormat("if () {\n" 4144 "} else if (aaaaa\n" 4145 " && bbbbb // break\n" 4146 " > ccccc) {\n" 4147 "}", 4148 Style); 4149 verifyFormat("return (a)\n" 4150 " // comment\n" 4151 " + b;", 4152 Style); 4153 verifyFormat( 4154 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4155 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4156 " + cc;", 4157 Style); 4158 4159 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4160 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4161 Style); 4162 4163 // Forced by comments. 4164 verifyFormat( 4165 "unsigned ContentSize =\n" 4166 " sizeof(int16_t) // DWARF ARange version number\n" 4167 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4168 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4169 " + sizeof(int8_t); // Segment Size (in bytes)"); 4170 4171 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4172 " == boost::fusion::at_c<1>(iiii).second;", 4173 Style); 4174 4175 Style.ColumnLimit = 60; 4176 verifyFormat("zzzzzzzzzz\n" 4177 " = bbbbbbbbbbbbbbbbb\n" 4178 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4179 Style); 4180 4181 Style.ColumnLimit = 80; 4182 Style.IndentWidth = 4; 4183 Style.TabWidth = 4; 4184 Style.UseTab = FormatStyle::UT_Always; 4185 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4186 Style.AlignOperands = false; 4187 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4188 "\t&& (someOtherLongishConditionPart1\n" 4189 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4190 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4191 "(someOtherLongishConditionPart1 || " 4192 "someOtherEvenLongerNestedConditionPart2);", 4193 Style)); 4194 } 4195 4196 TEST_F(FormatTest, EnforcedOperatorWraps) { 4197 // Here we'd like to wrap after the || operators, but a comment is forcing an 4198 // earlier wrap. 4199 verifyFormat("bool x = aaaaa //\n" 4200 " || bbbbb\n" 4201 " //\n" 4202 " || cccc;"); 4203 } 4204 4205 TEST_F(FormatTest, NoOperandAlignment) { 4206 FormatStyle Style = getLLVMStyle(); 4207 Style.AlignOperands = false; 4208 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4209 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4211 Style); 4212 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4213 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4214 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4215 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4216 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4217 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4218 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4219 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4220 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4221 " > ccccccccccccccccccccccccccccccccccccccccc;", 4222 Style); 4223 4224 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4225 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4226 " + cc;", 4227 Style); 4228 verifyFormat("int a = aa\n" 4229 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4230 " * cccccccccccccccccccccccccccccccccccc;\n", 4231 Style); 4232 4233 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4234 verifyFormat("return (a > b\n" 4235 " // comment1\n" 4236 " // comment2\n" 4237 " || c);", 4238 Style); 4239 } 4240 4241 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4242 FormatStyle Style = getLLVMStyle(); 4243 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4244 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4246 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4247 Style); 4248 } 4249 4250 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4251 FormatStyle Style = getLLVMStyle(); 4252 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4253 Style.BinPackArguments = false; 4254 Style.ColumnLimit = 40; 4255 verifyFormat("void test() {\n" 4256 " someFunction(\n" 4257 " this + argument + is + quite\n" 4258 " + long + so + it + gets + wrapped\n" 4259 " + but + remains + bin - packed);\n" 4260 "}", 4261 Style); 4262 verifyFormat("void test() {\n" 4263 " someFunction(arg1,\n" 4264 " this + argument + is\n" 4265 " + quite + long + so\n" 4266 " + it + gets + wrapped\n" 4267 " + but + remains + bin\n" 4268 " - packed,\n" 4269 " arg3);\n" 4270 "}", 4271 Style); 4272 verifyFormat("void test() {\n" 4273 " someFunction(\n" 4274 " arg1,\n" 4275 " this + argument + has\n" 4276 " + anotherFunc(nested,\n" 4277 " calls + whose\n" 4278 " + arguments\n" 4279 " + are + also\n" 4280 " + wrapped,\n" 4281 " in + addition)\n" 4282 " + to + being + bin - packed,\n" 4283 " arg3);\n" 4284 "}", 4285 Style); 4286 4287 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4288 verifyFormat("void test() {\n" 4289 " someFunction(\n" 4290 " arg1,\n" 4291 " this + argument + has +\n" 4292 " anotherFunc(nested,\n" 4293 " calls + whose +\n" 4294 " arguments +\n" 4295 " are + also +\n" 4296 " wrapped,\n" 4297 " in + addition) +\n" 4298 " to + being + bin - packed,\n" 4299 " arg3);\n" 4300 "}", 4301 Style); 4302 } 4303 4304 TEST_F(FormatTest, ConstructorInitializers) { 4305 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4306 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4307 getLLVMStyleWithColumns(45)); 4308 verifyFormat("Constructor()\n" 4309 " : Inttializer(FitsOnTheLine) {}", 4310 getLLVMStyleWithColumns(44)); 4311 verifyFormat("Constructor()\n" 4312 " : Inttializer(FitsOnTheLine) {}", 4313 getLLVMStyleWithColumns(43)); 4314 4315 verifyFormat("template <typename T>\n" 4316 "Constructor() : Initializer(FitsOnTheLine) {}", 4317 getLLVMStyleWithColumns(45)); 4318 4319 verifyFormat( 4320 "SomeClass::Constructor()\n" 4321 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4322 4323 verifyFormat( 4324 "SomeClass::Constructor()\n" 4325 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4326 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4327 verifyFormat( 4328 "SomeClass::Constructor()\n" 4329 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4330 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4331 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4332 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4333 " : aaaaaaaaaa(aaaaaa) {}"); 4334 4335 verifyFormat("Constructor()\n" 4336 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4337 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4338 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4339 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4340 4341 verifyFormat("Constructor()\n" 4342 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4344 4345 verifyFormat("Constructor(int Parameter = 0)\n" 4346 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4347 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4348 verifyFormat("Constructor()\n" 4349 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4350 "}", 4351 getLLVMStyleWithColumns(60)); 4352 verifyFormat("Constructor()\n" 4353 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4354 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4355 4356 // Here a line could be saved by splitting the second initializer onto two 4357 // lines, but that is not desirable. 4358 verifyFormat("Constructor()\n" 4359 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4360 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4361 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4362 4363 FormatStyle OnePerLine = getLLVMStyle(); 4364 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4365 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4366 verifyFormat("SomeClass::Constructor()\n" 4367 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4368 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4369 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4370 OnePerLine); 4371 verifyFormat("SomeClass::Constructor()\n" 4372 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4373 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4374 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4375 OnePerLine); 4376 verifyFormat("MyClass::MyClass(int var)\n" 4377 " : some_var_(var), // 4 space indent\n" 4378 " some_other_var_(var + 1) { // lined up\n" 4379 "}", 4380 OnePerLine); 4381 verifyFormat("Constructor()\n" 4382 " : aaaaa(aaaaaa),\n" 4383 " aaaaa(aaaaaa),\n" 4384 " aaaaa(aaaaaa),\n" 4385 " aaaaa(aaaaaa),\n" 4386 " aaaaa(aaaaaa) {}", 4387 OnePerLine); 4388 verifyFormat("Constructor()\n" 4389 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4390 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4391 OnePerLine); 4392 OnePerLine.BinPackParameters = false; 4393 verifyFormat( 4394 "Constructor()\n" 4395 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4396 " aaaaaaaaaaa().aaa(),\n" 4397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4398 OnePerLine); 4399 OnePerLine.ColumnLimit = 60; 4400 verifyFormat("Constructor()\n" 4401 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4402 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4403 OnePerLine); 4404 4405 EXPECT_EQ("Constructor()\n" 4406 " : // Comment forcing unwanted break.\n" 4407 " aaaa(aaaa) {}", 4408 format("Constructor() :\n" 4409 " // Comment forcing unwanted break.\n" 4410 " aaaa(aaaa) {}")); 4411 } 4412 4413 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4414 FormatStyle Style = getLLVMStyle(); 4415 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4416 Style.ColumnLimit = 60; 4417 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4418 Style.AllowAllConstructorInitializersOnNextLine = true; 4419 Style.BinPackParameters = false; 4420 4421 for (int i = 0; i < 4; ++i) { 4422 // Test all combinations of parameters that should not have an effect. 4423 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4424 Style.AllowAllArgumentsOnNextLine = i & 2; 4425 4426 Style.AllowAllConstructorInitializersOnNextLine = true; 4427 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4428 verifyFormat("Constructor()\n" 4429 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4430 Style); 4431 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4432 4433 Style.AllowAllConstructorInitializersOnNextLine = false; 4434 verifyFormat("Constructor()\n" 4435 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4436 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4437 Style); 4438 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4439 4440 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4441 Style.AllowAllConstructorInitializersOnNextLine = true; 4442 verifyFormat("Constructor()\n" 4443 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4444 Style); 4445 4446 Style.AllowAllConstructorInitializersOnNextLine = false; 4447 verifyFormat("Constructor()\n" 4448 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4449 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4450 Style); 4451 4452 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4453 Style.AllowAllConstructorInitializersOnNextLine = true; 4454 verifyFormat("Constructor() :\n" 4455 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4456 Style); 4457 4458 Style.AllowAllConstructorInitializersOnNextLine = false; 4459 verifyFormat("Constructor() :\n" 4460 " aaaaaaaaaaaaaaaaaa(a),\n" 4461 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4462 Style); 4463 } 4464 4465 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4466 // AllowAllConstructorInitializersOnNextLine in all 4467 // BreakConstructorInitializers modes 4468 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4469 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4470 Style.AllowAllConstructorInitializersOnNextLine = false; 4471 verifyFormat("SomeClassWithALongName::Constructor(\n" 4472 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4473 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4474 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4475 Style); 4476 4477 Style.AllowAllConstructorInitializersOnNextLine = true; 4478 verifyFormat("SomeClassWithALongName::Constructor(\n" 4479 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4480 " int bbbbbbbbbbbbb,\n" 4481 " int cccccccccccccccc)\n" 4482 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4483 Style); 4484 4485 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4486 Style.AllowAllConstructorInitializersOnNextLine = false; 4487 verifyFormat("SomeClassWithALongName::Constructor(\n" 4488 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4489 " int bbbbbbbbbbbbb)\n" 4490 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4491 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4492 Style); 4493 4494 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4495 4496 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4497 verifyFormat("SomeClassWithALongName::Constructor(\n" 4498 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4499 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4500 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4501 Style); 4502 4503 Style.AllowAllConstructorInitializersOnNextLine = true; 4504 verifyFormat("SomeClassWithALongName::Constructor(\n" 4505 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4506 " int bbbbbbbbbbbbb,\n" 4507 " int cccccccccccccccc)\n" 4508 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4509 Style); 4510 4511 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4512 Style.AllowAllConstructorInitializersOnNextLine = false; 4513 verifyFormat("SomeClassWithALongName::Constructor(\n" 4514 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4515 " int bbbbbbbbbbbbb)\n" 4516 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4517 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4518 Style); 4519 4520 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4521 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4522 verifyFormat("SomeClassWithALongName::Constructor(\n" 4523 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4524 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4525 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4526 Style); 4527 4528 Style.AllowAllConstructorInitializersOnNextLine = true; 4529 verifyFormat("SomeClassWithALongName::Constructor(\n" 4530 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4531 " int bbbbbbbbbbbbb,\n" 4532 " int cccccccccccccccc) :\n" 4533 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4534 Style); 4535 4536 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4537 Style.AllowAllConstructorInitializersOnNextLine = false; 4538 verifyFormat("SomeClassWithALongName::Constructor(\n" 4539 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4540 " int bbbbbbbbbbbbb) :\n" 4541 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4542 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4543 Style); 4544 } 4545 4546 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4547 FormatStyle Style = getLLVMStyle(); 4548 Style.ColumnLimit = 60; 4549 Style.BinPackArguments = false; 4550 for (int i = 0; i < 4; ++i) { 4551 // Test all combinations of parameters that should not have an effect. 4552 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4553 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4554 4555 Style.AllowAllArgumentsOnNextLine = true; 4556 verifyFormat("void foo() {\n" 4557 " FunctionCallWithReallyLongName(\n" 4558 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4559 "}", 4560 Style); 4561 Style.AllowAllArgumentsOnNextLine = false; 4562 verifyFormat("void foo() {\n" 4563 " FunctionCallWithReallyLongName(\n" 4564 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4565 " bbbbbbbbbbbb);\n" 4566 "}", 4567 Style); 4568 4569 Style.AllowAllArgumentsOnNextLine = true; 4570 verifyFormat("void foo() {\n" 4571 " auto VariableWithReallyLongName = {\n" 4572 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4573 "}", 4574 Style); 4575 Style.AllowAllArgumentsOnNextLine = false; 4576 verifyFormat("void foo() {\n" 4577 " auto VariableWithReallyLongName = {\n" 4578 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4579 " bbbbbbbbbbbb};\n" 4580 "}", 4581 Style); 4582 } 4583 4584 // This parameter should not affect declarations. 4585 Style.BinPackParameters = false; 4586 Style.AllowAllArgumentsOnNextLine = false; 4587 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4588 verifyFormat("void FunctionCallWithReallyLongName(\n" 4589 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4590 Style); 4591 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4592 verifyFormat("void FunctionCallWithReallyLongName(\n" 4593 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4594 " int bbbbbbbbbbbb);", 4595 Style); 4596 } 4597 4598 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4599 FormatStyle Style = getLLVMStyle(); 4600 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4601 4602 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4603 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4604 getStyleWithColumns(Style, 45)); 4605 verifyFormat("Constructor() :\n" 4606 " Initializer(FitsOnTheLine) {}", 4607 getStyleWithColumns(Style, 44)); 4608 verifyFormat("Constructor() :\n" 4609 " Initializer(FitsOnTheLine) {}", 4610 getStyleWithColumns(Style, 43)); 4611 4612 verifyFormat("template <typename T>\n" 4613 "Constructor() : Initializer(FitsOnTheLine) {}", 4614 getStyleWithColumns(Style, 50)); 4615 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4616 verifyFormat( 4617 "SomeClass::Constructor() :\n" 4618 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4619 Style); 4620 4621 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4622 verifyFormat( 4623 "SomeClass::Constructor() :\n" 4624 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4625 Style); 4626 4627 verifyFormat( 4628 "SomeClass::Constructor() :\n" 4629 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4630 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4631 Style); 4632 verifyFormat( 4633 "SomeClass::Constructor() :\n" 4634 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4635 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4636 Style); 4637 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4638 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4639 " aaaaaaaaaa(aaaaaa) {}", 4640 Style); 4641 4642 verifyFormat("Constructor() :\n" 4643 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4644 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4645 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4646 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4647 Style); 4648 4649 verifyFormat("Constructor() :\n" 4650 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4651 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4652 Style); 4653 4654 verifyFormat("Constructor(int Parameter = 0) :\n" 4655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4656 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4657 Style); 4658 verifyFormat("Constructor() :\n" 4659 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4660 "}", 4661 getStyleWithColumns(Style, 60)); 4662 verifyFormat("Constructor() :\n" 4663 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4664 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4665 Style); 4666 4667 // Here a line could be saved by splitting the second initializer onto two 4668 // lines, but that is not desirable. 4669 verifyFormat("Constructor() :\n" 4670 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4671 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4672 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4673 Style); 4674 4675 FormatStyle OnePerLine = Style; 4676 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4677 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4678 verifyFormat("SomeClass::Constructor() :\n" 4679 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4680 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4681 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4682 OnePerLine); 4683 verifyFormat("SomeClass::Constructor() :\n" 4684 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4685 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4686 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4687 OnePerLine); 4688 verifyFormat("MyClass::MyClass(int var) :\n" 4689 " some_var_(var), // 4 space indent\n" 4690 " some_other_var_(var + 1) { // lined up\n" 4691 "}", 4692 OnePerLine); 4693 verifyFormat("Constructor() :\n" 4694 " aaaaa(aaaaaa),\n" 4695 " aaaaa(aaaaaa),\n" 4696 " aaaaa(aaaaaa),\n" 4697 " aaaaa(aaaaaa),\n" 4698 " aaaaa(aaaaaa) {}", 4699 OnePerLine); 4700 verifyFormat("Constructor() :\n" 4701 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4702 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4703 OnePerLine); 4704 OnePerLine.BinPackParameters = false; 4705 verifyFormat("Constructor() :\n" 4706 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4707 " aaaaaaaaaaa().aaa(),\n" 4708 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4709 OnePerLine); 4710 OnePerLine.ColumnLimit = 60; 4711 verifyFormat("Constructor() :\n" 4712 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4713 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4714 OnePerLine); 4715 4716 EXPECT_EQ("Constructor() :\n" 4717 " // Comment forcing unwanted break.\n" 4718 " aaaa(aaaa) {}", 4719 format("Constructor() :\n" 4720 " // Comment forcing unwanted break.\n" 4721 " aaaa(aaaa) {}", 4722 Style)); 4723 4724 Style.ColumnLimit = 0; 4725 verifyFormat("SomeClass::Constructor() :\n" 4726 " a(a) {}", 4727 Style); 4728 verifyFormat("SomeClass::Constructor() noexcept :\n" 4729 " a(a) {}", 4730 Style); 4731 verifyFormat("SomeClass::Constructor() :\n" 4732 " a(a), b(b), c(c) {}", 4733 Style); 4734 verifyFormat("SomeClass::Constructor() :\n" 4735 " a(a) {\n" 4736 " foo();\n" 4737 " bar();\n" 4738 "}", 4739 Style); 4740 4741 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4742 verifyFormat("SomeClass::Constructor() :\n" 4743 " a(a), b(b), c(c) {\n" 4744 "}", 4745 Style); 4746 verifyFormat("SomeClass::Constructor() :\n" 4747 " a(a) {\n" 4748 "}", 4749 Style); 4750 4751 Style.ColumnLimit = 80; 4752 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4753 Style.ConstructorInitializerIndentWidth = 2; 4754 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 4755 verifyFormat("SomeClass::Constructor() :\n" 4756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4757 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4758 Style); 4759 4760 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 4761 // well 4762 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4763 verifyFormat( 4764 "class SomeClass\n" 4765 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4766 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4767 Style); 4768 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4769 verifyFormat( 4770 "class SomeClass\n" 4771 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4772 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4773 Style); 4774 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4775 verifyFormat( 4776 "class SomeClass :\n" 4777 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4778 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4779 Style); 4780 } 4781 4782 #ifndef EXPENSIVE_CHECKS 4783 // Expensive checks enables libstdc++ checking which includes validating the 4784 // state of ranges used in std::priority_queue - this blows out the 4785 // runtime/scalability of the function and makes this test unacceptably slow. 4786 TEST_F(FormatTest, MemoizationTests) { 4787 // This breaks if the memoization lookup does not take \c Indent and 4788 // \c LastSpace into account. 4789 verifyFormat( 4790 "extern CFRunLoopTimerRef\n" 4791 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4792 " CFTimeInterval interval, CFOptionFlags flags,\n" 4793 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4794 " CFRunLoopTimerContext *context) {}"); 4795 4796 // Deep nesting somewhat works around our memoization. 4797 verifyFormat( 4798 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4799 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4800 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4801 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4802 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4803 getLLVMStyleWithColumns(65)); 4804 verifyFormat( 4805 "aaaaa(\n" 4806 " aaaaa,\n" 4807 " aaaaa(\n" 4808 " aaaaa,\n" 4809 " aaaaa(\n" 4810 " aaaaa,\n" 4811 " aaaaa(\n" 4812 " aaaaa,\n" 4813 " aaaaa(\n" 4814 " aaaaa,\n" 4815 " aaaaa(\n" 4816 " aaaaa,\n" 4817 " aaaaa(\n" 4818 " aaaaa,\n" 4819 " aaaaa(\n" 4820 " aaaaa,\n" 4821 " aaaaa(\n" 4822 " aaaaa,\n" 4823 " aaaaa(\n" 4824 " aaaaa,\n" 4825 " aaaaa(\n" 4826 " aaaaa,\n" 4827 " aaaaa(\n" 4828 " aaaaa,\n" 4829 " aaaaa))))))))))));", 4830 getLLVMStyleWithColumns(65)); 4831 verifyFormat( 4832 "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" 4833 " a),\n" 4834 " a),\n" 4835 " a),\n" 4836 " a),\n" 4837 " a),\n" 4838 " a),\n" 4839 " a),\n" 4840 " a),\n" 4841 " a),\n" 4842 " a),\n" 4843 " a),\n" 4844 " a),\n" 4845 " a),\n" 4846 " a),\n" 4847 " a),\n" 4848 " a),\n" 4849 " a)", 4850 getLLVMStyleWithColumns(65)); 4851 4852 // This test takes VERY long when memoization is broken. 4853 FormatStyle OnePerLine = getLLVMStyle(); 4854 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4855 OnePerLine.BinPackParameters = false; 4856 std::string input = "Constructor()\n" 4857 " : aaaa(a,\n"; 4858 for (unsigned i = 0, e = 80; i != e; ++i) { 4859 input += " a,\n"; 4860 } 4861 input += " a) {}"; 4862 verifyFormat(input, OnePerLine); 4863 } 4864 #endif 4865 4866 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4867 verifyFormat( 4868 "void f() {\n" 4869 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4870 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4871 " f();\n" 4872 "}"); 4873 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4874 " Intervals[i - 1].getRange().getLast()) {\n}"); 4875 } 4876 4877 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4878 // Principially, we break function declarations in a certain order: 4879 // 1) break amongst arguments. 4880 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 4881 " Cccccccccccccc cccccccccccccc);"); 4882 verifyFormat("template <class TemplateIt>\n" 4883 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 4884 " TemplateIt *stop) {}"); 4885 4886 // 2) break after return type. 4887 verifyFormat( 4888 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4889 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 4890 getGoogleStyle()); 4891 4892 // 3) break after (. 4893 verifyFormat( 4894 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 4895 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 4896 getGoogleStyle()); 4897 4898 // 4) break before after nested name specifiers. 4899 verifyFormat( 4900 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4901 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 4902 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 4903 getGoogleStyle()); 4904 4905 // However, there are exceptions, if a sufficient amount of lines can be 4906 // saved. 4907 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 4908 // more adjusting. 4909 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4910 " Cccccccccccccc cccccccccc,\n" 4911 " Cccccccccccccc cccccccccc,\n" 4912 " Cccccccccccccc cccccccccc,\n" 4913 " Cccccccccccccc cccccccccc);"); 4914 verifyFormat( 4915 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4916 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4917 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4918 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 4919 getGoogleStyle()); 4920 verifyFormat( 4921 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4922 " Cccccccccccccc cccccccccc,\n" 4923 " Cccccccccccccc cccccccccc,\n" 4924 " Cccccccccccccc cccccccccc,\n" 4925 " Cccccccccccccc cccccccccc,\n" 4926 " Cccccccccccccc cccccccccc,\n" 4927 " Cccccccccccccc cccccccccc);"); 4928 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4929 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4930 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4931 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4932 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 4933 4934 // Break after multi-line parameters. 4935 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4936 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4937 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4938 " bbbb bbbb);"); 4939 verifyFormat("void SomeLoooooooooooongFunction(\n" 4940 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 4941 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4942 " int bbbbbbbbbbbbb);"); 4943 4944 // Treat overloaded operators like other functions. 4945 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4946 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 4947 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4948 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 4949 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4950 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 4951 verifyGoogleFormat( 4952 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 4953 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4954 verifyGoogleFormat( 4955 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 4956 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4957 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4958 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4959 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 4960 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4961 verifyGoogleFormat( 4962 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 4963 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4964 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 4965 verifyGoogleFormat("template <typename T>\n" 4966 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4967 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 4968 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 4969 4970 FormatStyle Style = getLLVMStyle(); 4971 Style.PointerAlignment = FormatStyle::PAS_Left; 4972 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4973 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 4974 Style); 4975 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 4976 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4977 Style); 4978 } 4979 4980 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 4981 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 4982 // Prefer keeping `::` followed by `operator` together. 4983 EXPECT_EQ("const aaaa::bbbbbbb &\n" 4984 "ccccccccc::operator++() {\n" 4985 " stuff();\n" 4986 "}", 4987 format("const aaaa::bbbbbbb\n" 4988 "&ccccccccc::operator++() { stuff(); }", 4989 getLLVMStyleWithColumns(40))); 4990 } 4991 4992 TEST_F(FormatTest, TrailingReturnType) { 4993 verifyFormat("auto foo() -> int;\n"); 4994 // correct trailing return type spacing 4995 verifyFormat("auto operator->() -> int;\n"); 4996 verifyFormat("auto operator++(int) -> int;\n"); 4997 4998 verifyFormat("struct S {\n" 4999 " auto bar() const -> int;\n" 5000 "};"); 5001 verifyFormat("template <size_t Order, typename T>\n" 5002 "auto load_img(const std::string &filename)\n" 5003 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5004 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5005 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5006 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5007 verifyFormat("template <typename T>\n" 5008 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5009 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5010 5011 // Not trailing return types. 5012 verifyFormat("void f() { auto a = b->c(); }"); 5013 } 5014 5015 TEST_F(FormatTest, DeductionGuides) { 5016 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5017 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5018 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5019 verifyFormat( 5020 "template <class... T>\n" 5021 "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5022 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5023 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5024 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5025 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5026 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5027 verifyFormat("template <class T> x() -> x<1>;"); 5028 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5029 5030 // Ensure not deduction guides. 5031 verifyFormat("c()->f<int>();"); 5032 verifyFormat("x()->foo<1>;"); 5033 verifyFormat("x = p->foo<3>();"); 5034 verifyFormat("x()->x<1>();"); 5035 verifyFormat("x()->x<1>;"); 5036 } 5037 5038 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5039 // Avoid breaking before trailing 'const' or other trailing annotations, if 5040 // they are not function-like. 5041 FormatStyle Style = getGoogleStyle(); 5042 Style.ColumnLimit = 47; 5043 verifyFormat("void someLongFunction(\n" 5044 " int someLoooooooooooooongParameter) const {\n}", 5045 getLLVMStyleWithColumns(47)); 5046 verifyFormat("LoooooongReturnType\n" 5047 "someLoooooooongFunction() const {}", 5048 getLLVMStyleWithColumns(47)); 5049 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5050 " const {}", 5051 Style); 5052 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5053 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5054 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5055 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5056 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5057 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5058 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5059 " aaaaaaaaaaa aaaaa) const override;"); 5060 verifyGoogleFormat( 5061 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5062 " const override;"); 5063 5064 // Even if the first parameter has to be wrapped. 5065 verifyFormat("void someLongFunction(\n" 5066 " int someLongParameter) const {}", 5067 getLLVMStyleWithColumns(46)); 5068 verifyFormat("void someLongFunction(\n" 5069 " int someLongParameter) const {}", 5070 Style); 5071 verifyFormat("void someLongFunction(\n" 5072 " int someLongParameter) override {}", 5073 Style); 5074 verifyFormat("void someLongFunction(\n" 5075 " int someLongParameter) OVERRIDE {}", 5076 Style); 5077 verifyFormat("void someLongFunction(\n" 5078 " int someLongParameter) final {}", 5079 Style); 5080 verifyFormat("void someLongFunction(\n" 5081 " int someLongParameter) FINAL {}", 5082 Style); 5083 verifyFormat("void someLongFunction(\n" 5084 " int parameter) const override {}", 5085 Style); 5086 5087 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5088 verifyFormat("void someLongFunction(\n" 5089 " int someLongParameter) const\n" 5090 "{\n" 5091 "}", 5092 Style); 5093 5094 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5095 verifyFormat("void someLongFunction(\n" 5096 " int someLongParameter) const\n" 5097 " {\n" 5098 " }", 5099 Style); 5100 5101 // Unless these are unknown annotations. 5102 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5103 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5104 " LONG_AND_UGLY_ANNOTATION;"); 5105 5106 // Breaking before function-like trailing annotations is fine to keep them 5107 // close to their arguments. 5108 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5109 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5110 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5111 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5112 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5113 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5114 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5115 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5116 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5117 5118 verifyFormat( 5119 "void aaaaaaaaaaaaaaaaaa()\n" 5120 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5121 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5122 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5123 " __attribute__((unused));"); 5124 verifyGoogleFormat( 5125 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5126 " GUARDED_BY(aaaaaaaaaaaa);"); 5127 verifyGoogleFormat( 5128 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5129 " GUARDED_BY(aaaaaaaaaaaa);"); 5130 verifyGoogleFormat( 5131 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5132 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5133 verifyGoogleFormat( 5134 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5135 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5136 } 5137 5138 TEST_F(FormatTest, FunctionAnnotations) { 5139 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5140 "int OldFunction(const string ¶meter) {}"); 5141 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5142 "string OldFunction(const string ¶meter) {}"); 5143 verifyFormat("template <typename T>\n" 5144 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5145 "string OldFunction(const string ¶meter) {}"); 5146 5147 // Not function annotations. 5148 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5149 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5150 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5151 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5152 verifyFormat("MACRO(abc).function() // wrap\n" 5153 " << abc;"); 5154 verifyFormat("MACRO(abc)->function() // wrap\n" 5155 " << abc;"); 5156 verifyFormat("MACRO(abc)::function() // wrap\n" 5157 " << abc;"); 5158 } 5159 5160 TEST_F(FormatTest, BreaksDesireably) { 5161 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5162 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5163 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5164 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5165 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5166 "}"); 5167 5168 verifyFormat( 5169 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5171 5172 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5173 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5175 5176 verifyFormat( 5177 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5178 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5179 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5180 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5181 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5182 5183 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5184 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5185 5186 verifyFormat( 5187 "void f() {\n" 5188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5189 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5190 "}"); 5191 verifyFormat( 5192 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5193 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5194 verifyFormat( 5195 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5197 verifyFormat( 5198 "aaaaaa(aaa,\n" 5199 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5201 " aaaa);"); 5202 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5203 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5204 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5205 5206 // Indent consistently independent of call expression and unary operator. 5207 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5208 " dddddddddddddddddddddddddddddd));"); 5209 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5210 " dddddddddddddddddddddddddddddd));"); 5211 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5212 " dddddddddddddddddddddddddddddd));"); 5213 5214 // This test case breaks on an incorrect memoization, i.e. an optimization not 5215 // taking into account the StopAt value. 5216 verifyFormat( 5217 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5218 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5219 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5220 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5221 5222 verifyFormat("{\n {\n {\n" 5223 " Annotation.SpaceRequiredBefore =\n" 5224 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5225 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5226 " }\n }\n}"); 5227 5228 // Break on an outer level if there was a break on an inner level. 5229 EXPECT_EQ("f(g(h(a, // comment\n" 5230 " b, c),\n" 5231 " d, e),\n" 5232 " x, y);", 5233 format("f(g(h(a, // comment\n" 5234 " b, c), d, e), x, y);")); 5235 5236 // Prefer breaking similar line breaks. 5237 verifyFormat( 5238 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5239 " NSTrackingMouseEnteredAndExited |\n" 5240 " NSTrackingActiveAlways;"); 5241 } 5242 5243 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5244 FormatStyle NoBinPacking = getGoogleStyle(); 5245 NoBinPacking.BinPackParameters = false; 5246 NoBinPacking.BinPackArguments = true; 5247 verifyFormat("void f() {\n" 5248 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5250 "}", 5251 NoBinPacking); 5252 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5253 " int aaaaaaaaaaaaaaaaaaaa,\n" 5254 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5255 NoBinPacking); 5256 5257 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5258 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5259 " vector<int> bbbbbbbbbbbbbbb);", 5260 NoBinPacking); 5261 // FIXME: This behavior difference is probably not wanted. However, currently 5262 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5263 // template arguments from BreakBeforeParameter being set because of the 5264 // one-per-line formatting. 5265 verifyFormat( 5266 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5267 " aaaaaaaaaa> aaaaaaaaaa);", 5268 NoBinPacking); 5269 verifyFormat( 5270 "void fffffffffff(\n" 5271 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5272 " aaaaaaaaaa);"); 5273 } 5274 5275 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5276 FormatStyle NoBinPacking = getGoogleStyle(); 5277 NoBinPacking.BinPackParameters = false; 5278 NoBinPacking.BinPackArguments = false; 5279 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5280 " aaaaaaaaaaaaaaaaaaaa,\n" 5281 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5282 NoBinPacking); 5283 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5284 " aaaaaaaaaaaaa,\n" 5285 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5286 NoBinPacking); 5287 verifyFormat( 5288 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5289 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5291 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5292 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5293 NoBinPacking); 5294 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5295 " .aaaaaaaaaaaaaaaaaa();", 5296 NoBinPacking); 5297 verifyFormat("void f() {\n" 5298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5299 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5300 "}", 5301 NoBinPacking); 5302 5303 verifyFormat( 5304 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5305 " aaaaaaaaaaaa,\n" 5306 " aaaaaaaaaaaa);", 5307 NoBinPacking); 5308 verifyFormat( 5309 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5310 " ddddddddddddddddddddddddddddd),\n" 5311 " test);", 5312 NoBinPacking); 5313 5314 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5315 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5316 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5317 " aaaaaaaaaaaaaaaaaa;", 5318 NoBinPacking); 5319 verifyFormat("a(\"a\"\n" 5320 " \"a\",\n" 5321 " a);"); 5322 5323 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5324 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5325 " aaaaaaaaa,\n" 5326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5327 NoBinPacking); 5328 verifyFormat( 5329 "void f() {\n" 5330 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5331 " .aaaaaaa();\n" 5332 "}", 5333 NoBinPacking); 5334 verifyFormat( 5335 "template <class SomeType, class SomeOtherType>\n" 5336 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5337 NoBinPacking); 5338 } 5339 5340 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5341 FormatStyle Style = getLLVMStyleWithColumns(15); 5342 Style.ExperimentalAutoDetectBinPacking = true; 5343 EXPECT_EQ("aaa(aaaa,\n" 5344 " aaaa,\n" 5345 " aaaa);\n" 5346 "aaa(aaaa,\n" 5347 " aaaa,\n" 5348 " aaaa);", 5349 format("aaa(aaaa,\n" // one-per-line 5350 " aaaa,\n" 5351 " aaaa );\n" 5352 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5353 Style)); 5354 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5355 " aaaa);\n" 5356 "aaa(aaaa, aaaa,\n" 5357 " aaaa);", 5358 format("aaa(aaaa, aaaa,\n" // bin-packed 5359 " aaaa );\n" 5360 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5361 Style)); 5362 } 5363 5364 TEST_F(FormatTest, FormatsBuilderPattern) { 5365 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5366 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5367 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5368 " .StartsWith(\".init\", ORDER_INIT)\n" 5369 " .StartsWith(\".fini\", ORDER_FINI)\n" 5370 " .StartsWith(\".hash\", ORDER_HASH)\n" 5371 " .Default(ORDER_TEXT);\n"); 5372 5373 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5374 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5375 verifyFormat("aaaaaaa->aaaaaaa\n" 5376 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5378 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5379 verifyFormat( 5380 "aaaaaaa->aaaaaaa\n" 5381 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5382 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5383 verifyFormat( 5384 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5385 " aaaaaaaaaaaaaa);"); 5386 verifyFormat( 5387 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5388 " aaaaaa->aaaaaaaaaaaa()\n" 5389 " ->aaaaaaaaaaaaaaaa(\n" 5390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5391 " ->aaaaaaaaaaaaaaaaa();"); 5392 verifyGoogleFormat( 5393 "void f() {\n" 5394 " someo->Add((new util::filetools::Handler(dir))\n" 5395 " ->OnEvent1(NewPermanentCallback(\n" 5396 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5397 " ->OnEvent2(NewPermanentCallback(\n" 5398 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5399 " ->OnEvent3(NewPermanentCallback(\n" 5400 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5401 " ->OnEvent5(NewPermanentCallback(\n" 5402 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5403 " ->OnEvent6(NewPermanentCallback(\n" 5404 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5405 "}"); 5406 5407 verifyFormat( 5408 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5409 verifyFormat("aaaaaaaaaaaaaaa()\n" 5410 " .aaaaaaaaaaaaaaa()\n" 5411 " .aaaaaaaaaaaaaaa()\n" 5412 " .aaaaaaaaaaaaaaa()\n" 5413 " .aaaaaaaaaaaaaaa();"); 5414 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5415 " .aaaaaaaaaaaaaaa()\n" 5416 " .aaaaaaaaaaaaaaa()\n" 5417 " .aaaaaaaaaaaaaaa();"); 5418 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5419 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5420 " .aaaaaaaaaaaaaaa();"); 5421 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5422 " ->aaaaaaaaaaaaaae(0)\n" 5423 " ->aaaaaaaaaaaaaaa();"); 5424 5425 // Don't linewrap after very short segments. 5426 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5427 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5428 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5429 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5430 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5431 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5432 verifyFormat("aaa()\n" 5433 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5434 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5435 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5436 5437 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5438 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5439 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5440 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5441 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5442 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5443 5444 // Prefer not to break after empty parentheses. 5445 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5446 " First->LastNewlineOffset);"); 5447 5448 // Prefer not to create "hanging" indents. 5449 verifyFormat( 5450 "return !soooooooooooooome_map\n" 5451 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5452 " .second;"); 5453 verifyFormat( 5454 "return aaaaaaaaaaaaaaaa\n" 5455 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5456 " .aaaa(aaaaaaaaaaaaaa);"); 5457 // No hanging indent here. 5458 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5460 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5462 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5463 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5464 getLLVMStyleWithColumns(60)); 5465 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5466 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5467 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5468 getLLVMStyleWithColumns(59)); 5469 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5470 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5471 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5472 5473 // Dont break if only closing statements before member call 5474 verifyFormat("test() {\n" 5475 " ([]() -> {\n" 5476 " int b = 32;\n" 5477 " return 3;\n" 5478 " }).foo();\n" 5479 "}"); 5480 verifyFormat("test() {\n" 5481 " (\n" 5482 " []() -> {\n" 5483 " int b = 32;\n" 5484 " return 3;\n" 5485 " },\n" 5486 " foo, bar)\n" 5487 " .foo();\n" 5488 "}"); 5489 verifyFormat("test() {\n" 5490 " ([]() -> {\n" 5491 " int b = 32;\n" 5492 " return 3;\n" 5493 " })\n" 5494 " .foo()\n" 5495 " .bar();\n" 5496 "}"); 5497 verifyFormat("test() {\n" 5498 " ([]() -> {\n" 5499 " int b = 32;\n" 5500 " return 3;\n" 5501 " })\n" 5502 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5503 " \"bbbb\");\n" 5504 "}", 5505 getLLVMStyleWithColumns(30)); 5506 } 5507 5508 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5509 verifyFormat( 5510 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5511 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5512 verifyFormat( 5513 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5514 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5515 5516 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5517 " ccccccccccccccccccccccccc) {\n}"); 5518 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5519 " ccccccccccccccccccccccccc) {\n}"); 5520 5521 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5522 " ccccccccccccccccccccccccc) {\n}"); 5523 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5524 " ccccccccccccccccccccccccc) {\n}"); 5525 5526 verifyFormat( 5527 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5528 " ccccccccccccccccccccccccc) {\n}"); 5529 verifyFormat( 5530 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5531 " ccccccccccccccccccccccccc) {\n}"); 5532 5533 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5534 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5535 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5536 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5537 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5538 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5539 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5540 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5541 5542 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5543 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5544 " aaaaaaaaaaaaaaa != aa) {\n}"); 5545 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5546 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5547 " aaaaaaaaaaaaaaa != aa) {\n}"); 5548 } 5549 5550 TEST_F(FormatTest, BreaksAfterAssignments) { 5551 verifyFormat( 5552 "unsigned Cost =\n" 5553 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5554 " SI->getPointerAddressSpaceee());\n"); 5555 verifyFormat( 5556 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5557 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5558 5559 verifyFormat( 5560 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5561 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5562 verifyFormat("unsigned OriginalStartColumn =\n" 5563 " SourceMgr.getSpellingColumnNumber(\n" 5564 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5565 " 1;"); 5566 } 5567 5568 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5569 FormatStyle Style = getLLVMStyle(); 5570 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5571 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5572 Style); 5573 5574 Style.PenaltyBreakAssignment = 20; 5575 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5576 " cccccccccccccccccccccccccc;", 5577 Style); 5578 } 5579 5580 TEST_F(FormatTest, AlignsAfterAssignments) { 5581 verifyFormat( 5582 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5583 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5584 verifyFormat( 5585 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5586 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5587 verifyFormat( 5588 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5589 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5590 verifyFormat( 5591 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5592 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5593 verifyFormat( 5594 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5595 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5596 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5597 } 5598 5599 TEST_F(FormatTest, AlignsAfterReturn) { 5600 verifyFormat( 5601 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5602 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5603 verifyFormat( 5604 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5605 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5606 verifyFormat( 5607 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5608 " aaaaaaaaaaaaaaaaaaaaaa();"); 5609 verifyFormat( 5610 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5611 " aaaaaaaaaaaaaaaaaaaaaa());"); 5612 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5614 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5615 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5616 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5617 verifyFormat("return\n" 5618 " // true if code is one of a or b.\n" 5619 " code == a || code == b;"); 5620 } 5621 5622 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5623 verifyFormat( 5624 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5625 " aaaaaaaaa aaaaaaa) {}"); 5626 verifyFormat( 5627 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5628 " aaaaaaaaaaa aaaaaaaaa);"); 5629 verifyFormat( 5630 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5631 " aaaaaaaaaaaaaaaaaaaaa));"); 5632 FormatStyle Style = getLLVMStyle(); 5633 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5634 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5635 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5636 Style); 5637 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5638 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5639 Style); 5640 verifyFormat("SomeLongVariableName->someFunction(\n" 5641 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5642 Style); 5643 verifyFormat( 5644 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5645 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5646 Style); 5647 verifyFormat( 5648 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5649 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5650 Style); 5651 verifyFormat( 5652 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5653 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5654 Style); 5655 5656 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5657 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5658 " b));", 5659 Style); 5660 5661 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5662 Style.BinPackArguments = false; 5663 Style.BinPackParameters = false; 5664 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5665 " aaaaaaaaaaa aaaaaaaa,\n" 5666 " aaaaaaaaa aaaaaaa,\n" 5667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5668 Style); 5669 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5670 " aaaaaaaaaaa aaaaaaaaa,\n" 5671 " aaaaaaaaaaa aaaaaaaaa,\n" 5672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5673 Style); 5674 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5675 " aaaaaaaaaaaaaaa,\n" 5676 " aaaaaaaaaaaaaaaaaaaaa,\n" 5677 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5678 Style); 5679 verifyFormat( 5680 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5681 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5682 Style); 5683 verifyFormat( 5684 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5685 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5686 Style); 5687 verifyFormat( 5688 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5689 " aaaaaaaaaaaaaaaaaaaaa(\n" 5690 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5691 " aaaaaaaaaaaaaaaa);", 5692 Style); 5693 verifyFormat( 5694 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5695 " aaaaaaaaaaaaaaaaaaaaa(\n" 5696 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5697 " aaaaaaaaaaaaaaaa);", 5698 Style); 5699 } 5700 5701 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5702 FormatStyle Style = getLLVMStyleWithColumns(40); 5703 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5704 " bbbbbbbbbbbbbbbbbbbbbb);", 5705 Style); 5706 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5707 Style.AlignOperands = false; 5708 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5709 " bbbbbbbbbbbbbbbbbbbbbb);", 5710 Style); 5711 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5712 Style.AlignOperands = true; 5713 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5714 " bbbbbbbbbbbbbbbbbbbbbb);", 5715 Style); 5716 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5717 Style.AlignOperands = false; 5718 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5719 " bbbbbbbbbbbbbbbbbbbbbb);", 5720 Style); 5721 } 5722 5723 TEST_F(FormatTest, BreaksConditionalExpressions) { 5724 verifyFormat( 5725 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5726 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5727 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5728 verifyFormat( 5729 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5730 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5731 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5732 verifyFormat( 5733 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5734 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5735 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5736 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5737 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5738 verifyFormat( 5739 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5740 " : aaaaaaaaaaaaa);"); 5741 verifyFormat( 5742 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5743 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5744 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5745 " aaaaaaaaaaaaa);"); 5746 verifyFormat( 5747 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5748 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5749 " aaaaaaaaaaaaa);"); 5750 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5751 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5753 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5754 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5755 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5757 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5759 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5761 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5762 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5764 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5766 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5767 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5768 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5769 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5770 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5771 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5772 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5773 " : aaaaaaaaaaaaaaaa;"); 5774 verifyFormat( 5775 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5776 " ? aaaaaaaaaaaaaaa\n" 5777 " : aaaaaaaaaaaaaaa;"); 5778 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5779 " aaaaaaaaa\n" 5780 " ? b\n" 5781 " : c);"); 5782 verifyFormat("return aaaa == bbbb\n" 5783 " // comment\n" 5784 " ? aaaa\n" 5785 " : bbbb;"); 5786 verifyFormat("unsigned Indent =\n" 5787 " format(TheLine.First,\n" 5788 " IndentForLevel[TheLine.Level] >= 0\n" 5789 " ? IndentForLevel[TheLine.Level]\n" 5790 " : TheLine * 2,\n" 5791 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5792 getLLVMStyleWithColumns(60)); 5793 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5794 " ? aaaaaaaaaaaaaaa\n" 5795 " : bbbbbbbbbbbbbbb //\n" 5796 " ? ccccccccccccccc\n" 5797 " : ddddddddddddddd;"); 5798 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5799 " ? aaaaaaaaaaaaaaa\n" 5800 " : (bbbbbbbbbbbbbbb //\n" 5801 " ? ccccccccccccccc\n" 5802 " : ddddddddddddddd);"); 5803 verifyFormat( 5804 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5805 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5806 " aaaaaaaaaaaaaaaaaaaaa +\n" 5807 " aaaaaaaaaaaaaaaaaaaaa\n" 5808 " : aaaaaaaaaa;"); 5809 verifyFormat( 5810 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5811 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5812 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5813 5814 FormatStyle NoBinPacking = getLLVMStyle(); 5815 NoBinPacking.BinPackArguments = false; 5816 verifyFormat( 5817 "void f() {\n" 5818 " g(aaa,\n" 5819 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5821 " ? aaaaaaaaaaaaaaa\n" 5822 " : aaaaaaaaaaaaaaa);\n" 5823 "}", 5824 NoBinPacking); 5825 verifyFormat( 5826 "void f() {\n" 5827 " g(aaa,\n" 5828 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5830 " ?: aaaaaaaaaaaaaaa);\n" 5831 "}", 5832 NoBinPacking); 5833 5834 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5835 " // comment.\n" 5836 " ccccccccccccccccccccccccccccccccccccccc\n" 5837 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5838 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5839 5840 // Assignments in conditional expressions. Apparently not uncommon :-(. 5841 verifyFormat("return a != b\n" 5842 " // comment\n" 5843 " ? a = b\n" 5844 " : a = b;"); 5845 verifyFormat("return a != b\n" 5846 " // comment\n" 5847 " ? a = a != b\n" 5848 " // comment\n" 5849 " ? a = b\n" 5850 " : a\n" 5851 " : a;\n"); 5852 verifyFormat("return a != b\n" 5853 " // comment\n" 5854 " ? a\n" 5855 " : a = a != b\n" 5856 " // comment\n" 5857 " ? a = b\n" 5858 " : a;"); 5859 } 5860 5861 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5862 FormatStyle Style = getLLVMStyle(); 5863 Style.BreakBeforeTernaryOperators = false; 5864 Style.ColumnLimit = 70; 5865 verifyFormat( 5866 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5868 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5869 Style); 5870 verifyFormat( 5871 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5872 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5873 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5874 Style); 5875 verifyFormat( 5876 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5878 Style); 5879 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5880 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5882 Style); 5883 verifyFormat( 5884 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 5885 " aaaaaaaaaaaaa);", 5886 Style); 5887 verifyFormat( 5888 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5889 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5890 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5891 " aaaaaaaaaaaaa);", 5892 Style); 5893 verifyFormat( 5894 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5895 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5896 " aaaaaaaaaaaaa);", 5897 Style); 5898 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5899 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5900 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5901 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5902 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5903 Style); 5904 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5905 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5906 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5907 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5908 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5909 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5910 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5911 Style); 5912 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5913 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 5914 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5916 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5917 Style); 5918 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5919 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5920 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5921 Style); 5922 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5924 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5925 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5926 Style); 5927 verifyFormat( 5928 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5929 " aaaaaaaaaaaaaaa :\n" 5930 " aaaaaaaaaaaaaaa;", 5931 Style); 5932 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5933 " aaaaaaaaa ?\n" 5934 " b :\n" 5935 " c);", 5936 Style); 5937 verifyFormat("unsigned Indent =\n" 5938 " format(TheLine.First,\n" 5939 " IndentForLevel[TheLine.Level] >= 0 ?\n" 5940 " IndentForLevel[TheLine.Level] :\n" 5941 " TheLine * 2,\n" 5942 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5943 Style); 5944 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5945 " aaaaaaaaaaaaaaa :\n" 5946 " bbbbbbbbbbbbbbb ? //\n" 5947 " ccccccccccccccc :\n" 5948 " ddddddddddddddd;", 5949 Style); 5950 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5951 " aaaaaaaaaaaaaaa :\n" 5952 " (bbbbbbbbbbbbbbb ? //\n" 5953 " ccccccccccccccc :\n" 5954 " ddddddddddddddd);", 5955 Style); 5956 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5957 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 5958 " ccccccccccccccccccccccccccc;", 5959 Style); 5960 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5961 " aaaaa :\n" 5962 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 5963 Style); 5964 } 5965 5966 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 5967 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 5968 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 5969 verifyFormat("bool a = true, b = false;"); 5970 5971 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 5973 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 5974 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 5975 verifyFormat( 5976 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 5977 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 5978 " d = e && f;"); 5979 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 5980 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 5981 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5982 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 5983 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 5984 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 5985 5986 FormatStyle Style = getGoogleStyle(); 5987 Style.PointerAlignment = FormatStyle::PAS_Left; 5988 Style.DerivePointerAlignment = false; 5989 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5990 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 5991 " *b = bbbbbbbbbbbbbbbbbbb;", 5992 Style); 5993 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5994 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 5995 Style); 5996 verifyFormat("vector<int*> a, b;", Style); 5997 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 5998 } 5999 6000 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6001 verifyFormat("arr[foo ? bar : baz];"); 6002 verifyFormat("f()[foo ? bar : baz];"); 6003 verifyFormat("(a + b)[foo ? bar : baz];"); 6004 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6005 } 6006 6007 TEST_F(FormatTest, AlignsStringLiterals) { 6008 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6009 " \"short literal\");"); 6010 verifyFormat( 6011 "looooooooooooooooooooooooongFunction(\n" 6012 " \"short literal\"\n" 6013 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6014 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6015 " \" string literals\",\n" 6016 " and, other, parameters);"); 6017 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6018 " \"5678\";", 6019 format("fun + \"1243\" /* comment */\n" 6020 " \"5678\";", 6021 getLLVMStyleWithColumns(28))); 6022 EXPECT_EQ( 6023 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6024 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6025 " \"aaaaaaaaaaaaaaaa\";", 6026 format("aaaaaa =" 6027 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6028 "aaaaaaaaaaaaaaaaaaaaa\" " 6029 "\"aaaaaaaaaaaaaaaa\";")); 6030 verifyFormat("a = a + \"a\"\n" 6031 " \"a\"\n" 6032 " \"a\";"); 6033 verifyFormat("f(\"a\", \"b\"\n" 6034 " \"c\");"); 6035 6036 verifyFormat( 6037 "#define LL_FORMAT \"ll\"\n" 6038 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6039 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6040 6041 verifyFormat("#define A(X) \\\n" 6042 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6043 " \"ccccc\"", 6044 getLLVMStyleWithColumns(23)); 6045 verifyFormat("#define A \"def\"\n" 6046 "f(\"abc\" A \"ghi\"\n" 6047 " \"jkl\");"); 6048 6049 verifyFormat("f(L\"a\"\n" 6050 " L\"b\");"); 6051 verifyFormat("#define A(X) \\\n" 6052 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6053 " L\"ccccc\"", 6054 getLLVMStyleWithColumns(25)); 6055 6056 verifyFormat("f(@\"a\"\n" 6057 " @\"b\");"); 6058 verifyFormat("NSString s = @\"a\"\n" 6059 " @\"b\"\n" 6060 " @\"c\";"); 6061 verifyFormat("NSString s = @\"a\"\n" 6062 " \"b\"\n" 6063 " \"c\";"); 6064 } 6065 6066 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6067 FormatStyle Style = getLLVMStyle(); 6068 // No declarations or definitions should be moved to own line. 6069 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6070 verifyFormat("class A {\n" 6071 " int f() { return 1; }\n" 6072 " int g();\n" 6073 "};\n" 6074 "int f() { return 1; }\n" 6075 "int g();\n", 6076 Style); 6077 6078 // All declarations and definitions should have the return type moved to its 6079 // own 6080 // line. 6081 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6082 verifyFormat("class E {\n" 6083 " int\n" 6084 " f() {\n" 6085 " return 1;\n" 6086 " }\n" 6087 " int\n" 6088 " g();\n" 6089 "};\n" 6090 "int\n" 6091 "f() {\n" 6092 " return 1;\n" 6093 "}\n" 6094 "int\n" 6095 "g();\n", 6096 Style); 6097 6098 // Top-level definitions, and no kinds of declarations should have the 6099 // return type moved to its own line. 6100 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6101 verifyFormat("class B {\n" 6102 " int f() { return 1; }\n" 6103 " int g();\n" 6104 "};\n" 6105 "int\n" 6106 "f() {\n" 6107 " return 1;\n" 6108 "}\n" 6109 "int g();\n", 6110 Style); 6111 6112 // Top-level definitions and declarations should have the return type moved 6113 // to its own line. 6114 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6115 verifyFormat("class C {\n" 6116 " int f() { return 1; }\n" 6117 " int g();\n" 6118 "};\n" 6119 "int\n" 6120 "f() {\n" 6121 " return 1;\n" 6122 "}\n" 6123 "int\n" 6124 "g();\n", 6125 Style); 6126 6127 // All definitions should have the return type moved to its own line, but no 6128 // kinds of declarations. 6129 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6130 verifyFormat("class D {\n" 6131 " int\n" 6132 " f() {\n" 6133 " return 1;\n" 6134 " }\n" 6135 " int g();\n" 6136 "};\n" 6137 "int\n" 6138 "f() {\n" 6139 " return 1;\n" 6140 "}\n" 6141 "int g();\n", 6142 Style); 6143 verifyFormat("const char *\n" 6144 "f(void) {\n" // Break here. 6145 " return \"\";\n" 6146 "}\n" 6147 "const char *bar(void);\n", // No break here. 6148 Style); 6149 verifyFormat("template <class T>\n" 6150 "T *\n" 6151 "f(T &c) {\n" // Break here. 6152 " return NULL;\n" 6153 "}\n" 6154 "template <class T> T *f(T &c);\n", // No break here. 6155 Style); 6156 verifyFormat("class C {\n" 6157 " int\n" 6158 " operator+() {\n" 6159 " return 1;\n" 6160 " }\n" 6161 " int\n" 6162 " operator()() {\n" 6163 " return 1;\n" 6164 " }\n" 6165 "};\n", 6166 Style); 6167 verifyFormat("void\n" 6168 "A::operator()() {}\n" 6169 "void\n" 6170 "A::operator>>() {}\n" 6171 "void\n" 6172 "A::operator+() {}\n" 6173 "void\n" 6174 "A::operator*() {}\n" 6175 "void\n" 6176 "A::operator->() {}\n" 6177 "void\n" 6178 "A::operator void *() {}\n" 6179 "void\n" 6180 "A::operator void &() {}\n" 6181 "void\n" 6182 "A::operator void &&() {}\n" 6183 "void\n" 6184 "A::operator char *() {}\n" 6185 "void\n" 6186 "A::operator[]() {}\n" 6187 "void\n" 6188 "A::operator!() {}\n", 6189 Style); 6190 verifyFormat("constexpr auto\n" 6191 "operator()() const -> reference {}\n" 6192 "constexpr auto\n" 6193 "operator>>() const -> reference {}\n" 6194 "constexpr auto\n" 6195 "operator+() const -> reference {}\n" 6196 "constexpr auto\n" 6197 "operator*() const -> reference {}\n" 6198 "constexpr auto\n" 6199 "operator->() const -> reference {}\n" 6200 "constexpr auto\n" 6201 "operator++() const -> reference {}\n" 6202 "constexpr auto\n" 6203 "operator void *() const -> reference {}\n" 6204 "constexpr auto\n" 6205 "operator void &() const -> reference {}\n" 6206 "constexpr auto\n" 6207 "operator void &&() const -> reference {}\n" 6208 "constexpr auto\n" 6209 "operator char *() const -> reference {}\n" 6210 "constexpr auto\n" 6211 "operator!() const -> reference {}\n" 6212 "constexpr auto\n" 6213 "operator[]() const -> reference {}\n", 6214 Style); 6215 verifyFormat("void *operator new(std::size_t s);", // No break here. 6216 Style); 6217 verifyFormat("void *\n" 6218 "operator new(std::size_t s) {}", 6219 Style); 6220 verifyFormat("void *\n" 6221 "operator delete[](void *ptr) {}", 6222 Style); 6223 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6224 verifyFormat("const char *\n" 6225 "f(void)\n" // Break here. 6226 "{\n" 6227 " return \"\";\n" 6228 "}\n" 6229 "const char *bar(void);\n", // No break here. 6230 Style); 6231 verifyFormat("template <class T>\n" 6232 "T *\n" // Problem here: no line break 6233 "f(T &c)\n" // Break here. 6234 "{\n" 6235 " return NULL;\n" 6236 "}\n" 6237 "template <class T> T *f(T &c);\n", // No break here. 6238 Style); 6239 verifyFormat("int\n" 6240 "foo(A<bool> a)\n" 6241 "{\n" 6242 " return a;\n" 6243 "}\n", 6244 Style); 6245 verifyFormat("int\n" 6246 "foo(A<8> a)\n" 6247 "{\n" 6248 " return a;\n" 6249 "}\n", 6250 Style); 6251 verifyFormat("int\n" 6252 "foo(A<B<bool>, 8> a)\n" 6253 "{\n" 6254 " return a;\n" 6255 "}\n", 6256 Style); 6257 verifyFormat("int\n" 6258 "foo(A<B<8>, bool> a)\n" 6259 "{\n" 6260 " return a;\n" 6261 "}\n", 6262 Style); 6263 verifyFormat("int\n" 6264 "foo(A<B<bool>, bool> a)\n" 6265 "{\n" 6266 " return a;\n" 6267 "}\n", 6268 Style); 6269 verifyFormat("int\n" 6270 "foo(A<B<8>, 8> a)\n" 6271 "{\n" 6272 " return a;\n" 6273 "}\n", 6274 Style); 6275 6276 Style = getGNUStyle(); 6277 6278 // Test for comments at the end of function declarations. 6279 verifyFormat("void\n" 6280 "foo (int a, /*abc*/ int b) // def\n" 6281 "{\n" 6282 "}\n", 6283 Style); 6284 6285 verifyFormat("void\n" 6286 "foo (int a, /* abc */ int b) /* def */\n" 6287 "{\n" 6288 "}\n", 6289 Style); 6290 6291 // Definitions that should not break after return type 6292 verifyFormat("void foo (int a, int b); // def\n", Style); 6293 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6294 verifyFormat("void foo (int a, int b);\n", Style); 6295 } 6296 6297 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6298 FormatStyle NoBreak = getLLVMStyle(); 6299 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6300 FormatStyle Break = getLLVMStyle(); 6301 Break.AlwaysBreakBeforeMultilineStrings = true; 6302 verifyFormat("aaaa = \"bbbb\"\n" 6303 " \"cccc\";", 6304 NoBreak); 6305 verifyFormat("aaaa =\n" 6306 " \"bbbb\"\n" 6307 " \"cccc\";", 6308 Break); 6309 verifyFormat("aaaa(\"bbbb\"\n" 6310 " \"cccc\");", 6311 NoBreak); 6312 verifyFormat("aaaa(\n" 6313 " \"bbbb\"\n" 6314 " \"cccc\");", 6315 Break); 6316 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6317 " \"cccc\");", 6318 NoBreak); 6319 verifyFormat("aaaa(qqq,\n" 6320 " \"bbbb\"\n" 6321 " \"cccc\");", 6322 Break); 6323 verifyFormat("aaaa(qqq,\n" 6324 " L\"bbbb\"\n" 6325 " L\"cccc\");", 6326 Break); 6327 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6328 " \"bbbb\"));", 6329 Break); 6330 verifyFormat("string s = someFunction(\n" 6331 " \"abc\"\n" 6332 " \"abc\");", 6333 Break); 6334 6335 // As we break before unary operators, breaking right after them is bad. 6336 verifyFormat("string foo = abc ? \"x\"\n" 6337 " \"blah blah blah blah blah blah\"\n" 6338 " : \"y\";", 6339 Break); 6340 6341 // Don't break if there is no column gain. 6342 verifyFormat("f(\"aaaa\"\n" 6343 " \"bbbb\");", 6344 Break); 6345 6346 // Treat literals with escaped newlines like multi-line string literals. 6347 EXPECT_EQ("x = \"a\\\n" 6348 "b\\\n" 6349 "c\";", 6350 format("x = \"a\\\n" 6351 "b\\\n" 6352 "c\";", 6353 NoBreak)); 6354 EXPECT_EQ("xxxx =\n" 6355 " \"a\\\n" 6356 "b\\\n" 6357 "c\";", 6358 format("xxxx = \"a\\\n" 6359 "b\\\n" 6360 "c\";", 6361 Break)); 6362 6363 EXPECT_EQ("NSString *const kString =\n" 6364 " @\"aaaa\"\n" 6365 " @\"bbbb\";", 6366 format("NSString *const kString = @\"aaaa\"\n" 6367 "@\"bbbb\";", 6368 Break)); 6369 6370 Break.ColumnLimit = 0; 6371 verifyFormat("const char *hello = \"hello llvm\";", Break); 6372 } 6373 6374 TEST_F(FormatTest, AlignsPipes) { 6375 verifyFormat( 6376 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6377 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6378 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6379 verifyFormat( 6380 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6381 " << aaaaaaaaaaaaaaaaaaaa;"); 6382 verifyFormat( 6383 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6384 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6385 verifyFormat( 6386 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6387 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6388 verifyFormat( 6389 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6390 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6391 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6392 verifyFormat( 6393 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6394 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6395 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6396 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6399 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6400 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6401 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6402 verifyFormat( 6403 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6405 verifyFormat( 6406 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6407 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6408 6409 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6410 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6411 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6413 " aaaaaaaaaaaaaaaaaaaaa)\n" 6414 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6415 verifyFormat("LOG_IF(aaa == //\n" 6416 " bbb)\n" 6417 " << a << b;"); 6418 6419 // But sometimes, breaking before the first "<<" is desirable. 6420 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6421 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6422 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6423 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6424 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6425 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6426 " << BEF << IsTemplate << Description << E->getType();"); 6427 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6428 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6430 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6431 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6433 " << aaa;"); 6434 6435 verifyFormat( 6436 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6437 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6438 6439 // Incomplete string literal. 6440 EXPECT_EQ("llvm::errs() << \"\n" 6441 " << a;", 6442 format("llvm::errs() << \"\n<<a;")); 6443 6444 verifyFormat("void f() {\n" 6445 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6446 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6447 "}"); 6448 6449 // Handle 'endl'. 6450 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6451 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6452 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6453 6454 // Handle '\n'. 6455 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6456 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6457 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6458 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6459 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6460 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6461 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6462 } 6463 6464 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6465 verifyFormat("return out << \"somepacket = {\\n\"\n" 6466 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6467 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6468 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6469 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6470 " << \"}\";"); 6471 6472 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6473 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6474 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6475 verifyFormat( 6476 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6477 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6478 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6479 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6480 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6481 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6482 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6483 verifyFormat( 6484 "void f() {\n" 6485 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6486 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6487 "}"); 6488 6489 // Breaking before the first "<<" is generally not desirable. 6490 verifyFormat( 6491 "llvm::errs()\n" 6492 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6493 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6494 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6495 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6496 getLLVMStyleWithColumns(70)); 6497 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6498 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6499 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6500 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6501 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6502 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6503 getLLVMStyleWithColumns(70)); 6504 6505 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6506 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6507 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6508 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6509 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6510 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6511 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6512 " (aaaa + aaaa);", 6513 getLLVMStyleWithColumns(40)); 6514 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6515 " (aaaaaaa + aaaaa));", 6516 getLLVMStyleWithColumns(40)); 6517 verifyFormat( 6518 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6519 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6520 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6521 } 6522 6523 TEST_F(FormatTest, UnderstandsEquals) { 6524 verifyFormat( 6525 "aaaaaaaaaaaaaaaaa =\n" 6526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6527 verifyFormat( 6528 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6529 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6530 verifyFormat( 6531 "if (a) {\n" 6532 " f();\n" 6533 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6534 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6535 "}"); 6536 6537 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6538 " 100000000 + 10000000) {\n}"); 6539 } 6540 6541 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6542 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6543 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6544 6545 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6546 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6547 6548 verifyFormat( 6549 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6550 " Parameter2);"); 6551 6552 verifyFormat( 6553 "ShortObject->shortFunction(\n" 6554 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6555 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6556 6557 verifyFormat("loooooooooooooongFunction(\n" 6558 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6559 6560 verifyFormat( 6561 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6562 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6563 6564 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6565 " .WillRepeatedly(Return(SomeValue));"); 6566 verifyFormat("void f() {\n" 6567 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6568 " .Times(2)\n" 6569 " .WillRepeatedly(Return(SomeValue));\n" 6570 "}"); 6571 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6572 " ccccccccccccccccccccccc);"); 6573 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6575 " .aaaaa(aaaaa),\n" 6576 " aaaaaaaaaaaaaaaaaaaaa);"); 6577 verifyFormat("void f() {\n" 6578 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6579 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6580 "}"); 6581 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6582 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6583 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6584 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6585 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6586 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6587 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6588 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6589 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6590 "}"); 6591 6592 // Here, it is not necessary to wrap at "." or "->". 6593 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6594 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6595 verifyFormat( 6596 "aaaaaaaaaaa->aaaaaaaaa(\n" 6597 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6598 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6599 6600 verifyFormat( 6601 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6603 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6604 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6605 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6606 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6607 6608 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6610 " .a();"); 6611 6612 FormatStyle NoBinPacking = getLLVMStyle(); 6613 NoBinPacking.BinPackParameters = false; 6614 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6615 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6616 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6617 " aaaaaaaaaaaaaaaaaaa,\n" 6618 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6619 NoBinPacking); 6620 6621 // If there is a subsequent call, change to hanging indentation. 6622 verifyFormat( 6623 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6624 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6625 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6626 verifyFormat( 6627 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6628 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6629 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6630 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6631 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6632 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6633 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6634 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6635 } 6636 6637 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6638 verifyFormat("template <typename T>\n" 6639 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6640 verifyFormat("template <typename T>\n" 6641 "// T should be one of {A, B}.\n" 6642 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6643 verifyFormat( 6644 "template <typename T>\n" 6645 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6646 verifyFormat("template <typename T>\n" 6647 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6648 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6649 verifyFormat( 6650 "template <typename T>\n" 6651 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6652 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6653 verifyFormat( 6654 "template <typename T>\n" 6655 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6656 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6657 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6658 verifyFormat("template <typename T>\n" 6659 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6660 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6661 verifyFormat( 6662 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6663 " typename T4 = char>\n" 6664 "void f();"); 6665 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6666 " template <typename> class cccccccccccccccccccccc,\n" 6667 " typename ddddddddddddd>\n" 6668 "class C {};"); 6669 verifyFormat( 6670 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6671 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6672 6673 verifyFormat("void f() {\n" 6674 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6675 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6676 "}"); 6677 6678 verifyFormat("template <typename T> class C {};"); 6679 verifyFormat("template <typename T> void f();"); 6680 verifyFormat("template <typename T> void f() {}"); 6681 verifyFormat( 6682 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6683 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6685 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6688 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6689 getLLVMStyleWithColumns(72)); 6690 EXPECT_EQ("static_cast<A< //\n" 6691 " B> *>(\n" 6692 "\n" 6693 ");", 6694 format("static_cast<A<//\n" 6695 " B>*>(\n" 6696 "\n" 6697 " );")); 6698 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6699 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6700 6701 FormatStyle AlwaysBreak = getLLVMStyle(); 6702 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6703 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6704 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6705 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6706 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6707 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6708 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6709 verifyFormat("template <template <typename> class Fooooooo,\n" 6710 " template <typename> class Baaaaaaar>\n" 6711 "struct C {};", 6712 AlwaysBreak); 6713 verifyFormat("template <typename T> // T can be A, B or C.\n" 6714 "struct C {};", 6715 AlwaysBreak); 6716 verifyFormat("template <enum E> class A {\n" 6717 "public:\n" 6718 " E *f();\n" 6719 "};"); 6720 6721 FormatStyle NeverBreak = getLLVMStyle(); 6722 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6723 verifyFormat("template <typename T> class C {};", NeverBreak); 6724 verifyFormat("template <typename T> void f();", NeverBreak); 6725 verifyFormat("template <typename T> void f() {}", NeverBreak); 6726 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6727 "bbbbbbbbbbbbbbbbbbbb) {}", 6728 NeverBreak); 6729 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6730 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6731 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6732 NeverBreak); 6733 verifyFormat("template <template <typename> class Fooooooo,\n" 6734 " template <typename> class Baaaaaaar>\n" 6735 "struct C {};", 6736 NeverBreak); 6737 verifyFormat("template <typename T> // T can be A, B or C.\n" 6738 "struct C {};", 6739 NeverBreak); 6740 verifyFormat("template <enum E> class A {\n" 6741 "public:\n" 6742 " E *f();\n" 6743 "};", 6744 NeverBreak); 6745 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6746 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6747 "bbbbbbbbbbbbbbbbbbbb) {}", 6748 NeverBreak); 6749 } 6750 6751 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6752 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6753 Style.ColumnLimit = 60; 6754 EXPECT_EQ("// Baseline - no comments.\n" 6755 "template <\n" 6756 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6757 "void f() {}", 6758 format("// Baseline - no comments.\n" 6759 "template <\n" 6760 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6761 "void f() {}", 6762 Style)); 6763 6764 EXPECT_EQ("template <\n" 6765 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6766 "void f() {}", 6767 format("template <\n" 6768 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6769 "void f() {}", 6770 Style)); 6771 6772 EXPECT_EQ( 6773 "template <\n" 6774 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6775 "void f() {}", 6776 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6777 "void f() {}", 6778 Style)); 6779 6780 EXPECT_EQ( 6781 "template <\n" 6782 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6783 " // multiline\n" 6784 "void f() {}", 6785 format("template <\n" 6786 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6787 " // multiline\n" 6788 "void f() {}", 6789 Style)); 6790 6791 EXPECT_EQ( 6792 "template <typename aaaaaaaaaa<\n" 6793 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6794 "void f() {}", 6795 format( 6796 "template <\n" 6797 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6798 "void f() {}", 6799 Style)); 6800 } 6801 6802 TEST_F(FormatTest, WrapsTemplateParameters) { 6803 FormatStyle Style = getLLVMStyle(); 6804 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6805 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6806 verifyFormat( 6807 "template <typename... a> struct q {};\n" 6808 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6809 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6810 " y;", 6811 Style); 6812 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6813 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6814 verifyFormat( 6815 "template <typename... a> struct r {};\n" 6816 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6817 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6818 " y;", 6819 Style); 6820 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6821 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6822 verifyFormat("template <typename... a> struct s {};\n" 6823 "extern s<\n" 6824 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6825 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6826 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6827 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6828 " y;", 6829 Style); 6830 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6831 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6832 verifyFormat("template <typename... a> struct t {};\n" 6833 "extern t<\n" 6834 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6835 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6836 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6837 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6838 " y;", 6839 Style); 6840 } 6841 6842 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6843 verifyFormat( 6844 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6845 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6846 verifyFormat( 6847 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6848 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6849 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6850 6851 // FIXME: Should we have the extra indent after the second break? 6852 verifyFormat( 6853 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6854 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6855 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6856 6857 verifyFormat( 6858 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6859 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6860 6861 // Breaking at nested name specifiers is generally not desirable. 6862 verifyFormat( 6863 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6864 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6865 6866 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 6867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6868 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6869 " aaaaaaaaaaaaaaaaaaaaa);", 6870 getLLVMStyleWithColumns(74)); 6871 6872 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6873 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6874 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6875 } 6876 6877 TEST_F(FormatTest, UnderstandsTemplateParameters) { 6878 verifyFormat("A<int> a;"); 6879 verifyFormat("A<A<A<int>>> a;"); 6880 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 6881 verifyFormat("bool x = a < 1 || 2 > a;"); 6882 verifyFormat("bool x = 5 < f<int>();"); 6883 verifyFormat("bool x = f<int>() > 5;"); 6884 verifyFormat("bool x = 5 < a<int>::x;"); 6885 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 6886 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 6887 6888 verifyGoogleFormat("A<A<int>> a;"); 6889 verifyGoogleFormat("A<A<A<int>>> a;"); 6890 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 6891 verifyGoogleFormat("A<A<int> > a;"); 6892 verifyGoogleFormat("A<A<A<int> > > a;"); 6893 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 6894 verifyGoogleFormat("A<::A<int>> a;"); 6895 verifyGoogleFormat("A<::A> a;"); 6896 verifyGoogleFormat("A< ::A> a;"); 6897 verifyGoogleFormat("A< ::A<int> > a;"); 6898 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 6899 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 6900 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 6901 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 6902 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 6903 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 6904 6905 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 6906 6907 // template closer followed by a token that starts with > or = 6908 verifyFormat("bool b = a<1> > 1;"); 6909 verifyFormat("bool b = a<1> >= 1;"); 6910 verifyFormat("int i = a<1> >> 1;"); 6911 FormatStyle Style = getLLVMStyle(); 6912 Style.SpaceBeforeAssignmentOperators = false; 6913 verifyFormat("bool b= a<1> == 1;", Style); 6914 verifyFormat("a<int> = 1;", Style); 6915 verifyFormat("a<int> >>= 1;", Style); 6916 6917 verifyFormat("test >> a >> b;"); 6918 verifyFormat("test << a >> b;"); 6919 6920 verifyFormat("f<int>();"); 6921 verifyFormat("template <typename T> void f() {}"); 6922 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 6923 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 6924 "sizeof(char)>::type>;"); 6925 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 6926 verifyFormat("f(a.operator()<A>());"); 6927 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6928 " .template operator()<A>());", 6929 getLLVMStyleWithColumns(35)); 6930 6931 // Not template parameters. 6932 verifyFormat("return a < b && c > d;"); 6933 verifyFormat("void f() {\n" 6934 " while (a < b && c > d) {\n" 6935 " }\n" 6936 "}"); 6937 verifyFormat("template <typename... Types>\n" 6938 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 6939 6940 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 6942 getLLVMStyleWithColumns(60)); 6943 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 6944 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 6945 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 6946 } 6947 6948 TEST_F(FormatTest, BitshiftOperatorWidth) { 6949 EXPECT_EQ("int a = 1 << 2; /* foo\n" 6950 " bar */", 6951 format("int a=1<<2; /* foo\n" 6952 " bar */")); 6953 6954 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 6955 " bar */", 6956 format("int b =256>>1 ; /* foo\n" 6957 " bar */")); 6958 } 6959 6960 TEST_F(FormatTest, UnderstandsBinaryOperators) { 6961 verifyFormat("COMPARE(a, ==, b);"); 6962 verifyFormat("auto s = sizeof...(Ts) - 1;"); 6963 } 6964 6965 TEST_F(FormatTest, UnderstandsPointersToMembers) { 6966 verifyFormat("int A::*x;"); 6967 verifyFormat("int (S::*func)(void *);"); 6968 verifyFormat("void f() { int (S::*func)(void *); }"); 6969 verifyFormat("typedef bool *(Class::*Member)() const;"); 6970 verifyFormat("void f() {\n" 6971 " (a->*f)();\n" 6972 " a->*x;\n" 6973 " (a.*f)();\n" 6974 " ((*a).*f)();\n" 6975 " a.*x;\n" 6976 "}"); 6977 verifyFormat("void f() {\n" 6978 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 6979 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 6980 "}"); 6981 verifyFormat( 6982 "(aaaaaaaaaa->*bbbbbbb)(\n" 6983 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6984 FormatStyle Style = getLLVMStyle(); 6985 Style.PointerAlignment = FormatStyle::PAS_Left; 6986 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 6987 } 6988 6989 TEST_F(FormatTest, UnderstandsUnaryOperators) { 6990 verifyFormat("int a = -2;"); 6991 verifyFormat("f(-1, -2, -3);"); 6992 verifyFormat("a[-1] = 5;"); 6993 verifyFormat("int a = 5 + -2;"); 6994 verifyFormat("if (i == -1) {\n}"); 6995 verifyFormat("if (i != -1) {\n}"); 6996 verifyFormat("if (i > -1) {\n}"); 6997 verifyFormat("if (i < -1) {\n}"); 6998 verifyFormat("++(a->f());"); 6999 verifyFormat("--(a->f());"); 7000 verifyFormat("(a->f())++;"); 7001 verifyFormat("a[42]++;"); 7002 verifyFormat("if (!(a->f())) {\n}"); 7003 verifyFormat("if (!+i) {\n}"); 7004 verifyFormat("~&a;"); 7005 7006 verifyFormat("a-- > b;"); 7007 verifyFormat("b ? -a : c;"); 7008 verifyFormat("n * sizeof char16;"); 7009 verifyFormat("n * alignof char16;", getGoogleStyle()); 7010 verifyFormat("sizeof(char);"); 7011 verifyFormat("alignof(char);", getGoogleStyle()); 7012 7013 verifyFormat("return -1;"); 7014 verifyFormat("throw -1;"); 7015 verifyFormat("switch (a) {\n" 7016 "case -1:\n" 7017 " break;\n" 7018 "}"); 7019 verifyFormat("#define X -1"); 7020 verifyFormat("#define X -kConstant"); 7021 7022 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7023 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7024 7025 verifyFormat("int a = /* confusing comment */ -1;"); 7026 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7027 verifyFormat("int a = i /* confusing comment */++;"); 7028 7029 verifyFormat("co_yield -1;"); 7030 verifyFormat("co_return -1;"); 7031 } 7032 7033 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7034 verifyFormat("if (!aaaaaaaaaa( // break\n" 7035 " aaaaa)) {\n" 7036 "}"); 7037 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7038 " aaaaa));"); 7039 verifyFormat("*aaa = aaaaaaa( // break\n" 7040 " bbbbbb);"); 7041 } 7042 7043 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7044 verifyFormat("bool operator<();"); 7045 verifyFormat("bool operator>();"); 7046 verifyFormat("bool operator=();"); 7047 verifyFormat("bool operator==();"); 7048 verifyFormat("bool operator!=();"); 7049 verifyFormat("int operator+();"); 7050 verifyFormat("int operator++();"); 7051 verifyFormat("int operator++(int) volatile noexcept;"); 7052 verifyFormat("bool operator,();"); 7053 verifyFormat("bool operator();"); 7054 verifyFormat("bool operator()();"); 7055 verifyFormat("bool operator[]();"); 7056 verifyFormat("operator bool();"); 7057 verifyFormat("operator int();"); 7058 verifyFormat("operator void *();"); 7059 verifyFormat("operator SomeType<int>();"); 7060 verifyFormat("operator SomeType<int, int>();"); 7061 verifyFormat("operator SomeType<SomeType<int>>();"); 7062 verifyFormat("void *operator new(std::size_t size);"); 7063 verifyFormat("void *operator new[](std::size_t size);"); 7064 verifyFormat("void operator delete(void *ptr);"); 7065 verifyFormat("void operator delete[](void *ptr);"); 7066 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7067 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7068 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7069 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7070 7071 verifyFormat( 7072 "ostream &operator<<(ostream &OutputStream,\n" 7073 " SomeReallyLongType WithSomeReallyLongValue);"); 7074 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7075 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7076 " return left.group < right.group;\n" 7077 "}"); 7078 verifyFormat("SomeType &operator=(const SomeType &S);"); 7079 verifyFormat("f.template operator()<int>();"); 7080 7081 verifyGoogleFormat("operator void*();"); 7082 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7083 verifyGoogleFormat("operator ::A();"); 7084 7085 verifyFormat("using A::operator+;"); 7086 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7087 "int i;"); 7088 } 7089 7090 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7091 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7092 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7093 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7094 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7095 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7096 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7097 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7098 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7099 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7100 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7101 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7102 verifyFormat("void Fn(T const &) const &;"); 7103 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7104 verifyFormat("template <typename T>\n" 7105 "void F(T) && = delete;", 7106 getGoogleStyle()); 7107 7108 FormatStyle AlignLeft = getLLVMStyle(); 7109 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7110 verifyFormat("void A::b() && {}", AlignLeft); 7111 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7112 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7113 AlignLeft); 7114 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7115 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7116 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7117 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7118 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7119 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7120 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7121 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7122 7123 FormatStyle Spaces = getLLVMStyle(); 7124 Spaces.SpacesInCStyleCastParentheses = true; 7125 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7126 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7127 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7128 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7129 7130 Spaces.SpacesInCStyleCastParentheses = false; 7131 Spaces.SpacesInParentheses = true; 7132 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7133 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7134 Spaces); 7135 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7136 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7137 7138 FormatStyle BreakTemplate = getLLVMStyle(); 7139 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7140 7141 verifyFormat("struct f {\n" 7142 " template <class T>\n" 7143 " int &foo(const std::string &str) &noexcept {}\n" 7144 "};", 7145 BreakTemplate); 7146 7147 verifyFormat("struct f {\n" 7148 " template <class T>\n" 7149 " int &foo(const std::string &str) &&noexcept {}\n" 7150 "};", 7151 BreakTemplate); 7152 7153 verifyFormat("struct f {\n" 7154 " template <class T>\n" 7155 " int &foo(const std::string &str) const &noexcept {}\n" 7156 "};", 7157 BreakTemplate); 7158 7159 verifyFormat("struct f {\n" 7160 " template <class T>\n" 7161 " int &foo(const std::string &str) const &noexcept {}\n" 7162 "};", 7163 BreakTemplate); 7164 7165 verifyFormat("struct f {\n" 7166 " template <class T>\n" 7167 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7168 "};", 7169 BreakTemplate); 7170 7171 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7172 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7173 FormatStyle::BTDS_Yes; 7174 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7175 7176 verifyFormat("struct f {\n" 7177 " template <class T>\n" 7178 " int& foo(const std::string& str) & noexcept {}\n" 7179 "};", 7180 AlignLeftBreakTemplate); 7181 7182 verifyFormat("struct f {\n" 7183 " template <class T>\n" 7184 " int& foo(const std::string& str) && noexcept {}\n" 7185 "};", 7186 AlignLeftBreakTemplate); 7187 7188 verifyFormat("struct f {\n" 7189 " template <class T>\n" 7190 " int& foo(const std::string& str) const& noexcept {}\n" 7191 "};", 7192 AlignLeftBreakTemplate); 7193 7194 verifyFormat("struct f {\n" 7195 " template <class T>\n" 7196 " int& foo(const std::string& str) const&& noexcept {}\n" 7197 "};", 7198 AlignLeftBreakTemplate); 7199 7200 verifyFormat("struct f {\n" 7201 " template <class T>\n" 7202 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7203 "};", 7204 AlignLeftBreakTemplate); 7205 7206 // The `&` in `Type&` should not be confused with a trailing `&` of 7207 // DEPRECATED(reason) member function. 7208 verifyFormat("struct f {\n" 7209 " template <class T>\n" 7210 " DEPRECATED(reason)\n" 7211 " Type &foo(arguments) {}\n" 7212 "};", 7213 BreakTemplate); 7214 7215 verifyFormat("struct f {\n" 7216 " template <class T>\n" 7217 " DEPRECATED(reason)\n" 7218 " Type& foo(arguments) {}\n" 7219 "};", 7220 AlignLeftBreakTemplate); 7221 7222 verifyFormat("void (*foopt)(int) = &func;"); 7223 } 7224 7225 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7226 verifyFormat("void f() {\n" 7227 " A *a = new A;\n" 7228 " A *a = new (placement) A;\n" 7229 " delete a;\n" 7230 " delete (A *)a;\n" 7231 "}"); 7232 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7233 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7234 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7235 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7236 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7237 verifyFormat("delete[] h->p;"); 7238 } 7239 7240 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7241 verifyFormat("int *f(int *a) {}"); 7242 verifyFormat("int main(int argc, char **argv) {}"); 7243 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7244 verifyIndependentOfContext("f(a, *a);"); 7245 verifyFormat("void g() { f(*a); }"); 7246 verifyIndependentOfContext("int a = b * 10;"); 7247 verifyIndependentOfContext("int a = 10 * b;"); 7248 verifyIndependentOfContext("int a = b * c;"); 7249 verifyIndependentOfContext("int a += b * c;"); 7250 verifyIndependentOfContext("int a -= b * c;"); 7251 verifyIndependentOfContext("int a *= b * c;"); 7252 verifyIndependentOfContext("int a /= b * c;"); 7253 verifyIndependentOfContext("int a = *b;"); 7254 verifyIndependentOfContext("int a = *b * c;"); 7255 verifyIndependentOfContext("int a = b * *c;"); 7256 verifyIndependentOfContext("int a = b * (10);"); 7257 verifyIndependentOfContext("S << b * (10);"); 7258 verifyIndependentOfContext("return 10 * b;"); 7259 verifyIndependentOfContext("return *b * *c;"); 7260 verifyIndependentOfContext("return a & ~b;"); 7261 verifyIndependentOfContext("f(b ? *c : *d);"); 7262 verifyIndependentOfContext("int a = b ? *c : *d;"); 7263 verifyIndependentOfContext("*b = a;"); 7264 verifyIndependentOfContext("a * ~b;"); 7265 verifyIndependentOfContext("a * !b;"); 7266 verifyIndependentOfContext("a * +b;"); 7267 verifyIndependentOfContext("a * -b;"); 7268 verifyIndependentOfContext("a * ++b;"); 7269 verifyIndependentOfContext("a * --b;"); 7270 verifyIndependentOfContext("a[4] * b;"); 7271 verifyIndependentOfContext("a[a * a] = 1;"); 7272 verifyIndependentOfContext("f() * b;"); 7273 verifyIndependentOfContext("a * [self dostuff];"); 7274 verifyIndependentOfContext("int x = a * (a + b);"); 7275 verifyIndependentOfContext("(a *)(a + b);"); 7276 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7277 verifyIndependentOfContext("int *pa = (int *)&a;"); 7278 verifyIndependentOfContext("return sizeof(int **);"); 7279 verifyIndependentOfContext("return sizeof(int ******);"); 7280 verifyIndependentOfContext("return (int **&)a;"); 7281 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7282 verifyFormat("void f(Type (*parameter)[10]) {}"); 7283 verifyFormat("void f(Type (¶meter)[10]) {}"); 7284 verifyGoogleFormat("return sizeof(int**);"); 7285 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7286 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7287 verifyFormat("auto a = [](int **&, int ***) {};"); 7288 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7289 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7290 verifyFormat("[](const decltype(*a) &value) {}"); 7291 verifyFormat("decltype(a * b) F();"); 7292 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7293 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7294 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7295 verifyIndependentOfContext("int i{a * b};"); 7296 verifyIndependentOfContext("aaa && aaa->f();"); 7297 verifyIndependentOfContext("int x = ~*p;"); 7298 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7299 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7300 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7301 verifyFormat("void f() { f(a, c * d); }"); 7302 verifyFormat("void f() { f(new a(), c * d); }"); 7303 verifyFormat("void f(const MyOverride &override);"); 7304 verifyFormat("void f(const MyFinal &final);"); 7305 verifyIndependentOfContext("bool a = f() && override.f();"); 7306 verifyIndependentOfContext("bool a = f() && final.f();"); 7307 7308 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7309 7310 verifyIndependentOfContext("A<int *> a;"); 7311 verifyIndependentOfContext("A<int **> a;"); 7312 verifyIndependentOfContext("A<int *, int *> a;"); 7313 verifyIndependentOfContext("A<int *[]> a;"); 7314 verifyIndependentOfContext( 7315 "const char *const p = reinterpret_cast<const char *const>(q);"); 7316 verifyIndependentOfContext("A<int **, int **> a;"); 7317 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7318 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7319 verifyFormat("for (; a && b;) {\n}"); 7320 verifyFormat("bool foo = true && [] { return false; }();"); 7321 7322 verifyFormat( 7323 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7324 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7325 7326 verifyGoogleFormat("int const* a = &b;"); 7327 verifyGoogleFormat("**outparam = 1;"); 7328 verifyGoogleFormat("*outparam = a * b;"); 7329 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7330 verifyGoogleFormat("A<int*> a;"); 7331 verifyGoogleFormat("A<int**> a;"); 7332 verifyGoogleFormat("A<int*, int*> a;"); 7333 verifyGoogleFormat("A<int**, int**> a;"); 7334 verifyGoogleFormat("f(b ? *c : *d);"); 7335 verifyGoogleFormat("int a = b ? *c : *d;"); 7336 verifyGoogleFormat("Type* t = **x;"); 7337 verifyGoogleFormat("Type* t = *++*x;"); 7338 verifyGoogleFormat("*++*x;"); 7339 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7340 verifyGoogleFormat("Type* t = x++ * y;"); 7341 verifyGoogleFormat( 7342 "const char* const p = reinterpret_cast<const char* const>(q);"); 7343 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7344 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7345 verifyGoogleFormat("template <typename T>\n" 7346 "void f(int i = 0, SomeType** temps = NULL);"); 7347 7348 FormatStyle Left = getLLVMStyle(); 7349 Left.PointerAlignment = FormatStyle::PAS_Left; 7350 verifyFormat("x = *a(x) = *a(y);", Left); 7351 verifyFormat("for (;; *a = b) {\n}", Left); 7352 verifyFormat("return *this += 1;", Left); 7353 verifyFormat("throw *x;", Left); 7354 verifyFormat("delete *x;", Left); 7355 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7356 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7357 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7358 7359 verifyIndependentOfContext("a = *(x + y);"); 7360 verifyIndependentOfContext("a = &(x + y);"); 7361 verifyIndependentOfContext("*(x + y).call();"); 7362 verifyIndependentOfContext("&(x + y)->call();"); 7363 verifyFormat("void f() { &(*I).first; }"); 7364 7365 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7366 verifyFormat( 7367 "int *MyValues = {\n" 7368 " *A, // Operator detection might be confused by the '{'\n" 7369 " *BB // Operator detection might be confused by previous comment\n" 7370 "};"); 7371 7372 verifyIndependentOfContext("if (int *a = &b)"); 7373 verifyIndependentOfContext("if (int &a = *b)"); 7374 verifyIndependentOfContext("if (a & b[i])"); 7375 verifyIndependentOfContext("if constexpr (a & b[i])"); 7376 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7377 verifyIndependentOfContext("if (a * (b * c))"); 7378 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7379 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7380 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7381 verifyIndependentOfContext("if (*b[i])"); 7382 verifyIndependentOfContext("if (int *a = (&b))"); 7383 verifyIndependentOfContext("while (int *a = &b)"); 7384 verifyIndependentOfContext("while (a * (b * c))"); 7385 verifyIndependentOfContext("size = sizeof *a;"); 7386 verifyIndependentOfContext("if (a && (b = c))"); 7387 verifyFormat("void f() {\n" 7388 " for (const int &v : Values) {\n" 7389 " }\n" 7390 "}"); 7391 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7392 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7393 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7394 7395 verifyFormat("#define A (!a * b)"); 7396 verifyFormat("#define MACRO \\\n" 7397 " int *i = a * b; \\\n" 7398 " void f(a *b);", 7399 getLLVMStyleWithColumns(19)); 7400 7401 verifyIndependentOfContext("A = new SomeType *[Length];"); 7402 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7403 verifyIndependentOfContext("T **t = new T *;"); 7404 verifyIndependentOfContext("T **t = new T *();"); 7405 verifyGoogleFormat("A = new SomeType*[Length]();"); 7406 verifyGoogleFormat("A = new SomeType*[Length];"); 7407 verifyGoogleFormat("T** t = new T*;"); 7408 verifyGoogleFormat("T** t = new T*();"); 7409 7410 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7411 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7412 verifyFormat("template <bool a, bool b> " 7413 "typename t::if<x && y>::type f() {}"); 7414 verifyFormat("template <int *y> f() {}"); 7415 verifyFormat("vector<int *> v;"); 7416 verifyFormat("vector<int *const> v;"); 7417 verifyFormat("vector<int *const **const *> v;"); 7418 verifyFormat("vector<int *volatile> v;"); 7419 verifyFormat("vector<a * b> v;"); 7420 verifyFormat("foo<b && false>();"); 7421 verifyFormat("foo<b & 1>();"); 7422 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7423 verifyFormat( 7424 "template <class T, class = typename std::enable_if<\n" 7425 " std::is_integral<T>::value &&\n" 7426 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7427 "void F();", 7428 getLLVMStyleWithColumns(70)); 7429 verifyFormat("template <class T,\n" 7430 " class = typename std::enable_if<\n" 7431 " std::is_integral<T>::value &&\n" 7432 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7433 " class U>\n" 7434 "void F();", 7435 getLLVMStyleWithColumns(70)); 7436 verifyFormat( 7437 "template <class T,\n" 7438 " class = typename ::std::enable_if<\n" 7439 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7440 "void F();", 7441 getGoogleStyleWithColumns(68)); 7442 7443 verifyIndependentOfContext("MACRO(int *i);"); 7444 verifyIndependentOfContext("MACRO(auto *a);"); 7445 verifyIndependentOfContext("MACRO(const A *a);"); 7446 verifyIndependentOfContext("MACRO(A *const a);"); 7447 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7448 verifyFormat("void f() { f(float{1}, a * a); }"); 7449 // FIXME: Is there a way to make this work? 7450 // verifyIndependentOfContext("MACRO(A *a);"); 7451 7452 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7453 verifyFormat("return options != nullptr && operator==(*options);"); 7454 7455 EXPECT_EQ("#define OP(x) \\\n" 7456 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7457 " return s << a.DebugString(); \\\n" 7458 " }", 7459 format("#define OP(x) \\\n" 7460 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7461 " return s << a.DebugString(); \\\n" 7462 " }", 7463 getLLVMStyleWithColumns(50))); 7464 7465 // FIXME: We cannot handle this case yet; we might be able to figure out that 7466 // foo<x> d > v; doesn't make sense. 7467 verifyFormat("foo<a<b && c> d> v;"); 7468 7469 FormatStyle PointerMiddle = getLLVMStyle(); 7470 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7471 verifyFormat("delete *x;", PointerMiddle); 7472 verifyFormat("int * x;", PointerMiddle); 7473 verifyFormat("int *[] x;", PointerMiddle); 7474 verifyFormat("template <int * y> f() {}", PointerMiddle); 7475 verifyFormat("int * f(int * a) {}", PointerMiddle); 7476 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7477 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7478 verifyFormat("A<int *> a;", PointerMiddle); 7479 verifyFormat("A<int **> a;", PointerMiddle); 7480 verifyFormat("A<int *, int *> a;", PointerMiddle); 7481 verifyFormat("A<int *[]> a;", PointerMiddle); 7482 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7483 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7484 verifyFormat("T ** t = new T *;", PointerMiddle); 7485 7486 // Member function reference qualifiers aren't binary operators. 7487 verifyFormat("string // break\n" 7488 "operator()() & {}"); 7489 verifyFormat("string // break\n" 7490 "operator()() && {}"); 7491 verifyGoogleFormat("template <typename T>\n" 7492 "auto x() & -> int {}"); 7493 } 7494 7495 TEST_F(FormatTest, UnderstandsAttributes) { 7496 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7497 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7498 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7499 FormatStyle AfterType = getLLVMStyle(); 7500 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7501 verifyFormat("__attribute__((nodebug)) void\n" 7502 "foo() {}\n", 7503 AfterType); 7504 } 7505 7506 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7507 verifyFormat("SomeType s [[unused]] (InitValue);"); 7508 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7509 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7510 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7511 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7512 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7513 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7514 7515 // Make sure we do not mistake attributes for array subscripts. 7516 verifyFormat("int a() {}\n" 7517 "[[unused]] int b() {}\n"); 7518 verifyFormat("NSArray *arr;\n" 7519 "arr[[Foo() bar]];"); 7520 7521 // On the other hand, we still need to correctly find array subscripts. 7522 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7523 7524 // Make sure that we do not mistake Objective-C method inside array literals 7525 // as attributes, even if those method names are also keywords. 7526 verifyFormat("@[ [foo bar] ];"); 7527 verifyFormat("@[ [NSArray class] ];"); 7528 verifyFormat("@[ [foo enum] ];"); 7529 7530 // Make sure we do not parse attributes as lambda introducers. 7531 FormatStyle MultiLineFunctions = getLLVMStyle(); 7532 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7533 verifyFormat("[[unused]] int b() {\n" 7534 " return 42;\n" 7535 "}\n", 7536 MultiLineFunctions); 7537 } 7538 7539 TEST_F(FormatTest, UnderstandsEllipsis) { 7540 verifyFormat("int printf(const char *fmt, ...);"); 7541 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7542 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7543 7544 FormatStyle PointersLeft = getLLVMStyle(); 7545 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7546 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7547 } 7548 7549 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7550 EXPECT_EQ("int *a;\n" 7551 "int *a;\n" 7552 "int *a;", 7553 format("int *a;\n" 7554 "int* a;\n" 7555 "int *a;", 7556 getGoogleStyle())); 7557 EXPECT_EQ("int* a;\n" 7558 "int* a;\n" 7559 "int* a;", 7560 format("int* a;\n" 7561 "int* a;\n" 7562 "int *a;", 7563 getGoogleStyle())); 7564 EXPECT_EQ("int *a;\n" 7565 "int *a;\n" 7566 "int *a;", 7567 format("int *a;\n" 7568 "int * a;\n" 7569 "int * a;", 7570 getGoogleStyle())); 7571 EXPECT_EQ("auto x = [] {\n" 7572 " int *a;\n" 7573 " int *a;\n" 7574 " int *a;\n" 7575 "};", 7576 format("auto x=[]{int *a;\n" 7577 "int * a;\n" 7578 "int * a;};", 7579 getGoogleStyle())); 7580 } 7581 7582 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7583 verifyFormat("int f(int &&a) {}"); 7584 verifyFormat("int f(int a, char &&b) {}"); 7585 verifyFormat("void f() { int &&a = b; }"); 7586 verifyGoogleFormat("int f(int a, char&& b) {}"); 7587 verifyGoogleFormat("void f() { int&& a = b; }"); 7588 7589 verifyIndependentOfContext("A<int &&> a;"); 7590 verifyIndependentOfContext("A<int &&, int &&> a;"); 7591 verifyGoogleFormat("A<int&&> a;"); 7592 verifyGoogleFormat("A<int&&, int&&> a;"); 7593 7594 // Not rvalue references: 7595 verifyFormat("template <bool B, bool C> class A {\n" 7596 " static_assert(B && C, \"Something is wrong\");\n" 7597 "};"); 7598 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7599 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7600 verifyFormat("#define A(a, b) (a && b)"); 7601 } 7602 7603 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7604 verifyFormat("void f() {\n" 7605 " x[aaaaaaaaa -\n" 7606 " b] = 23;\n" 7607 "}", 7608 getLLVMStyleWithColumns(15)); 7609 } 7610 7611 TEST_F(FormatTest, FormatsCasts) { 7612 verifyFormat("Type *A = static_cast<Type *>(P);"); 7613 verifyFormat("Type *A = (Type *)P;"); 7614 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7615 verifyFormat("int a = (int)(2.0f);"); 7616 verifyFormat("int a = (int)2.0f;"); 7617 verifyFormat("x[(int32)y];"); 7618 verifyFormat("x = (int32)y;"); 7619 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7620 verifyFormat("int a = (int)*b;"); 7621 verifyFormat("int a = (int)2.0f;"); 7622 verifyFormat("int a = (int)~0;"); 7623 verifyFormat("int a = (int)++a;"); 7624 verifyFormat("int a = (int)sizeof(int);"); 7625 verifyFormat("int a = (int)+2;"); 7626 verifyFormat("my_int a = (my_int)2.0f;"); 7627 verifyFormat("my_int a = (my_int)sizeof(int);"); 7628 verifyFormat("return (my_int)aaa;"); 7629 verifyFormat("#define x ((int)-1)"); 7630 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7631 verifyFormat("#define p(q) ((int *)&q)"); 7632 verifyFormat("fn(a)(b) + 1;"); 7633 7634 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7635 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7636 verifyFormat("my_int a = (my_int)~0;"); 7637 verifyFormat("my_int a = (my_int)++a;"); 7638 verifyFormat("my_int a = (my_int)-2;"); 7639 verifyFormat("my_int a = (my_int)1;"); 7640 verifyFormat("my_int a = (my_int *)1;"); 7641 verifyFormat("my_int a = (const my_int)-1;"); 7642 verifyFormat("my_int a = (const my_int *)-1;"); 7643 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7644 verifyFormat("my_int a = (ns::my_int)-2;"); 7645 verifyFormat("case (my_int)ONE:"); 7646 verifyFormat("auto x = (X)this;"); 7647 // Casts in Obj-C style calls used to not be recognized as such. 7648 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 7649 7650 // FIXME: single value wrapped with paren will be treated as cast. 7651 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7652 7653 verifyFormat("{ (void)F; }"); 7654 7655 // Don't break after a cast's 7656 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7657 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7658 " bbbbbbbbbbbbbbbbbbbbbb);"); 7659 7660 // These are not casts. 7661 verifyFormat("void f(int *) {}"); 7662 verifyFormat("f(foo)->b;"); 7663 verifyFormat("f(foo).b;"); 7664 verifyFormat("f(foo)(b);"); 7665 verifyFormat("f(foo)[b];"); 7666 verifyFormat("[](foo) { return 4; }(bar);"); 7667 verifyFormat("(*funptr)(foo)[4];"); 7668 verifyFormat("funptrs[4](foo)[4];"); 7669 verifyFormat("void f(int *);"); 7670 verifyFormat("void f(int *) = 0;"); 7671 verifyFormat("void f(SmallVector<int>) {}"); 7672 verifyFormat("void f(SmallVector<int>);"); 7673 verifyFormat("void f(SmallVector<int>) = 0;"); 7674 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7675 verifyFormat("int a = sizeof(int) * b;"); 7676 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7677 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7678 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7679 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7680 7681 // These are not casts, but at some point were confused with casts. 7682 verifyFormat("virtual void foo(int *) override;"); 7683 verifyFormat("virtual void foo(char &) const;"); 7684 verifyFormat("virtual void foo(int *a, char *) const;"); 7685 verifyFormat("int a = sizeof(int *) + b;"); 7686 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7687 verifyFormat("bool b = f(g<int>) && c;"); 7688 verifyFormat("typedef void (*f)(int i) func;"); 7689 verifyFormat("void operator++(int) noexcept;"); 7690 verifyFormat("void operator++(int &) noexcept;"); 7691 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 7692 "&) noexcept;"); 7693 verifyFormat( 7694 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 7695 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 7696 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 7697 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 7698 verifyFormat("void operator delete(foo &) noexcept;"); 7699 verifyFormat("void operator delete(foo) noexcept;"); 7700 verifyFormat("void operator delete(int) noexcept;"); 7701 verifyFormat("void operator delete(int &) noexcept;"); 7702 verifyFormat("void operator delete(int &) volatile noexcept;"); 7703 verifyFormat("void operator delete(int &) const"); 7704 verifyFormat("void operator delete(int &) = default"); 7705 verifyFormat("void operator delete(int &) = delete"); 7706 verifyFormat("void operator delete(int &) [[noreturn]]"); 7707 verifyFormat("void operator delete(int &) throw();"); 7708 verifyFormat("void operator delete(int &) throw(int);"); 7709 verifyFormat("auto operator delete(int &) -> int;"); 7710 verifyFormat("auto operator delete(int &) override"); 7711 verifyFormat("auto operator delete(int &) final"); 7712 7713 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7714 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7715 // FIXME: The indentation here is not ideal. 7716 verifyFormat( 7717 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7718 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7719 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7720 } 7721 7722 TEST_F(FormatTest, FormatsFunctionTypes) { 7723 verifyFormat("A<bool()> a;"); 7724 verifyFormat("A<SomeType()> a;"); 7725 verifyFormat("A<void (*)(int, std::string)> a;"); 7726 verifyFormat("A<void *(int)>;"); 7727 verifyFormat("void *(*a)(int *, SomeType *);"); 7728 verifyFormat("int (*func)(void *);"); 7729 verifyFormat("void f() { int (*func)(void *); }"); 7730 verifyFormat("template <class CallbackClass>\n" 7731 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7732 7733 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7734 verifyGoogleFormat("void* (*a)(int);"); 7735 verifyGoogleFormat( 7736 "template <class CallbackClass>\n" 7737 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7738 7739 // Other constructs can look somewhat like function types: 7740 verifyFormat("A<sizeof(*x)> a;"); 7741 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7742 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7743 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7744 verifyFormat("int x = f(&h)();"); 7745 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7746 verifyFormat("std::function<\n" 7747 " LooooooooooongTemplatedType<\n" 7748 " SomeType>*(\n" 7749 " LooooooooooooooooongType type)>\n" 7750 " function;", 7751 getGoogleStyleWithColumns(40)); 7752 } 7753 7754 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7755 verifyFormat("A (*foo_)[6];"); 7756 verifyFormat("vector<int> (*foo_)[6];"); 7757 } 7758 7759 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7760 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7761 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7762 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7763 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7764 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7765 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7766 7767 // Different ways of ()-initializiation. 7768 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7769 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7770 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7771 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7772 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7773 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7774 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7775 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7776 7777 // Lambdas should not confuse the variable declaration heuristic. 7778 verifyFormat("LooooooooooooooooongType\n" 7779 " variable(nullptr, [](A *a) {});", 7780 getLLVMStyleWithColumns(40)); 7781 } 7782 7783 TEST_F(FormatTest, BreaksLongDeclarations) { 7784 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7785 " AnotherNameForTheLongType;"); 7786 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7788 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7789 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7790 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7791 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7792 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7793 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7794 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7795 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7796 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7797 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7798 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7799 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7800 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7801 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7802 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7803 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7804 FormatStyle Indented = getLLVMStyle(); 7805 Indented.IndentWrappedFunctionNames = true; 7806 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7807 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7808 Indented); 7809 verifyFormat( 7810 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7811 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7812 Indented); 7813 verifyFormat( 7814 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7815 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7816 Indented); 7817 verifyFormat( 7818 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7819 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7820 Indented); 7821 7822 // FIXME: Without the comment, this breaks after "(". 7823 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7824 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7825 getGoogleStyle()); 7826 7827 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7828 " int LoooooooooooooooooooongParam2) {}"); 7829 verifyFormat( 7830 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7831 " SourceLocation L, IdentifierIn *II,\n" 7832 " Type *T) {}"); 7833 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7834 "ReallyReaaallyLongFunctionName(\n" 7835 " const std::string &SomeParameter,\n" 7836 " const SomeType<string, SomeOtherTemplateParameter>\n" 7837 " &ReallyReallyLongParameterName,\n" 7838 " const SomeType<string, SomeOtherTemplateParameter>\n" 7839 " &AnotherLongParameterName) {}"); 7840 verifyFormat("template <typename A>\n" 7841 "SomeLoooooooooooooooooooooongType<\n" 7842 " typename some_namespace::SomeOtherType<A>::Type>\n" 7843 "Function() {}"); 7844 7845 verifyGoogleFormat( 7846 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7847 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7848 verifyGoogleFormat( 7849 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7850 " SourceLocation L) {}"); 7851 verifyGoogleFormat( 7852 "some_namespace::LongReturnType\n" 7853 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7854 " int first_long_parameter, int second_parameter) {}"); 7855 7856 verifyGoogleFormat("template <typename T>\n" 7857 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7858 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7859 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7860 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7861 7862 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7863 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7864 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7865 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7866 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7867 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7868 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7869 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7870 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7872 7873 verifyFormat("template <typename T> // Templates on own line.\n" 7874 "static int // Some comment.\n" 7875 "MyFunction(int a);", 7876 getLLVMStyle()); 7877 } 7878 7879 TEST_F(FormatTest, FormatsArrays) { 7880 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7881 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7882 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7883 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7884 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7885 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7886 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7887 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7888 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7889 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7890 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7891 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7892 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7893 verifyFormat( 7894 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7895 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7896 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7897 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7898 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7899 7900 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7901 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7902 verifyFormat( 7903 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 7904 " .aaaaaaa[0]\n" 7905 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7906 verifyFormat("a[::b::c];"); 7907 7908 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 7909 7910 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 7911 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 7912 } 7913 7914 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 7915 verifyFormat("(a)->b();"); 7916 verifyFormat("--a;"); 7917 } 7918 7919 TEST_F(FormatTest, HandlesIncludeDirectives) { 7920 verifyFormat("#include <string>\n" 7921 "#include <a/b/c.h>\n" 7922 "#include \"a/b/string\"\n" 7923 "#include \"string.h\"\n" 7924 "#include \"string.h\"\n" 7925 "#include <a-a>\n" 7926 "#include < path with space >\n" 7927 "#include_next <test.h>" 7928 "#include \"abc.h\" // this is included for ABC\n" 7929 "#include \"some long include\" // with a comment\n" 7930 "#include \"some very long include path\"\n" 7931 "#include <some/very/long/include/path>\n", 7932 getLLVMStyleWithColumns(35)); 7933 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 7934 EXPECT_EQ("#include <a>", format("#include<a>")); 7935 7936 verifyFormat("#import <string>"); 7937 verifyFormat("#import <a/b/c.h>"); 7938 verifyFormat("#import \"a/b/string\""); 7939 verifyFormat("#import \"string.h\""); 7940 verifyFormat("#import \"string.h\""); 7941 verifyFormat("#if __has_include(<strstream>)\n" 7942 "#include <strstream>\n" 7943 "#endif"); 7944 7945 verifyFormat("#define MY_IMPORT <a/b>"); 7946 7947 verifyFormat("#if __has_include(<a/b>)"); 7948 verifyFormat("#if __has_include_next(<a/b>)"); 7949 verifyFormat("#define F __has_include(<a/b>)"); 7950 verifyFormat("#define F __has_include_next(<a/b>)"); 7951 7952 // Protocol buffer definition or missing "#". 7953 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 7954 getLLVMStyleWithColumns(30)); 7955 7956 FormatStyle Style = getLLVMStyle(); 7957 Style.AlwaysBreakBeforeMultilineStrings = true; 7958 Style.ColumnLimit = 0; 7959 verifyFormat("#import \"abc.h\"", Style); 7960 7961 // But 'import' might also be a regular C++ namespace. 7962 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7964 } 7965 7966 //===----------------------------------------------------------------------===// 7967 // Error recovery tests. 7968 //===----------------------------------------------------------------------===// 7969 7970 TEST_F(FormatTest, IncompleteParameterLists) { 7971 FormatStyle NoBinPacking = getLLVMStyle(); 7972 NoBinPacking.BinPackParameters = false; 7973 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 7974 " double *min_x,\n" 7975 " double *max_x,\n" 7976 " double *min_y,\n" 7977 " double *max_y,\n" 7978 " double *min_z,\n" 7979 " double *max_z, ) {}", 7980 NoBinPacking); 7981 } 7982 7983 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 7984 verifyFormat("void f() { return; }\n42"); 7985 verifyFormat("void f() {\n" 7986 " if (0)\n" 7987 " return;\n" 7988 "}\n" 7989 "42"); 7990 verifyFormat("void f() { return }\n42"); 7991 verifyFormat("void f() {\n" 7992 " if (0)\n" 7993 " return\n" 7994 "}\n" 7995 "42"); 7996 } 7997 7998 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 7999 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 8000 EXPECT_EQ("void f() {\n" 8001 " if (a)\n" 8002 " return\n" 8003 "}", 8004 format("void f ( ) { if ( a ) return }")); 8005 EXPECT_EQ("namespace N {\n" 8006 "void f()\n" 8007 "}", 8008 format("namespace N { void f() }")); 8009 EXPECT_EQ("namespace N {\n" 8010 "void f() {}\n" 8011 "void g()\n" 8012 "} // namespace N", 8013 format("namespace N { void f( ) { } void g( ) }")); 8014 } 8015 8016 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 8017 verifyFormat("int aaaaaaaa =\n" 8018 " // Overlylongcomment\n" 8019 " b;", 8020 getLLVMStyleWithColumns(20)); 8021 verifyFormat("function(\n" 8022 " ShortArgument,\n" 8023 " LoooooooooooongArgument);\n", 8024 getLLVMStyleWithColumns(20)); 8025 } 8026 8027 TEST_F(FormatTest, IncorrectAccessSpecifier) { 8028 verifyFormat("public:"); 8029 verifyFormat("class A {\n" 8030 "public\n" 8031 " void f() {}\n" 8032 "};"); 8033 verifyFormat("public\n" 8034 "int qwerty;"); 8035 verifyFormat("public\n" 8036 "B {}"); 8037 verifyFormat("public\n" 8038 "{}"); 8039 verifyFormat("public\n" 8040 "B { int x; }"); 8041 } 8042 8043 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 8044 verifyFormat("{"); 8045 verifyFormat("#})"); 8046 verifyNoCrash("(/**/[:!] ?[)."); 8047 } 8048 8049 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 8050 // Found by oss-fuzz: 8051 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 8052 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 8053 Style.ColumnLimit = 60; 8054 verifyNoCrash( 8055 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 8056 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 8057 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 8058 Style); 8059 } 8060 8061 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 8062 verifyFormat("do {\n}"); 8063 verifyFormat("do {\n}\n" 8064 "f();"); 8065 verifyFormat("do {\n}\n" 8066 "wheeee(fun);"); 8067 verifyFormat("do {\n" 8068 " f();\n" 8069 "}"); 8070 } 8071 8072 TEST_F(FormatTest, IncorrectCodeMissingParens) { 8073 verifyFormat("if {\n foo;\n foo();\n}"); 8074 verifyFormat("switch {\n foo;\n foo();\n}"); 8075 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 8076 verifyFormat("while {\n foo;\n foo();\n}"); 8077 verifyFormat("do {\n foo;\n foo();\n} while;"); 8078 } 8079 8080 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 8081 verifyIncompleteFormat("namespace {\n" 8082 "class Foo { Foo (\n" 8083 "};\n" 8084 "} // namespace"); 8085 } 8086 8087 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 8088 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 8089 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 8090 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 8091 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 8092 8093 EXPECT_EQ("{\n" 8094 " {\n" 8095 " breakme(\n" 8096 " qwe);\n" 8097 " }\n", 8098 format("{\n" 8099 " {\n" 8100 " breakme(qwe);\n" 8101 "}\n", 8102 getLLVMStyleWithColumns(10))); 8103 } 8104 8105 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 8106 verifyFormat("int x = {\n" 8107 " avariable,\n" 8108 " b(alongervariable)};", 8109 getLLVMStyleWithColumns(25)); 8110 } 8111 8112 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 8113 verifyFormat("return (a)(b){1, 2, 3};"); 8114 } 8115 8116 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 8117 verifyFormat("vector<int> x{1, 2, 3, 4};"); 8118 verifyFormat("vector<int> x{\n" 8119 " 1,\n" 8120 " 2,\n" 8121 " 3,\n" 8122 " 4,\n" 8123 "};"); 8124 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 8125 verifyFormat("f({1, 2});"); 8126 verifyFormat("auto v = Foo{-1};"); 8127 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 8128 verifyFormat("Class::Class : member{1, 2, 3} {}"); 8129 verifyFormat("new vector<int>{1, 2, 3};"); 8130 verifyFormat("new int[3]{1, 2, 3};"); 8131 verifyFormat("new int{1};"); 8132 verifyFormat("return {arg1, arg2};"); 8133 verifyFormat("return {arg1, SomeType{parameter}};"); 8134 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 8135 verifyFormat("new T{arg1, arg2};"); 8136 verifyFormat("f(MyMap[{composite, key}]);"); 8137 verifyFormat("class Class {\n" 8138 " T member = {arg1, arg2};\n" 8139 "};"); 8140 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 8141 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 8142 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 8143 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 8144 verifyFormat("int a = std::is_integral<int>{} + 0;"); 8145 8146 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8147 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8148 verifyFormat("auto i = decltype(x){};"); 8149 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 8150 verifyFormat("Node n{1, Node{1000}, //\n" 8151 " 2};"); 8152 verifyFormat("Aaaa aaaaaaa{\n" 8153 " {\n" 8154 " aaaa,\n" 8155 " },\n" 8156 "};"); 8157 verifyFormat("class C : public D {\n" 8158 " SomeClass SC{2};\n" 8159 "};"); 8160 verifyFormat("class C : public A {\n" 8161 " class D : public B {\n" 8162 " void f() { int i{2}; }\n" 8163 " };\n" 8164 "};"); 8165 verifyFormat("#define A {a, a},"); 8166 8167 // Avoid breaking between equal sign and opening brace 8168 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 8169 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 8170 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 8171 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 8172 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 8173 " {\"ccccccccccccccccccccc\", 2}};", 8174 AvoidBreakingFirstArgument); 8175 8176 // Binpacking only if there is no trailing comma 8177 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 8178 " cccccccccc, dddddddddd};", 8179 getLLVMStyleWithColumns(50)); 8180 verifyFormat("const Aaaaaa aaaaa = {\n" 8181 " aaaaaaaaaaa,\n" 8182 " bbbbbbbbbbb,\n" 8183 " ccccccccccc,\n" 8184 " ddddddddddd,\n" 8185 "};", 8186 getLLVMStyleWithColumns(50)); 8187 8188 // Cases where distinguising braced lists and blocks is hard. 8189 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 8190 verifyFormat("void f() {\n" 8191 " return; // comment\n" 8192 "}\n" 8193 "SomeType t;"); 8194 verifyFormat("void f() {\n" 8195 " if (a) {\n" 8196 " f();\n" 8197 " }\n" 8198 "}\n" 8199 "SomeType t;"); 8200 8201 // In combination with BinPackArguments = false. 8202 FormatStyle NoBinPacking = getLLVMStyle(); 8203 NoBinPacking.BinPackArguments = false; 8204 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 8205 " bbbbb,\n" 8206 " ccccc,\n" 8207 " ddddd,\n" 8208 " eeeee,\n" 8209 " ffffff,\n" 8210 " ggggg,\n" 8211 " hhhhhh,\n" 8212 " iiiiii,\n" 8213 " jjjjjj,\n" 8214 " kkkkkk};", 8215 NoBinPacking); 8216 verifyFormat("const Aaaaaa aaaaa = {\n" 8217 " aaaaa,\n" 8218 " bbbbb,\n" 8219 " ccccc,\n" 8220 " ddddd,\n" 8221 " eeeee,\n" 8222 " ffffff,\n" 8223 " ggggg,\n" 8224 " hhhhhh,\n" 8225 " iiiiii,\n" 8226 " jjjjjj,\n" 8227 " kkkkkk,\n" 8228 "};", 8229 NoBinPacking); 8230 verifyFormat( 8231 "const Aaaaaa aaaaa = {\n" 8232 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 8233 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 8234 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 8235 "};", 8236 NoBinPacking); 8237 8238 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8239 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 8240 " CDDDP83848_BMCR_REGISTER,\n" 8241 " CDDDP83848_BMSR_REGISTER,\n" 8242 " CDDDP83848_RBR_REGISTER};", 8243 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 8244 " CDDDP83848_BMSR_REGISTER,\n" 8245 " CDDDP83848_RBR_REGISTER};", 8246 NoBinPacking)); 8247 8248 // FIXME: The alignment of these trailing comments might be bad. Then again, 8249 // this might be utterly useless in real code. 8250 verifyFormat("Constructor::Constructor()\n" 8251 " : some_value{ //\n" 8252 " aaaaaaa, //\n" 8253 " bbbbbbb} {}"); 8254 8255 // In braced lists, the first comment is always assumed to belong to the 8256 // first element. Thus, it can be moved to the next or previous line as 8257 // appropriate. 8258 EXPECT_EQ("function({// First element:\n" 8259 " 1,\n" 8260 " // Second element:\n" 8261 " 2});", 8262 format("function({\n" 8263 " // First element:\n" 8264 " 1,\n" 8265 " // Second element:\n" 8266 " 2});")); 8267 EXPECT_EQ("std::vector<int> MyNumbers{\n" 8268 " // First element:\n" 8269 " 1,\n" 8270 " // Second element:\n" 8271 " 2};", 8272 format("std::vector<int> MyNumbers{// First element:\n" 8273 " 1,\n" 8274 " // Second element:\n" 8275 " 2};", 8276 getLLVMStyleWithColumns(30))); 8277 // A trailing comma should still lead to an enforced line break and no 8278 // binpacking. 8279 EXPECT_EQ("vector<int> SomeVector = {\n" 8280 " // aaa\n" 8281 " 1,\n" 8282 " 2,\n" 8283 "};", 8284 format("vector<int> SomeVector = { // aaa\n" 8285 " 1, 2, };")); 8286 8287 FormatStyle ExtraSpaces = getLLVMStyle(); 8288 ExtraSpaces.Cpp11BracedListStyle = false; 8289 ExtraSpaces.ColumnLimit = 75; 8290 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8291 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8292 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8293 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8294 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8295 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8296 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8297 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8298 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8299 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8300 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8301 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8302 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8303 verifyFormat("class Class {\n" 8304 " T member = { arg1, arg2 };\n" 8305 "};", 8306 ExtraSpaces); 8307 verifyFormat( 8308 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8309 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8310 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8311 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8312 ExtraSpaces); 8313 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 8314 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 8315 ExtraSpaces); 8316 verifyFormat( 8317 "someFunction(OtherParam,\n" 8318 " BracedList{ // comment 1 (Forcing interesting break)\n" 8319 " param1, param2,\n" 8320 " // comment 2\n" 8321 " param3, param4 });", 8322 ExtraSpaces); 8323 verifyFormat( 8324 "std::this_thread::sleep_for(\n" 8325 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 8326 ExtraSpaces); 8327 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 8328 " aaaaaaa,\n" 8329 " aaaaaaaaaa,\n" 8330 " aaaaa,\n" 8331 " aaaaaaaaaaaaaaa,\n" 8332 " aaa,\n" 8333 " aaaaaaaaaa,\n" 8334 " a,\n" 8335 " aaaaaaaaaaaaaaaaaaaaa,\n" 8336 " aaaaaaaaaaaa,\n" 8337 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 8338 " aaaaaaa,\n" 8339 " a};"); 8340 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 8341 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 8342 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 8343 8344 // Avoid breaking between initializer/equal sign and opening brace 8345 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 8346 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 8347 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8348 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8349 " { \"ccccccccccccccccccccc\", 2 }\n" 8350 "};", 8351 ExtraSpaces); 8352 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 8353 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8354 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8355 " { \"ccccccccccccccccccccc\", 2 }\n" 8356 "};", 8357 ExtraSpaces); 8358 8359 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 8360 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 8361 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 8362 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 8363 8364 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 8365 SpaceBetweenBraces.SpacesInAngles = true; 8366 SpaceBetweenBraces.SpacesInParentheses = true; 8367 SpaceBetweenBraces.SpacesInSquareBrackets = true; 8368 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 8369 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 8370 verifyFormat("vector< int > x{ // comment 1\n" 8371 " 1, 2, 3, 4 };", 8372 SpaceBetweenBraces); 8373 SpaceBetweenBraces.ColumnLimit = 20; 8374 EXPECT_EQ("vector< int > x{\n" 8375 " 1, 2, 3, 4 };", 8376 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8377 SpaceBetweenBraces.ColumnLimit = 24; 8378 EXPECT_EQ("vector< int > x{ 1, 2,\n" 8379 " 3, 4 };", 8380 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8381 EXPECT_EQ("vector< int > x{\n" 8382 " 1,\n" 8383 " 2,\n" 8384 " 3,\n" 8385 " 4,\n" 8386 "};", 8387 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 8388 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 8389 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 8390 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 8391 } 8392 8393 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 8394 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8395 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8396 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8397 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8398 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8399 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8400 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 8401 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8402 " 1, 22, 333, 4444, 55555, //\n" 8403 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8404 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8405 verifyFormat( 8406 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8407 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8408 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 8409 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8410 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8411 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8412 " 7777777};"); 8413 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8414 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8415 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8416 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8417 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8418 " // Separating comment.\n" 8419 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8420 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8421 " // Leading comment\n" 8422 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8423 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8424 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8425 " 1, 1, 1, 1};", 8426 getLLVMStyleWithColumns(39)); 8427 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8428 " 1, 1, 1, 1};", 8429 getLLVMStyleWithColumns(38)); 8430 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 8431 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 8432 getLLVMStyleWithColumns(43)); 8433 verifyFormat( 8434 "static unsigned SomeValues[10][3] = {\n" 8435 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 8436 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 8437 verifyFormat("static auto fields = new vector<string>{\n" 8438 " \"aaaaaaaaaaaaa\",\n" 8439 " \"aaaaaaaaaaaaa\",\n" 8440 " \"aaaaaaaaaaaa\",\n" 8441 " \"aaaaaaaaaaaaaa\",\n" 8442 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8443 " \"aaaaaaaaaaaa\",\n" 8444 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8445 "};"); 8446 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8447 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8448 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8449 " 3, cccccccccccccccccccccc};", 8450 getLLVMStyleWithColumns(60)); 8451 8452 // Trailing commas. 8453 verifyFormat("vector<int> x = {\n" 8454 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8455 "};", 8456 getLLVMStyleWithColumns(39)); 8457 verifyFormat("vector<int> x = {\n" 8458 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8459 "};", 8460 getLLVMStyleWithColumns(39)); 8461 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8462 " 1, 1, 1, 1,\n" 8463 " /**/ /**/};", 8464 getLLVMStyleWithColumns(39)); 8465 8466 // Trailing comment in the first line. 8467 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8468 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8469 " 111111111, 222222222, 3333333333, 444444444, //\n" 8470 " 11111111, 22222222, 333333333, 44444444};"); 8471 // Trailing comment in the last line. 8472 verifyFormat("int aaaaa[] = {\n" 8473 " 1, 2, 3, // comment\n" 8474 " 4, 5, 6 // comment\n" 8475 "};"); 8476 8477 // With nested lists, we should either format one item per line or all nested 8478 // lists one on line. 8479 // FIXME: For some nested lists, we can do better. 8480 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8481 " {aaaaaaaaaaaaaaaaaaa},\n" 8482 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8483 " {aaaaaaaaaaaaaaaaa}};", 8484 getLLVMStyleWithColumns(60)); 8485 verifyFormat( 8486 "SomeStruct my_struct_array = {\n" 8487 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8488 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8489 " {aaa, aaa},\n" 8490 " {aaa, aaa},\n" 8491 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8492 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8493 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8494 8495 // No column layout should be used here. 8496 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8497 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8498 8499 verifyNoCrash("a<,"); 8500 8501 // No braced initializer here. 8502 verifyFormat("void f() {\n" 8503 " struct Dummy {};\n" 8504 " f(v);\n" 8505 "}"); 8506 8507 // Long lists should be formatted in columns even if they are nested. 8508 verifyFormat( 8509 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8510 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8511 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8512 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8513 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8514 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8515 8516 // Allow "single-column" layout even if that violates the column limit. There 8517 // isn't going to be a better way. 8518 verifyFormat("std::vector<int> a = {\n" 8519 " aaaaaaaa,\n" 8520 " aaaaaaaa,\n" 8521 " aaaaaaaa,\n" 8522 " aaaaaaaa,\n" 8523 " aaaaaaaaaa,\n" 8524 " aaaaaaaa,\n" 8525 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8526 getLLVMStyleWithColumns(30)); 8527 verifyFormat("vector<int> aaaa = {\n" 8528 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8529 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8530 " aaaaaa.aaaaaaa,\n" 8531 " aaaaaa.aaaaaaa,\n" 8532 " aaaaaa.aaaaaaa,\n" 8533 " aaaaaa.aaaaaaa,\n" 8534 "};"); 8535 8536 // Don't create hanging lists. 8537 verifyFormat("someFunction(Param, {List1, List2,\n" 8538 " List3});", 8539 getLLVMStyleWithColumns(35)); 8540 verifyFormat("someFunction(Param, Param,\n" 8541 " {List1, List2,\n" 8542 " List3});", 8543 getLLVMStyleWithColumns(35)); 8544 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8545 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8546 } 8547 8548 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8549 FormatStyle DoNotMerge = getLLVMStyle(); 8550 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8551 8552 verifyFormat("void f() { return 42; }"); 8553 verifyFormat("void f() {\n" 8554 " return 42;\n" 8555 "}", 8556 DoNotMerge); 8557 verifyFormat("void f() {\n" 8558 " // Comment\n" 8559 "}"); 8560 verifyFormat("{\n" 8561 "#error {\n" 8562 " int a;\n" 8563 "}"); 8564 verifyFormat("{\n" 8565 " int a;\n" 8566 "#error {\n" 8567 "}"); 8568 verifyFormat("void f() {} // comment"); 8569 verifyFormat("void f() { int a; } // comment"); 8570 verifyFormat("void f() {\n" 8571 "} // comment", 8572 DoNotMerge); 8573 verifyFormat("void f() {\n" 8574 " int a;\n" 8575 "} // comment", 8576 DoNotMerge); 8577 verifyFormat("void f() {\n" 8578 "} // comment", 8579 getLLVMStyleWithColumns(15)); 8580 8581 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8582 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8583 8584 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8585 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8586 verifyFormat("class C {\n" 8587 " C()\n" 8588 " : iiiiiiii(nullptr),\n" 8589 " kkkkkkk(nullptr),\n" 8590 " mmmmmmm(nullptr),\n" 8591 " nnnnnnn(nullptr) {}\n" 8592 "};", 8593 getGoogleStyle()); 8594 8595 FormatStyle NoColumnLimit = getLLVMStyle(); 8596 NoColumnLimit.ColumnLimit = 0; 8597 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8598 EXPECT_EQ("class C {\n" 8599 " A() : b(0) {}\n" 8600 "};", 8601 format("class C{A():b(0){}};", NoColumnLimit)); 8602 EXPECT_EQ("A()\n" 8603 " : b(0) {\n" 8604 "}", 8605 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8606 8607 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8608 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8609 FormatStyle::SFS_None; 8610 EXPECT_EQ("A()\n" 8611 " : b(0) {\n" 8612 "}", 8613 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8614 EXPECT_EQ("A()\n" 8615 " : b(0) {\n" 8616 "}", 8617 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8618 8619 verifyFormat("#define A \\\n" 8620 " void f() { \\\n" 8621 " int i; \\\n" 8622 " }", 8623 getLLVMStyleWithColumns(20)); 8624 verifyFormat("#define A \\\n" 8625 " void f() { int i; }", 8626 getLLVMStyleWithColumns(21)); 8627 verifyFormat("#define A \\\n" 8628 " void f() { \\\n" 8629 " int i; \\\n" 8630 " } \\\n" 8631 " int j;", 8632 getLLVMStyleWithColumns(22)); 8633 verifyFormat("#define A \\\n" 8634 " void f() { int i; } \\\n" 8635 " int j;", 8636 getLLVMStyleWithColumns(23)); 8637 } 8638 8639 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8640 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8641 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8642 verifyFormat("class C {\n" 8643 " int f() {}\n" 8644 "};", 8645 MergeEmptyOnly); 8646 verifyFormat("class C {\n" 8647 " int f() {\n" 8648 " return 42;\n" 8649 " }\n" 8650 "};", 8651 MergeEmptyOnly); 8652 verifyFormat("int f() {}", MergeEmptyOnly); 8653 verifyFormat("int f() {\n" 8654 " return 42;\n" 8655 "}", 8656 MergeEmptyOnly); 8657 8658 // Also verify behavior when BraceWrapping.AfterFunction = true 8659 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8660 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8661 verifyFormat("int f() {}", MergeEmptyOnly); 8662 verifyFormat("class C {\n" 8663 " int f() {}\n" 8664 "};", 8665 MergeEmptyOnly); 8666 } 8667 8668 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8669 FormatStyle MergeInlineOnly = getLLVMStyle(); 8670 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8671 verifyFormat("class C {\n" 8672 " int f() { return 42; }\n" 8673 "};", 8674 MergeInlineOnly); 8675 verifyFormat("int f() {\n" 8676 " return 42;\n" 8677 "}", 8678 MergeInlineOnly); 8679 8680 // SFS_Inline implies SFS_Empty 8681 verifyFormat("class C {\n" 8682 " int f() {}\n" 8683 "};", 8684 MergeInlineOnly); 8685 verifyFormat("int f() {}", MergeInlineOnly); 8686 8687 // Also verify behavior when BraceWrapping.AfterFunction = true 8688 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8689 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8690 verifyFormat("class C {\n" 8691 " int f() { return 42; }\n" 8692 "};", 8693 MergeInlineOnly); 8694 verifyFormat("int f()\n" 8695 "{\n" 8696 " return 42;\n" 8697 "}", 8698 MergeInlineOnly); 8699 8700 // SFS_Inline implies SFS_Empty 8701 verifyFormat("int f() {}", MergeInlineOnly); 8702 verifyFormat("class C {\n" 8703 " int f() {}\n" 8704 "};", 8705 MergeInlineOnly); 8706 } 8707 8708 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8709 FormatStyle MergeInlineOnly = getLLVMStyle(); 8710 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8711 FormatStyle::SFS_InlineOnly; 8712 verifyFormat("class C {\n" 8713 " int f() { return 42; }\n" 8714 "};", 8715 MergeInlineOnly); 8716 verifyFormat("int f() {\n" 8717 " return 42;\n" 8718 "}", 8719 MergeInlineOnly); 8720 8721 // SFS_InlineOnly does not imply SFS_Empty 8722 verifyFormat("class C {\n" 8723 " int f() {}\n" 8724 "};", 8725 MergeInlineOnly); 8726 verifyFormat("int f() {\n" 8727 "}", 8728 MergeInlineOnly); 8729 8730 // Also verify behavior when BraceWrapping.AfterFunction = true 8731 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8732 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8733 verifyFormat("class C {\n" 8734 " int f() { return 42; }\n" 8735 "};", 8736 MergeInlineOnly); 8737 verifyFormat("int f()\n" 8738 "{\n" 8739 " return 42;\n" 8740 "}", 8741 MergeInlineOnly); 8742 8743 // SFS_InlineOnly does not imply SFS_Empty 8744 verifyFormat("int f()\n" 8745 "{\n" 8746 "}", 8747 MergeInlineOnly); 8748 verifyFormat("class C {\n" 8749 " int f() {}\n" 8750 "};", 8751 MergeInlineOnly); 8752 } 8753 8754 TEST_F(FormatTest, SplitEmptyFunction) { 8755 FormatStyle Style = getLLVMStyle(); 8756 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8757 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8758 Style.BraceWrapping.AfterFunction = true; 8759 Style.BraceWrapping.SplitEmptyFunction = false; 8760 Style.ColumnLimit = 40; 8761 8762 verifyFormat("int f()\n" 8763 "{}", 8764 Style); 8765 verifyFormat("int f()\n" 8766 "{\n" 8767 " return 42;\n" 8768 "}", 8769 Style); 8770 verifyFormat("int f()\n" 8771 "{\n" 8772 " // some comment\n" 8773 "}", 8774 Style); 8775 8776 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8777 verifyFormat("int f() {}", Style); 8778 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8779 "{}", 8780 Style); 8781 verifyFormat("int f()\n" 8782 "{\n" 8783 " return 0;\n" 8784 "}", 8785 Style); 8786 8787 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8788 verifyFormat("class Foo {\n" 8789 " int f() {}\n" 8790 "};\n", 8791 Style); 8792 verifyFormat("class Foo {\n" 8793 " int f() { return 0; }\n" 8794 "};\n", 8795 Style); 8796 verifyFormat("class Foo {\n" 8797 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8798 " {}\n" 8799 "};\n", 8800 Style); 8801 verifyFormat("class Foo {\n" 8802 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8803 " {\n" 8804 " return 0;\n" 8805 " }\n" 8806 "};\n", 8807 Style); 8808 8809 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8810 verifyFormat("int f() {}", Style); 8811 verifyFormat("int f() { return 0; }", Style); 8812 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8813 "{}", 8814 Style); 8815 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8816 "{\n" 8817 " return 0;\n" 8818 "}", 8819 Style); 8820 } 8821 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8822 FormatStyle Style = getLLVMStyle(); 8823 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8824 verifyFormat("#ifdef A\n" 8825 "int f() {}\n" 8826 "#else\n" 8827 "int g() {}\n" 8828 "#endif", 8829 Style); 8830 } 8831 8832 TEST_F(FormatTest, SplitEmptyClass) { 8833 FormatStyle Style = getLLVMStyle(); 8834 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8835 Style.BraceWrapping.AfterClass = true; 8836 Style.BraceWrapping.SplitEmptyRecord = false; 8837 8838 verifyFormat("class Foo\n" 8839 "{};", 8840 Style); 8841 verifyFormat("/* something */ class Foo\n" 8842 "{};", 8843 Style); 8844 verifyFormat("template <typename X> class Foo\n" 8845 "{};", 8846 Style); 8847 verifyFormat("class Foo\n" 8848 "{\n" 8849 " Foo();\n" 8850 "};", 8851 Style); 8852 verifyFormat("typedef class Foo\n" 8853 "{\n" 8854 "} Foo_t;", 8855 Style); 8856 } 8857 8858 TEST_F(FormatTest, SplitEmptyStruct) { 8859 FormatStyle Style = getLLVMStyle(); 8860 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8861 Style.BraceWrapping.AfterStruct = true; 8862 Style.BraceWrapping.SplitEmptyRecord = false; 8863 8864 verifyFormat("struct Foo\n" 8865 "{};", 8866 Style); 8867 verifyFormat("/* something */ struct Foo\n" 8868 "{};", 8869 Style); 8870 verifyFormat("template <typename X> struct Foo\n" 8871 "{};", 8872 Style); 8873 verifyFormat("struct Foo\n" 8874 "{\n" 8875 " Foo();\n" 8876 "};", 8877 Style); 8878 verifyFormat("typedef struct Foo\n" 8879 "{\n" 8880 "} Foo_t;", 8881 Style); 8882 // typedef struct Bar {} Bar_t; 8883 } 8884 8885 TEST_F(FormatTest, SplitEmptyUnion) { 8886 FormatStyle Style = getLLVMStyle(); 8887 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8888 Style.BraceWrapping.AfterUnion = true; 8889 Style.BraceWrapping.SplitEmptyRecord = false; 8890 8891 verifyFormat("union Foo\n" 8892 "{};", 8893 Style); 8894 verifyFormat("/* something */ union Foo\n" 8895 "{};", 8896 Style); 8897 verifyFormat("union Foo\n" 8898 "{\n" 8899 " A,\n" 8900 "};", 8901 Style); 8902 verifyFormat("typedef union Foo\n" 8903 "{\n" 8904 "} Foo_t;", 8905 Style); 8906 } 8907 8908 TEST_F(FormatTest, SplitEmptyNamespace) { 8909 FormatStyle Style = getLLVMStyle(); 8910 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8911 Style.BraceWrapping.AfterNamespace = true; 8912 Style.BraceWrapping.SplitEmptyNamespace = false; 8913 8914 verifyFormat("namespace Foo\n" 8915 "{};", 8916 Style); 8917 verifyFormat("/* something */ namespace Foo\n" 8918 "{};", 8919 Style); 8920 verifyFormat("inline namespace Foo\n" 8921 "{};", 8922 Style); 8923 verifyFormat("/* something */ inline namespace Foo\n" 8924 "{};", 8925 Style); 8926 verifyFormat("export namespace Foo\n" 8927 "{};", 8928 Style); 8929 verifyFormat("namespace Foo\n" 8930 "{\n" 8931 "void Bar();\n" 8932 "};", 8933 Style); 8934 } 8935 8936 TEST_F(FormatTest, NeverMergeShortRecords) { 8937 FormatStyle Style = getLLVMStyle(); 8938 8939 verifyFormat("class Foo {\n" 8940 " Foo();\n" 8941 "};", 8942 Style); 8943 verifyFormat("typedef class Foo {\n" 8944 " Foo();\n" 8945 "} Foo_t;", 8946 Style); 8947 verifyFormat("struct Foo {\n" 8948 " Foo();\n" 8949 "};", 8950 Style); 8951 verifyFormat("typedef struct Foo {\n" 8952 " Foo();\n" 8953 "} Foo_t;", 8954 Style); 8955 verifyFormat("union Foo {\n" 8956 " A,\n" 8957 "};", 8958 Style); 8959 verifyFormat("typedef union Foo {\n" 8960 " A,\n" 8961 "} Foo_t;", 8962 Style); 8963 verifyFormat("namespace Foo {\n" 8964 "void Bar();\n" 8965 "};", 8966 Style); 8967 8968 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8969 Style.BraceWrapping.AfterClass = true; 8970 Style.BraceWrapping.AfterStruct = true; 8971 Style.BraceWrapping.AfterUnion = true; 8972 Style.BraceWrapping.AfterNamespace = true; 8973 verifyFormat("class Foo\n" 8974 "{\n" 8975 " Foo();\n" 8976 "};", 8977 Style); 8978 verifyFormat("typedef class Foo\n" 8979 "{\n" 8980 " Foo();\n" 8981 "} Foo_t;", 8982 Style); 8983 verifyFormat("struct Foo\n" 8984 "{\n" 8985 " Foo();\n" 8986 "};", 8987 Style); 8988 verifyFormat("typedef struct Foo\n" 8989 "{\n" 8990 " Foo();\n" 8991 "} Foo_t;", 8992 Style); 8993 verifyFormat("union Foo\n" 8994 "{\n" 8995 " A,\n" 8996 "};", 8997 Style); 8998 verifyFormat("typedef union Foo\n" 8999 "{\n" 9000 " A,\n" 9001 "} Foo_t;", 9002 Style); 9003 verifyFormat("namespace Foo\n" 9004 "{\n" 9005 "void Bar();\n" 9006 "};", 9007 Style); 9008 } 9009 9010 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 9011 // Elaborate type variable declarations. 9012 verifyFormat("struct foo a = {bar};\nint n;"); 9013 verifyFormat("class foo a = {bar};\nint n;"); 9014 verifyFormat("union foo a = {bar};\nint n;"); 9015 9016 // Elaborate types inside function definitions. 9017 verifyFormat("struct foo f() {}\nint n;"); 9018 verifyFormat("class foo f() {}\nint n;"); 9019 verifyFormat("union foo f() {}\nint n;"); 9020 9021 // Templates. 9022 verifyFormat("template <class X> void f() {}\nint n;"); 9023 verifyFormat("template <struct X> void f() {}\nint n;"); 9024 verifyFormat("template <union X> void f() {}\nint n;"); 9025 9026 // Actual definitions... 9027 verifyFormat("struct {\n} n;"); 9028 verifyFormat( 9029 "template <template <class T, class Y>, class Z> class X {\n} n;"); 9030 verifyFormat("union Z {\n int n;\n} x;"); 9031 verifyFormat("class MACRO Z {\n} n;"); 9032 verifyFormat("class MACRO(X) Z {\n} n;"); 9033 verifyFormat("class __attribute__(X) Z {\n} n;"); 9034 verifyFormat("class __declspec(X) Z {\n} n;"); 9035 verifyFormat("class A##B##C {\n} n;"); 9036 verifyFormat("class alignas(16) Z {\n} n;"); 9037 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 9038 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 9039 9040 // Redefinition from nested context: 9041 verifyFormat("class A::B::C {\n} n;"); 9042 9043 // Template definitions. 9044 verifyFormat( 9045 "template <typename F>\n" 9046 "Matcher(const Matcher<F> &Other,\n" 9047 " typename enable_if_c<is_base_of<F, T>::value &&\n" 9048 " !is_same<F, T>::value>::type * = 0)\n" 9049 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 9050 9051 // FIXME: This is still incorrectly handled at the formatter side. 9052 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 9053 verifyFormat("int i = SomeFunction(a<b, a> b);"); 9054 9055 // FIXME: 9056 // This now gets parsed incorrectly as class definition. 9057 // verifyFormat("class A<int> f() {\n}\nint n;"); 9058 9059 // Elaborate types where incorrectly parsing the structural element would 9060 // break the indent. 9061 verifyFormat("if (true)\n" 9062 " class X x;\n" 9063 "else\n" 9064 " f();\n"); 9065 9066 // This is simply incomplete. Formatting is not important, but must not crash. 9067 verifyFormat("class A:"); 9068 } 9069 9070 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 9071 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 9072 format("#error Leave all white!!!!! space* alone!\n")); 9073 EXPECT_EQ( 9074 "#warning Leave all white!!!!! space* alone!\n", 9075 format("#warning Leave all white!!!!! space* alone!\n")); 9076 EXPECT_EQ("#error 1", format(" # error 1")); 9077 EXPECT_EQ("#warning 1", format(" # warning 1")); 9078 } 9079 9080 TEST_F(FormatTest, FormatHashIfExpressions) { 9081 verifyFormat("#if AAAA && BBBB"); 9082 verifyFormat("#if (AAAA && BBBB)"); 9083 verifyFormat("#elif (AAAA && BBBB)"); 9084 // FIXME: Come up with a better indentation for #elif. 9085 verifyFormat( 9086 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 9087 " defined(BBBBBBBB)\n" 9088 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 9089 " defined(BBBBBBBB)\n" 9090 "#endif", 9091 getLLVMStyleWithColumns(65)); 9092 } 9093 9094 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 9095 FormatStyle AllowsMergedIf = getGoogleStyle(); 9096 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 9097 FormatStyle::SIS_WithoutElse; 9098 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 9099 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 9100 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 9101 EXPECT_EQ("if (true) return 42;", 9102 format("if (true)\nreturn 42;", AllowsMergedIf)); 9103 FormatStyle ShortMergedIf = AllowsMergedIf; 9104 ShortMergedIf.ColumnLimit = 25; 9105 verifyFormat("#define A \\\n" 9106 " if (true) return 42;", 9107 ShortMergedIf); 9108 verifyFormat("#define A \\\n" 9109 " f(); \\\n" 9110 " if (true)\n" 9111 "#define B", 9112 ShortMergedIf); 9113 verifyFormat("#define A \\\n" 9114 " f(); \\\n" 9115 " if (true)\n" 9116 "g();", 9117 ShortMergedIf); 9118 verifyFormat("{\n" 9119 "#ifdef A\n" 9120 " // Comment\n" 9121 " if (true) continue;\n" 9122 "#endif\n" 9123 " // Comment\n" 9124 " if (true) continue;\n" 9125 "}", 9126 ShortMergedIf); 9127 ShortMergedIf.ColumnLimit = 33; 9128 verifyFormat("#define A \\\n" 9129 " if constexpr (true) return 42;", 9130 ShortMergedIf); 9131 verifyFormat("#define A \\\n" 9132 " if CONSTEXPR (true) return 42;", 9133 ShortMergedIf); 9134 ShortMergedIf.ColumnLimit = 29; 9135 verifyFormat("#define A \\\n" 9136 " if (aaaaaaaaaa) return 1; \\\n" 9137 " return 2;", 9138 ShortMergedIf); 9139 ShortMergedIf.ColumnLimit = 28; 9140 verifyFormat("#define A \\\n" 9141 " if (aaaaaaaaaa) \\\n" 9142 " return 1; \\\n" 9143 " return 2;", 9144 ShortMergedIf); 9145 verifyFormat("#define A \\\n" 9146 " if constexpr (aaaaaaa) \\\n" 9147 " return 1; \\\n" 9148 " return 2;", 9149 ShortMergedIf); 9150 verifyFormat("#define A \\\n" 9151 " if CONSTEXPR (aaaaaaa) \\\n" 9152 " return 1; \\\n" 9153 " return 2;", 9154 ShortMergedIf); 9155 } 9156 9157 TEST_F(FormatTest, FormatStarDependingOnContext) { 9158 verifyFormat("void f(int *a);"); 9159 verifyFormat("void f() { f(fint * b); }"); 9160 verifyFormat("class A {\n void f(int *a);\n};"); 9161 verifyFormat("class A {\n int *a;\n};"); 9162 verifyFormat("namespace a {\n" 9163 "namespace b {\n" 9164 "class A {\n" 9165 " void f() {}\n" 9166 " int *a;\n" 9167 "};\n" 9168 "} // namespace b\n" 9169 "} // namespace a"); 9170 } 9171 9172 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 9173 verifyFormat("while"); 9174 verifyFormat("operator"); 9175 } 9176 9177 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 9178 // This code would be painfully slow to format if we didn't skip it. 9179 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 9180 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9181 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9182 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9183 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9184 "A(1, 1)\n" 9185 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 9186 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9187 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9188 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9189 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9190 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9191 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9192 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9193 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9194 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 9195 // Deeply nested part is untouched, rest is formatted. 9196 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 9197 format(std::string("int i;\n") + Code + "int j;\n", 9198 getLLVMStyle(), SC_ExpectIncomplete)); 9199 } 9200 9201 //===----------------------------------------------------------------------===// 9202 // Objective-C tests. 9203 //===----------------------------------------------------------------------===// 9204 9205 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 9206 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 9207 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 9208 format("-(NSUInteger)indexOfObject:(id)anObject;")); 9209 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 9210 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 9211 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 9212 format("-(NSInteger)Method3:(id)anObject;")); 9213 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 9214 format("-(NSInteger)Method4:(id)anObject;")); 9215 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 9216 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 9217 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 9218 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 9219 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9220 "forAllCells:(BOOL)flag;", 9221 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9222 "forAllCells:(BOOL)flag;")); 9223 9224 // Very long objectiveC method declaration. 9225 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 9226 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 9227 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 9228 " inRange:(NSRange)range\n" 9229 " outRange:(NSRange)out_range\n" 9230 " outRange1:(NSRange)out_range1\n" 9231 " outRange2:(NSRange)out_range2\n" 9232 " outRange3:(NSRange)out_range3\n" 9233 " outRange4:(NSRange)out_range4\n" 9234 " outRange5:(NSRange)out_range5\n" 9235 " outRange6:(NSRange)out_range6\n" 9236 " outRange7:(NSRange)out_range7\n" 9237 " outRange8:(NSRange)out_range8\n" 9238 " outRange9:(NSRange)out_range9;"); 9239 9240 // When the function name has to be wrapped. 9241 FormatStyle Style = getLLVMStyle(); 9242 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 9243 // and always indents instead. 9244 Style.IndentWrappedFunctionNames = false; 9245 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9246 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 9247 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 9248 "}", 9249 Style); 9250 Style.IndentWrappedFunctionNames = true; 9251 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9252 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 9253 " anotherName:(NSString)dddddddddddddd {\n" 9254 "}", 9255 Style); 9256 9257 verifyFormat("- (int)sum:(vector<int>)numbers;"); 9258 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 9259 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 9260 // protocol lists (but not for template classes): 9261 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 9262 9263 verifyFormat("- (int (*)())foo:(int (*)())f;"); 9264 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 9265 9266 // If there's no return type (very rare in practice!), LLVM and Google style 9267 // agree. 9268 verifyFormat("- foo;"); 9269 verifyFormat("- foo:(int)f;"); 9270 verifyGoogleFormat("- foo:(int)foo;"); 9271 } 9272 9273 TEST_F(FormatTest, BreaksStringLiterals) { 9274 EXPECT_EQ("\"some text \"\n" 9275 "\"other\";", 9276 format("\"some text other\";", getLLVMStyleWithColumns(12))); 9277 EXPECT_EQ("\"some text \"\n" 9278 "\"other\";", 9279 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 9280 EXPECT_EQ( 9281 "#define A \\\n" 9282 " \"some \" \\\n" 9283 " \"text \" \\\n" 9284 " \"other\";", 9285 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 9286 EXPECT_EQ( 9287 "#define A \\\n" 9288 " \"so \" \\\n" 9289 " \"text \" \\\n" 9290 " \"other\";", 9291 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 9292 9293 EXPECT_EQ("\"some text\"", 9294 format("\"some text\"", getLLVMStyleWithColumns(1))); 9295 EXPECT_EQ("\"some text\"", 9296 format("\"some text\"", getLLVMStyleWithColumns(11))); 9297 EXPECT_EQ("\"some \"\n" 9298 "\"text\"", 9299 format("\"some text\"", getLLVMStyleWithColumns(10))); 9300 EXPECT_EQ("\"some \"\n" 9301 "\"text\"", 9302 format("\"some text\"", getLLVMStyleWithColumns(7))); 9303 EXPECT_EQ("\"some\"\n" 9304 "\" tex\"\n" 9305 "\"t\"", 9306 format("\"some text\"", getLLVMStyleWithColumns(6))); 9307 EXPECT_EQ("\"some\"\n" 9308 "\" tex\"\n" 9309 "\" and\"", 9310 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 9311 EXPECT_EQ("\"some\"\n" 9312 "\"/tex\"\n" 9313 "\"/and\"", 9314 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 9315 9316 EXPECT_EQ("variable =\n" 9317 " \"long string \"\n" 9318 " \"literal\";", 9319 format("variable = \"long string literal\";", 9320 getLLVMStyleWithColumns(20))); 9321 9322 EXPECT_EQ("variable = f(\n" 9323 " \"long string \"\n" 9324 " \"literal\",\n" 9325 " short,\n" 9326 " loooooooooooooooooooong);", 9327 format("variable = f(\"long string literal\", short, " 9328 "loooooooooooooooooooong);", 9329 getLLVMStyleWithColumns(20))); 9330 9331 EXPECT_EQ( 9332 "f(g(\"long string \"\n" 9333 " \"literal\"),\n" 9334 " b);", 9335 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 9336 EXPECT_EQ("f(g(\"long string \"\n" 9337 " \"literal\",\n" 9338 " a),\n" 9339 " b);", 9340 format("f(g(\"long string literal\", a), b);", 9341 getLLVMStyleWithColumns(20))); 9342 EXPECT_EQ( 9343 "f(\"one two\".split(\n" 9344 " variable));", 9345 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 9346 EXPECT_EQ("f(\"one two three four five six \"\n" 9347 " \"seven\".split(\n" 9348 " really_looooong_variable));", 9349 format("f(\"one two three four five six seven\"." 9350 "split(really_looooong_variable));", 9351 getLLVMStyleWithColumns(33))); 9352 9353 EXPECT_EQ("f(\"some \"\n" 9354 " \"text\",\n" 9355 " other);", 9356 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 9357 9358 // Only break as a last resort. 9359 verifyFormat( 9360 "aaaaaaaaaaaaaaaaaaaa(\n" 9361 " aaaaaaaaaaaaaaaaaaaa,\n" 9362 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 9363 9364 EXPECT_EQ("\"splitmea\"\n" 9365 "\"trandomp\"\n" 9366 "\"oint\"", 9367 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 9368 9369 EXPECT_EQ("\"split/\"\n" 9370 "\"pathat/\"\n" 9371 "\"slashes\"", 9372 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9373 9374 EXPECT_EQ("\"split/\"\n" 9375 "\"pathat/\"\n" 9376 "\"slashes\"", 9377 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9378 EXPECT_EQ("\"split at \"\n" 9379 "\"spaces/at/\"\n" 9380 "\"slashes.at.any$\"\n" 9381 "\"non-alphanumeric%\"\n" 9382 "\"1111111111characte\"\n" 9383 "\"rs\"", 9384 format("\"split at " 9385 "spaces/at/" 9386 "slashes.at." 9387 "any$non-" 9388 "alphanumeric%" 9389 "1111111111characte" 9390 "rs\"", 9391 getLLVMStyleWithColumns(20))); 9392 9393 // Verify that splitting the strings understands 9394 // Style::AlwaysBreakBeforeMultilineStrings. 9395 EXPECT_EQ("aaaaaaaaaaaa(\n" 9396 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 9397 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 9398 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 9399 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9400 "aaaaaaaaaaaaaaaaaaaaaa\");", 9401 getGoogleStyle())); 9402 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9403 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9404 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9405 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9406 "aaaaaaaaaaaaaaaaaaaaaa\";", 9407 getGoogleStyle())); 9408 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9409 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9410 format("llvm::outs() << " 9411 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 9412 "aaaaaaaaaaaaaaaaaaa\";")); 9413 EXPECT_EQ("ffff(\n" 9414 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9415 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9416 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 9417 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9418 getGoogleStyle())); 9419 9420 FormatStyle Style = getLLVMStyleWithColumns(12); 9421 Style.BreakStringLiterals = false; 9422 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 9423 9424 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 9425 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9426 EXPECT_EQ("#define A \\\n" 9427 " \"some \" \\\n" 9428 " \"text \" \\\n" 9429 " \"other\";", 9430 format("#define A \"some text other\";", AlignLeft)); 9431 } 9432 9433 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 9434 EXPECT_EQ("C a = \"some more \"\n" 9435 " \"text\";", 9436 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9437 } 9438 9439 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9440 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9441 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9442 EXPECT_EQ("int i = a(b());", 9443 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9444 } 9445 9446 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9447 EXPECT_EQ( 9448 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9449 "(\n" 9450 " \"x\t\");", 9451 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9452 "aaaaaaa(" 9453 "\"x\t\");")); 9454 } 9455 9456 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9457 EXPECT_EQ( 9458 "u8\"utf8 string \"\n" 9459 "u8\"literal\";", 9460 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9461 EXPECT_EQ( 9462 "u\"utf16 string \"\n" 9463 "u\"literal\";", 9464 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9465 EXPECT_EQ( 9466 "U\"utf32 string \"\n" 9467 "U\"literal\";", 9468 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9469 EXPECT_EQ("L\"wide string \"\n" 9470 "L\"literal\";", 9471 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9472 EXPECT_EQ("@\"NSString \"\n" 9473 "@\"literal\";", 9474 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9475 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9476 9477 // This input makes clang-format try to split the incomplete unicode escape 9478 // sequence, which used to lead to a crasher. 9479 verifyNoCrash( 9480 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9481 getLLVMStyleWithColumns(60)); 9482 } 9483 9484 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9485 FormatStyle Style = getGoogleStyleWithColumns(15); 9486 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9487 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9488 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9489 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9490 EXPECT_EQ("u8R\"x(raw literal)x\";", 9491 format("u8R\"x(raw literal)x\";", Style)); 9492 } 9493 9494 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9495 FormatStyle Style = getLLVMStyleWithColumns(20); 9496 EXPECT_EQ( 9497 "_T(\"aaaaaaaaaaaaaa\")\n" 9498 "_T(\"aaaaaaaaaaaaaa\")\n" 9499 "_T(\"aaaaaaaaaaaa\")", 9500 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9501 EXPECT_EQ("f(x,\n" 9502 " _T(\"aaaaaaaaaaaa\")\n" 9503 " _T(\"aaa\"),\n" 9504 " z);", 9505 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9506 9507 // FIXME: Handle embedded spaces in one iteration. 9508 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9509 // "_T(\"aaaaaaaaaaaaa\")\n" 9510 // "_T(\"aaaaaaaaaaaaa\")\n" 9511 // "_T(\"a\")", 9512 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9513 // getLLVMStyleWithColumns(20))); 9514 EXPECT_EQ( 9515 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9516 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9517 EXPECT_EQ("f(\n" 9518 "#if !TEST\n" 9519 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9520 "#endif\n" 9521 ");", 9522 format("f(\n" 9523 "#if !TEST\n" 9524 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9525 "#endif\n" 9526 ");")); 9527 EXPECT_EQ("f(\n" 9528 "\n" 9529 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9530 format("f(\n" 9531 "\n" 9532 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9533 } 9534 9535 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9536 // In a function call with two operands, the second can be broken with no line 9537 // break before it. 9538 EXPECT_EQ( 9539 "func(a, \"long long \"\n" 9540 " \"long long\");", 9541 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 9542 // In a function call with three operands, the second must be broken with a 9543 // line break before it. 9544 EXPECT_EQ("func(a,\n" 9545 " \"long long long \"\n" 9546 " \"long\",\n" 9547 " c);", 9548 format("func(a, \"long long long long\", c);", 9549 getLLVMStyleWithColumns(24))); 9550 // In a function call with three operands, the third must be broken with a 9551 // line break before it. 9552 EXPECT_EQ("func(a, b,\n" 9553 " \"long long long \"\n" 9554 " \"long\");", 9555 format("func(a, b, \"long long long long\");", 9556 getLLVMStyleWithColumns(24))); 9557 // In a function call with three operands, both the second and the third must 9558 // be broken with a line break before them. 9559 EXPECT_EQ("func(a,\n" 9560 " \"long long long \"\n" 9561 " \"long\",\n" 9562 " \"long long long \"\n" 9563 " \"long\");", 9564 format("func(a, \"long long long long\", \"long long long long\");", 9565 getLLVMStyleWithColumns(24))); 9566 // In a chain of << with two operands, the second can be broken with no line 9567 // break before it. 9568 EXPECT_EQ("a << \"line line \"\n" 9569 " \"line\";", 9570 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 9571 // In a chain of << with three operands, the second can be broken with no line 9572 // break before it. 9573 EXPECT_EQ( 9574 "abcde << \"line \"\n" 9575 " \"line line\"\n" 9576 " << c;", 9577 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 9578 // In a chain of << with three operands, the third must be broken with a line 9579 // break before it. 9580 EXPECT_EQ( 9581 "a << b\n" 9582 " << \"line line \"\n" 9583 " \"line\";", 9584 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 9585 // In a chain of << with three operands, the second can be broken with no line 9586 // break before it and the third must be broken with a line break before it. 9587 EXPECT_EQ("abcd << \"line line \"\n" 9588 " \"line\"\n" 9589 " << \"line line \"\n" 9590 " \"line\";", 9591 format("abcd << \"line line line\" << \"line line line\";", 9592 getLLVMStyleWithColumns(20))); 9593 // In a chain of binary operators with two operands, the second can be broken 9594 // with no line break before it. 9595 EXPECT_EQ( 9596 "abcd + \"line line \"\n" 9597 " \"line line\";", 9598 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 9599 // In a chain of binary operators with three operands, the second must be 9600 // broken with a line break before it. 9601 EXPECT_EQ("abcd +\n" 9602 " \"line line \"\n" 9603 " \"line line\" +\n" 9604 " e;", 9605 format("abcd + \"line line line line\" + e;", 9606 getLLVMStyleWithColumns(20))); 9607 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9608 // the first must be broken with a line break before it. 9609 FormatStyle Style = getLLVMStyleWithColumns(25); 9610 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9611 EXPECT_EQ("someFunction(\n" 9612 " \"long long long \"\n" 9613 " \"long\",\n" 9614 " a);", 9615 format("someFunction(\"long long long long\", a);", Style)); 9616 } 9617 9618 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9619 EXPECT_EQ( 9620 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9622 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9623 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9625 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9626 } 9627 9628 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9629 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9630 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9631 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9632 "multiline raw string literal xxxxxxxxxxxxxx\n" 9633 ")x\",\n" 9634 " a),\n" 9635 " b);", 9636 format("fffffffffff(g(R\"x(\n" 9637 "multiline raw string literal xxxxxxxxxxxxxx\n" 9638 ")x\", a), b);", 9639 getGoogleStyleWithColumns(20))); 9640 EXPECT_EQ("fffffffffff(\n" 9641 " g(R\"x(qqq\n" 9642 "multiline raw string literal xxxxxxxxxxxxxx\n" 9643 ")x\",\n" 9644 " a),\n" 9645 " b);", 9646 format("fffffffffff(g(R\"x(qqq\n" 9647 "multiline raw string literal xxxxxxxxxxxxxx\n" 9648 ")x\", a), b);", 9649 getGoogleStyleWithColumns(20))); 9650 9651 EXPECT_EQ("fffffffffff(R\"x(\n" 9652 "multiline raw string literal xxxxxxxxxxxxxx\n" 9653 ")x\");", 9654 format("fffffffffff(R\"x(\n" 9655 "multiline raw string literal xxxxxxxxxxxxxx\n" 9656 ")x\");", 9657 getGoogleStyleWithColumns(20))); 9658 EXPECT_EQ("fffffffffff(R\"x(\n" 9659 "multiline raw string literal xxxxxxxxxxxxxx\n" 9660 ")x\" + bbbbbb);", 9661 format("fffffffffff(R\"x(\n" 9662 "multiline raw string literal xxxxxxxxxxxxxx\n" 9663 ")x\" + bbbbbb);", 9664 getGoogleStyleWithColumns(20))); 9665 EXPECT_EQ("fffffffffff(\n" 9666 " R\"x(\n" 9667 "multiline raw string literal xxxxxxxxxxxxxx\n" 9668 ")x\" +\n" 9669 " bbbbbb);", 9670 format("fffffffffff(\n" 9671 " R\"x(\n" 9672 "multiline raw string literal xxxxxxxxxxxxxx\n" 9673 ")x\" + bbbbbb);", 9674 getGoogleStyleWithColumns(20))); 9675 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9676 format("fffffffffff(\n" 9677 " R\"(single line raw string)\" + bbbbbb);")); 9678 } 9679 9680 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9681 verifyFormat("string a = \"unterminated;"); 9682 EXPECT_EQ("function(\"unterminated,\n" 9683 " OtherParameter);", 9684 format("function( \"unterminated,\n" 9685 " OtherParameter);")); 9686 } 9687 9688 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9689 FormatStyle Style = getLLVMStyle(); 9690 Style.Standard = FormatStyle::LS_Cpp03; 9691 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9692 format("#define x(_a) printf(\"foo\"_a);", Style)); 9693 } 9694 9695 TEST_F(FormatTest, CppLexVersion) { 9696 FormatStyle Style = getLLVMStyle(); 9697 // Formatting of x * y differs if x is a type. 9698 verifyFormat("void foo() { MACRO(a * b); }", Style); 9699 verifyFormat("void foo() { MACRO(int *b); }", Style); 9700 9701 // LLVM style uses latest lexer. 9702 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 9703 Style.Standard = FormatStyle::LS_Cpp17; 9704 // But in c++17, char8_t isn't a keyword. 9705 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 9706 } 9707 9708 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9709 9710 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9711 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9712 " \"ddeeefff\");", 9713 format("someFunction(\"aaabbbcccdddeeefff\");", 9714 getLLVMStyleWithColumns(25))); 9715 EXPECT_EQ("someFunction1234567890(\n" 9716 " \"aaabbbcccdddeeefff\");", 9717 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9718 getLLVMStyleWithColumns(26))); 9719 EXPECT_EQ("someFunction1234567890(\n" 9720 " \"aaabbbcccdddeeeff\"\n" 9721 " \"f\");", 9722 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9723 getLLVMStyleWithColumns(25))); 9724 EXPECT_EQ("someFunction1234567890(\n" 9725 " \"aaabbbcccdddeeeff\"\n" 9726 " \"f\");", 9727 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9728 getLLVMStyleWithColumns(24))); 9729 EXPECT_EQ("someFunction(\n" 9730 " \"aaabbbcc ddde \"\n" 9731 " \"efff\");", 9732 format("someFunction(\"aaabbbcc ddde efff\");", 9733 getLLVMStyleWithColumns(25))); 9734 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9735 " \"ddeeefff\");", 9736 format("someFunction(\"aaabbbccc ddeeefff\");", 9737 getLLVMStyleWithColumns(25))); 9738 EXPECT_EQ("someFunction1234567890(\n" 9739 " \"aaabb \"\n" 9740 " \"cccdddeeefff\");", 9741 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9742 getLLVMStyleWithColumns(25))); 9743 EXPECT_EQ("#define A \\\n" 9744 " string s = \\\n" 9745 " \"123456789\" \\\n" 9746 " \"0\"; \\\n" 9747 " int i;", 9748 format("#define A string s = \"1234567890\"; int i;", 9749 getLLVMStyleWithColumns(20))); 9750 EXPECT_EQ("someFunction(\n" 9751 " \"aaabbbcc \"\n" 9752 " \"dddeeefff\");", 9753 format("someFunction(\"aaabbbcc dddeeefff\");", 9754 getLLVMStyleWithColumns(25))); 9755 } 9756 9757 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9758 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9759 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9760 EXPECT_EQ("\"test\"\n" 9761 "\"\\n\"", 9762 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9763 EXPECT_EQ("\"tes\\\\\"\n" 9764 "\"n\"", 9765 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9766 EXPECT_EQ("\"\\\\\\\\\"\n" 9767 "\"\\n\"", 9768 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9769 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9770 EXPECT_EQ("\"\\uff01\"\n" 9771 "\"test\"", 9772 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9773 EXPECT_EQ("\"\\Uff01ff02\"", 9774 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9775 EXPECT_EQ("\"\\x000000000001\"\n" 9776 "\"next\"", 9777 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9778 EXPECT_EQ("\"\\x000000000001next\"", 9779 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9780 EXPECT_EQ("\"\\x000000000001\"", 9781 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9782 EXPECT_EQ("\"test\"\n" 9783 "\"\\000000\"\n" 9784 "\"000001\"", 9785 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9786 EXPECT_EQ("\"test\\000\"\n" 9787 "\"00000000\"\n" 9788 "\"1\"", 9789 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9790 } 9791 9792 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9793 verifyFormat("void f() {\n" 9794 " return g() {}\n" 9795 " void h() {}"); 9796 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9797 "g();\n" 9798 "}"); 9799 } 9800 9801 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9802 verifyFormat( 9803 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9804 } 9805 9806 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9807 verifyFormat("class X {\n" 9808 " void f() {\n" 9809 " }\n" 9810 "};", 9811 getLLVMStyleWithColumns(12)); 9812 } 9813 9814 TEST_F(FormatTest, ConfigurableIndentWidth) { 9815 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9816 EightIndent.IndentWidth = 8; 9817 EightIndent.ContinuationIndentWidth = 8; 9818 verifyFormat("void f() {\n" 9819 " someFunction();\n" 9820 " if (true) {\n" 9821 " f();\n" 9822 " }\n" 9823 "}", 9824 EightIndent); 9825 verifyFormat("class X {\n" 9826 " void f() {\n" 9827 " }\n" 9828 "};", 9829 EightIndent); 9830 verifyFormat("int x[] = {\n" 9831 " call(),\n" 9832 " call()};", 9833 EightIndent); 9834 } 9835 9836 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9837 verifyFormat("double\n" 9838 "f();", 9839 getLLVMStyleWithColumns(8)); 9840 } 9841 9842 TEST_F(FormatTest, ConfigurableUseOfTab) { 9843 FormatStyle Tab = getLLVMStyleWithColumns(42); 9844 Tab.IndentWidth = 8; 9845 Tab.UseTab = FormatStyle::UT_Always; 9846 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9847 9848 EXPECT_EQ("if (aaaaaaaa && // q\n" 9849 " bb)\t\t// w\n" 9850 "\t;", 9851 format("if (aaaaaaaa &&// q\n" 9852 "bb)// w\n" 9853 ";", 9854 Tab)); 9855 EXPECT_EQ("if (aaa && bbb) // w\n" 9856 "\t;", 9857 format("if(aaa&&bbb)// w\n" 9858 ";", 9859 Tab)); 9860 9861 verifyFormat("class X {\n" 9862 "\tvoid f() {\n" 9863 "\t\tsomeFunction(parameter1,\n" 9864 "\t\t\t parameter2);\n" 9865 "\t}\n" 9866 "};", 9867 Tab); 9868 verifyFormat("#define A \\\n" 9869 "\tvoid f() { \\\n" 9870 "\t\tsomeFunction( \\\n" 9871 "\t\t parameter1, \\\n" 9872 "\t\t parameter2); \\\n" 9873 "\t}", 9874 Tab); 9875 verifyFormat("int a;\t // x\n" 9876 "int bbbbbbbb; // x\n", 9877 Tab); 9878 9879 Tab.TabWidth = 4; 9880 Tab.IndentWidth = 8; 9881 verifyFormat("class TabWidth4Indent8 {\n" 9882 "\t\tvoid f() {\n" 9883 "\t\t\t\tsomeFunction(parameter1,\n" 9884 "\t\t\t\t\t\t\t parameter2);\n" 9885 "\t\t}\n" 9886 "};", 9887 Tab); 9888 9889 Tab.TabWidth = 4; 9890 Tab.IndentWidth = 4; 9891 verifyFormat("class TabWidth4Indent4 {\n" 9892 "\tvoid f() {\n" 9893 "\t\tsomeFunction(parameter1,\n" 9894 "\t\t\t\t\t parameter2);\n" 9895 "\t}\n" 9896 "};", 9897 Tab); 9898 9899 Tab.TabWidth = 8; 9900 Tab.IndentWidth = 4; 9901 verifyFormat("class TabWidth8Indent4 {\n" 9902 " void f() {\n" 9903 "\tsomeFunction(parameter1,\n" 9904 "\t\t parameter2);\n" 9905 " }\n" 9906 "};", 9907 Tab); 9908 9909 Tab.TabWidth = 8; 9910 Tab.IndentWidth = 8; 9911 EXPECT_EQ("/*\n" 9912 "\t a\t\tcomment\n" 9913 "\t in multiple lines\n" 9914 " */", 9915 format(" /*\t \t \n" 9916 " \t \t a\t\tcomment\t \t\n" 9917 " \t \t in multiple lines\t\n" 9918 " \t */", 9919 Tab)); 9920 9921 Tab.UseTab = FormatStyle::UT_ForIndentation; 9922 verifyFormat("{\n" 9923 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9924 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9925 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9926 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9927 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9928 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9929 "};", 9930 Tab); 9931 verifyFormat("enum AA {\n" 9932 "\ta1, // Force multiple lines\n" 9933 "\ta2,\n" 9934 "\ta3\n" 9935 "};", 9936 Tab); 9937 EXPECT_EQ("if (aaaaaaaa && // q\n" 9938 " bb) // w\n" 9939 "\t;", 9940 format("if (aaaaaaaa &&// q\n" 9941 "bb)// w\n" 9942 ";", 9943 Tab)); 9944 verifyFormat("class X {\n" 9945 "\tvoid f() {\n" 9946 "\t\tsomeFunction(parameter1,\n" 9947 "\t\t parameter2);\n" 9948 "\t}\n" 9949 "};", 9950 Tab); 9951 verifyFormat("{\n" 9952 "\tQ(\n" 9953 "\t {\n" 9954 "\t\t int a;\n" 9955 "\t\t someFunction(aaaaaaaa,\n" 9956 "\t\t bbbbbbb);\n" 9957 "\t },\n" 9958 "\t p);\n" 9959 "}", 9960 Tab); 9961 EXPECT_EQ("{\n" 9962 "\t/* aaaa\n" 9963 "\t bbbb */\n" 9964 "}", 9965 format("{\n" 9966 "/* aaaa\n" 9967 " bbbb */\n" 9968 "}", 9969 Tab)); 9970 EXPECT_EQ("{\n" 9971 "\t/*\n" 9972 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9973 "\t bbbbbbbbbbbbb\n" 9974 "\t*/\n" 9975 "}", 9976 format("{\n" 9977 "/*\n" 9978 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9979 "*/\n" 9980 "}", 9981 Tab)); 9982 EXPECT_EQ("{\n" 9983 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9984 "\t// bbbbbbbbbbbbb\n" 9985 "}", 9986 format("{\n" 9987 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9988 "}", 9989 Tab)); 9990 EXPECT_EQ("{\n" 9991 "\t/*\n" 9992 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9993 "\t bbbbbbbbbbbbb\n" 9994 "\t*/\n" 9995 "}", 9996 format("{\n" 9997 "\t/*\n" 9998 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9999 "\t*/\n" 10000 "}", 10001 Tab)); 10002 EXPECT_EQ("{\n" 10003 "\t/*\n" 10004 "\n" 10005 "\t*/\n" 10006 "}", 10007 format("{\n" 10008 "\t/*\n" 10009 "\n" 10010 "\t*/\n" 10011 "}", 10012 Tab)); 10013 EXPECT_EQ("{\n" 10014 "\t/*\n" 10015 " asdf\n" 10016 "\t*/\n" 10017 "}", 10018 format("{\n" 10019 "\t/*\n" 10020 " asdf\n" 10021 "\t*/\n" 10022 "}", 10023 Tab)); 10024 10025 Tab.UseTab = FormatStyle::UT_Never; 10026 EXPECT_EQ("/*\n" 10027 " a\t\tcomment\n" 10028 " in multiple lines\n" 10029 " */", 10030 format(" /*\t \t \n" 10031 " \t \t a\t\tcomment\t \t\n" 10032 " \t \t in multiple lines\t\n" 10033 " \t */", 10034 Tab)); 10035 EXPECT_EQ("/* some\n" 10036 " comment */", 10037 format(" \t \t /* some\n" 10038 " \t \t comment */", 10039 Tab)); 10040 EXPECT_EQ("int a; /* some\n" 10041 " comment */", 10042 format(" \t \t int a; /* some\n" 10043 " \t \t comment */", 10044 Tab)); 10045 10046 EXPECT_EQ("int a; /* some\n" 10047 "comment */", 10048 format(" \t \t int\ta; /* some\n" 10049 " \t \t comment */", 10050 Tab)); 10051 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10052 " comment */", 10053 format(" \t \t f(\"\t\t\"); /* some\n" 10054 " \t \t comment */", 10055 Tab)); 10056 EXPECT_EQ("{\n" 10057 " /*\n" 10058 " * Comment\n" 10059 " */\n" 10060 " int i;\n" 10061 "}", 10062 format("{\n" 10063 "\t/*\n" 10064 "\t * Comment\n" 10065 "\t */\n" 10066 "\t int i;\n" 10067 "}")); 10068 10069 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10070 Tab.TabWidth = 8; 10071 Tab.IndentWidth = 8; 10072 EXPECT_EQ("if (aaaaaaaa && // q\n" 10073 " bb) // w\n" 10074 "\t;", 10075 format("if (aaaaaaaa &&// q\n" 10076 "bb)// w\n" 10077 ";", 10078 Tab)); 10079 EXPECT_EQ("if (aaa && bbb) // w\n" 10080 "\t;", 10081 format("if(aaa&&bbb)// w\n" 10082 ";", 10083 Tab)); 10084 verifyFormat("class X {\n" 10085 "\tvoid f() {\n" 10086 "\t\tsomeFunction(parameter1,\n" 10087 "\t\t\t parameter2);\n" 10088 "\t}\n" 10089 "};", 10090 Tab); 10091 verifyFormat("#define A \\\n" 10092 "\tvoid f() { \\\n" 10093 "\t\tsomeFunction( \\\n" 10094 "\t\t parameter1, \\\n" 10095 "\t\t parameter2); \\\n" 10096 "\t}", 10097 Tab); 10098 Tab.TabWidth = 4; 10099 Tab.IndentWidth = 8; 10100 verifyFormat("class TabWidth4Indent8 {\n" 10101 "\t\tvoid f() {\n" 10102 "\t\t\t\tsomeFunction(parameter1,\n" 10103 "\t\t\t\t\t\t\t parameter2);\n" 10104 "\t\t}\n" 10105 "};", 10106 Tab); 10107 Tab.TabWidth = 4; 10108 Tab.IndentWidth = 4; 10109 verifyFormat("class TabWidth4Indent4 {\n" 10110 "\tvoid f() {\n" 10111 "\t\tsomeFunction(parameter1,\n" 10112 "\t\t\t\t\t parameter2);\n" 10113 "\t}\n" 10114 "};", 10115 Tab); 10116 Tab.TabWidth = 8; 10117 Tab.IndentWidth = 4; 10118 verifyFormat("class TabWidth8Indent4 {\n" 10119 " void f() {\n" 10120 "\tsomeFunction(parameter1,\n" 10121 "\t\t parameter2);\n" 10122 " }\n" 10123 "};", 10124 Tab); 10125 Tab.TabWidth = 8; 10126 Tab.IndentWidth = 8; 10127 EXPECT_EQ("/*\n" 10128 "\t a\t\tcomment\n" 10129 "\t in multiple lines\n" 10130 " */", 10131 format(" /*\t \t \n" 10132 " \t \t a\t\tcomment\t \t\n" 10133 " \t \t in multiple lines\t\n" 10134 " \t */", 10135 Tab)); 10136 verifyFormat("{\n" 10137 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10138 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10139 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10140 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10141 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10142 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10143 "};", 10144 Tab); 10145 verifyFormat("enum AA {\n" 10146 "\ta1, // Force multiple lines\n" 10147 "\ta2,\n" 10148 "\ta3\n" 10149 "};", 10150 Tab); 10151 EXPECT_EQ("if (aaaaaaaa && // q\n" 10152 " bb) // w\n" 10153 "\t;", 10154 format("if (aaaaaaaa &&// q\n" 10155 "bb)// w\n" 10156 ";", 10157 Tab)); 10158 verifyFormat("class X {\n" 10159 "\tvoid f() {\n" 10160 "\t\tsomeFunction(parameter1,\n" 10161 "\t\t\t parameter2);\n" 10162 "\t}\n" 10163 "};", 10164 Tab); 10165 verifyFormat("{\n" 10166 "\tQ(\n" 10167 "\t {\n" 10168 "\t\t int a;\n" 10169 "\t\t someFunction(aaaaaaaa,\n" 10170 "\t\t\t\t bbbbbbb);\n" 10171 "\t },\n" 10172 "\t p);\n" 10173 "}", 10174 Tab); 10175 EXPECT_EQ("{\n" 10176 "\t/* aaaa\n" 10177 "\t bbbb */\n" 10178 "}", 10179 format("{\n" 10180 "/* aaaa\n" 10181 " bbbb */\n" 10182 "}", 10183 Tab)); 10184 EXPECT_EQ("{\n" 10185 "\t/*\n" 10186 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10187 "\t bbbbbbbbbbbbb\n" 10188 "\t*/\n" 10189 "}", 10190 format("{\n" 10191 "/*\n" 10192 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10193 "*/\n" 10194 "}", 10195 Tab)); 10196 EXPECT_EQ("{\n" 10197 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10198 "\t// bbbbbbbbbbbbb\n" 10199 "}", 10200 format("{\n" 10201 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10202 "}", 10203 Tab)); 10204 EXPECT_EQ("{\n" 10205 "\t/*\n" 10206 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10207 "\t bbbbbbbbbbbbb\n" 10208 "\t*/\n" 10209 "}", 10210 format("{\n" 10211 "\t/*\n" 10212 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10213 "\t*/\n" 10214 "}", 10215 Tab)); 10216 EXPECT_EQ("{\n" 10217 "\t/*\n" 10218 "\n" 10219 "\t*/\n" 10220 "}", 10221 format("{\n" 10222 "\t/*\n" 10223 "\n" 10224 "\t*/\n" 10225 "}", 10226 Tab)); 10227 EXPECT_EQ("{\n" 10228 "\t/*\n" 10229 " asdf\n" 10230 "\t*/\n" 10231 "}", 10232 format("{\n" 10233 "\t/*\n" 10234 " asdf\n" 10235 "\t*/\n" 10236 "}", 10237 Tab)); 10238 EXPECT_EQ("/*\n" 10239 "\t a\t\tcomment\n" 10240 "\t in multiple lines\n" 10241 " */", 10242 format(" /*\t \t \n" 10243 " \t \t a\t\tcomment\t \t\n" 10244 " \t \t in multiple lines\t\n" 10245 " \t */", 10246 Tab)); 10247 EXPECT_EQ("/* some\n" 10248 " comment */", 10249 format(" \t \t /* some\n" 10250 " \t \t comment */", 10251 Tab)); 10252 EXPECT_EQ("int a; /* some\n" 10253 " comment */", 10254 format(" \t \t int a; /* some\n" 10255 " \t \t comment */", 10256 Tab)); 10257 EXPECT_EQ("int a; /* some\n" 10258 "comment */", 10259 format(" \t \t int\ta; /* some\n" 10260 " \t \t comment */", 10261 Tab)); 10262 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10263 " comment */", 10264 format(" \t \t f(\"\t\t\"); /* some\n" 10265 " \t \t comment */", 10266 Tab)); 10267 EXPECT_EQ("{\n" 10268 " /*\n" 10269 " * Comment\n" 10270 " */\n" 10271 " int i;\n" 10272 "}", 10273 format("{\n" 10274 "\t/*\n" 10275 "\t * Comment\n" 10276 "\t */\n" 10277 "\t int i;\n" 10278 "}")); 10279 Tab.AlignConsecutiveAssignments = true; 10280 Tab.AlignConsecutiveDeclarations = true; 10281 Tab.TabWidth = 4; 10282 Tab.IndentWidth = 4; 10283 verifyFormat("class Assign {\n" 10284 "\tvoid f() {\n" 10285 "\t\tint x = 123;\n" 10286 "\t\tint random = 4;\n" 10287 "\t\tstd::string alphabet =\n" 10288 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10289 "\t}\n" 10290 "};", 10291 Tab); 10292 } 10293 10294 TEST_F(FormatTest, ZeroTabWidth) { 10295 FormatStyle Tab = getLLVMStyleWithColumns(42); 10296 Tab.IndentWidth = 8; 10297 Tab.UseTab = FormatStyle::UT_Never; 10298 Tab.TabWidth = 0; 10299 EXPECT_EQ("void a(){\n" 10300 " // line starts with '\t'\n" 10301 "};", 10302 format("void a(){\n" 10303 "\t// line starts with '\t'\n" 10304 "};", 10305 Tab)); 10306 10307 EXPECT_EQ("void a(){\n" 10308 " // line starts with '\t'\n" 10309 "};", 10310 format("void a(){\n" 10311 "\t\t// line starts with '\t'\n" 10312 "};", 10313 Tab)); 10314 10315 Tab.UseTab = FormatStyle::UT_ForIndentation; 10316 EXPECT_EQ("void a(){\n" 10317 " // line starts with '\t'\n" 10318 "};", 10319 format("void a(){\n" 10320 "\t// line starts with '\t'\n" 10321 "};", 10322 Tab)); 10323 10324 EXPECT_EQ("void a(){\n" 10325 " // line starts with '\t'\n" 10326 "};", 10327 format("void a(){\n" 10328 "\t\t// line starts with '\t'\n" 10329 "};", 10330 Tab)); 10331 10332 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10333 EXPECT_EQ("void a(){\n" 10334 " // line starts with '\t'\n" 10335 "};", 10336 format("void a(){\n" 10337 "\t// line starts with '\t'\n" 10338 "};", 10339 Tab)); 10340 10341 EXPECT_EQ("void a(){\n" 10342 " // line starts with '\t'\n" 10343 "};", 10344 format("void a(){\n" 10345 "\t\t// line starts with '\t'\n" 10346 "};", 10347 Tab)); 10348 10349 Tab.UseTab = FormatStyle::UT_Always; 10350 EXPECT_EQ("void a(){\n" 10351 "// line starts with '\t'\n" 10352 "};", 10353 format("void a(){\n" 10354 "\t// line starts with '\t'\n" 10355 "};", 10356 Tab)); 10357 10358 EXPECT_EQ("void a(){\n" 10359 "// line starts with '\t'\n" 10360 "};", 10361 format("void a(){\n" 10362 "\t\t// line starts with '\t'\n" 10363 "};", 10364 Tab)); 10365 } 10366 10367 TEST_F(FormatTest, CalculatesOriginalColumn) { 10368 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10369 "q\"; /* some\n" 10370 " comment */", 10371 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10372 "q\"; /* some\n" 10373 " comment */", 10374 getLLVMStyle())); 10375 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10376 "/* some\n" 10377 " comment */", 10378 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10379 " /* some\n" 10380 " comment */", 10381 getLLVMStyle())); 10382 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10383 "qqq\n" 10384 "/* some\n" 10385 " comment */", 10386 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10387 "qqq\n" 10388 " /* some\n" 10389 " comment */", 10390 getLLVMStyle())); 10391 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10392 "wwww; /* some\n" 10393 " comment */", 10394 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10395 "wwww; /* some\n" 10396 " comment */", 10397 getLLVMStyle())); 10398 } 10399 10400 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 10401 FormatStyle NoSpace = getLLVMStyle(); 10402 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 10403 10404 verifyFormat("while(true)\n" 10405 " continue;", 10406 NoSpace); 10407 verifyFormat("for(;;)\n" 10408 " continue;", 10409 NoSpace); 10410 verifyFormat("if(true)\n" 10411 " f();\n" 10412 "else if(true)\n" 10413 " f();", 10414 NoSpace); 10415 verifyFormat("do {\n" 10416 " do_something();\n" 10417 "} while(something());", 10418 NoSpace); 10419 verifyFormat("switch(x) {\n" 10420 "default:\n" 10421 " break;\n" 10422 "}", 10423 NoSpace); 10424 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 10425 verifyFormat("size_t x = sizeof(x);", NoSpace); 10426 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 10427 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 10428 verifyFormat("alignas(128) char a[128];", NoSpace); 10429 verifyFormat("size_t x = alignof(MyType);", NoSpace); 10430 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 10431 verifyFormat("int f() throw(Deprecated);", NoSpace); 10432 verifyFormat("typedef void (*cb)(int);", NoSpace); 10433 verifyFormat("T A::operator()();", NoSpace); 10434 verifyFormat("X A::operator++(T);", NoSpace); 10435 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 10436 10437 FormatStyle Space = getLLVMStyle(); 10438 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 10439 10440 verifyFormat("int f ();", Space); 10441 verifyFormat("void f (int a, T b) {\n" 10442 " while (true)\n" 10443 " continue;\n" 10444 "}", 10445 Space); 10446 verifyFormat("if (true)\n" 10447 " f ();\n" 10448 "else if (true)\n" 10449 " f ();", 10450 Space); 10451 verifyFormat("do {\n" 10452 " do_something ();\n" 10453 "} while (something ());", 10454 Space); 10455 verifyFormat("switch (x) {\n" 10456 "default:\n" 10457 " break;\n" 10458 "}", 10459 Space); 10460 verifyFormat("A::A () : a (1) {}", Space); 10461 verifyFormat("void f () __attribute__ ((asdf));", Space); 10462 verifyFormat("*(&a + 1);\n" 10463 "&((&a)[1]);\n" 10464 "a[(b + c) * d];\n" 10465 "(((a + 1) * 2) + 3) * 4;", 10466 Space); 10467 verifyFormat("#define A(x) x", Space); 10468 verifyFormat("#define A (x) x", Space); 10469 verifyFormat("#if defined(x)\n" 10470 "#endif", 10471 Space); 10472 verifyFormat("auto i = std::make_unique<int> (5);", Space); 10473 verifyFormat("size_t x = sizeof (x);", Space); 10474 verifyFormat("auto f (int x) -> decltype (x);", Space); 10475 verifyFormat("int f (T x) noexcept (x.create ());", Space); 10476 verifyFormat("alignas (128) char a[128];", Space); 10477 verifyFormat("size_t x = alignof (MyType);", Space); 10478 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 10479 verifyFormat("int f () throw (Deprecated);", Space); 10480 verifyFormat("typedef void (*cb) (int);", Space); 10481 verifyFormat("T A::operator() ();", Space); 10482 verifyFormat("X A::operator++ (T);", Space); 10483 verifyFormat("auto lambda = [] () { return 0; };", Space); 10484 verifyFormat("int x = int (y);", Space); 10485 10486 FormatStyle SomeSpace = getLLVMStyle(); 10487 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 10488 10489 verifyFormat("[]() -> float {}", SomeSpace); 10490 verifyFormat("[] (auto foo) {}", SomeSpace); 10491 verifyFormat("[foo]() -> int {}", SomeSpace); 10492 verifyFormat("int f();", SomeSpace); 10493 verifyFormat("void f (int a, T b) {\n" 10494 " while (true)\n" 10495 " continue;\n" 10496 "}", 10497 SomeSpace); 10498 verifyFormat("if (true)\n" 10499 " f();\n" 10500 "else if (true)\n" 10501 " f();", 10502 SomeSpace); 10503 verifyFormat("do {\n" 10504 " do_something();\n" 10505 "} while (something());", 10506 SomeSpace); 10507 verifyFormat("switch (x) {\n" 10508 "default:\n" 10509 " break;\n" 10510 "}", 10511 SomeSpace); 10512 verifyFormat("A::A() : a (1) {}", SomeSpace); 10513 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 10514 verifyFormat("*(&a + 1);\n" 10515 "&((&a)[1]);\n" 10516 "a[(b + c) * d];\n" 10517 "(((a + 1) * 2) + 3) * 4;", 10518 SomeSpace); 10519 verifyFormat("#define A(x) x", SomeSpace); 10520 verifyFormat("#define A (x) x", SomeSpace); 10521 verifyFormat("#if defined(x)\n" 10522 "#endif", 10523 SomeSpace); 10524 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10525 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10526 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10527 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10528 verifyFormat("alignas (128) char a[128];", SomeSpace); 10529 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10530 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10531 SomeSpace); 10532 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10533 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10534 verifyFormat("T A::operator()();", SomeSpace); 10535 verifyFormat("X A::operator++ (T);", SomeSpace); 10536 verifyFormat("int x = int (y);", SomeSpace); 10537 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10538 } 10539 10540 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10541 FormatStyle Spaces = getLLVMStyle(); 10542 Spaces.SpaceAfterLogicalNot = true; 10543 10544 verifyFormat("bool x = ! y", Spaces); 10545 verifyFormat("if (! isFailure())", Spaces); 10546 verifyFormat("if (! (a && b))", Spaces); 10547 verifyFormat("\"Error!\"", Spaces); 10548 verifyFormat("! ! x", Spaces); 10549 } 10550 10551 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10552 FormatStyle Spaces = getLLVMStyle(); 10553 10554 Spaces.SpacesInParentheses = true; 10555 verifyFormat("do_something( ::globalVar );", Spaces); 10556 verifyFormat("call( x, y, z );", Spaces); 10557 verifyFormat("call();", Spaces); 10558 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10559 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10560 Spaces); 10561 verifyFormat("while ( (bool)1 )\n" 10562 " continue;", 10563 Spaces); 10564 verifyFormat("for ( ;; )\n" 10565 " continue;", 10566 Spaces); 10567 verifyFormat("if ( true )\n" 10568 " f();\n" 10569 "else if ( true )\n" 10570 " f();", 10571 Spaces); 10572 verifyFormat("do {\n" 10573 " do_something( (int)i );\n" 10574 "} while ( something() );", 10575 Spaces); 10576 verifyFormat("switch ( x ) {\n" 10577 "default:\n" 10578 " break;\n" 10579 "}", 10580 Spaces); 10581 10582 Spaces.SpacesInParentheses = false; 10583 Spaces.SpacesInCStyleCastParentheses = true; 10584 verifyFormat("Type *A = ( Type * )P;", Spaces); 10585 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 10586 verifyFormat("x = ( int32 )y;", Spaces); 10587 verifyFormat("int a = ( int )(2.0f);", Spaces); 10588 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 10589 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 10590 verifyFormat("#define x (( int )-1)", Spaces); 10591 10592 // Run the first set of tests again with: 10593 Spaces.SpacesInParentheses = false; 10594 Spaces.SpaceInEmptyParentheses = true; 10595 Spaces.SpacesInCStyleCastParentheses = true; 10596 verifyFormat("call(x, y, z);", Spaces); 10597 verifyFormat("call( );", Spaces); 10598 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10599 verifyFormat("while (( bool )1)\n" 10600 " continue;", 10601 Spaces); 10602 verifyFormat("for (;;)\n" 10603 " continue;", 10604 Spaces); 10605 verifyFormat("if (true)\n" 10606 " f( );\n" 10607 "else if (true)\n" 10608 " f( );", 10609 Spaces); 10610 verifyFormat("do {\n" 10611 " do_something(( int )i);\n" 10612 "} while (something( ));", 10613 Spaces); 10614 verifyFormat("switch (x) {\n" 10615 "default:\n" 10616 " break;\n" 10617 "}", 10618 Spaces); 10619 10620 // Run the first set of tests again with: 10621 Spaces.SpaceAfterCStyleCast = true; 10622 verifyFormat("call(x, y, z);", Spaces); 10623 verifyFormat("call( );", Spaces); 10624 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10625 verifyFormat("while (( bool ) 1)\n" 10626 " continue;", 10627 Spaces); 10628 verifyFormat("for (;;)\n" 10629 " continue;", 10630 Spaces); 10631 verifyFormat("if (true)\n" 10632 " f( );\n" 10633 "else if (true)\n" 10634 " f( );", 10635 Spaces); 10636 verifyFormat("do {\n" 10637 " do_something(( int ) i);\n" 10638 "} while (something( ));", 10639 Spaces); 10640 verifyFormat("switch (x) {\n" 10641 "default:\n" 10642 " break;\n" 10643 "}", 10644 Spaces); 10645 10646 // Run subset of tests again with: 10647 Spaces.SpacesInCStyleCastParentheses = false; 10648 Spaces.SpaceAfterCStyleCast = true; 10649 verifyFormat("while ((bool) 1)\n" 10650 " continue;", 10651 Spaces); 10652 verifyFormat("do {\n" 10653 " do_something((int) i);\n" 10654 "} while (something( ));", 10655 Spaces); 10656 } 10657 10658 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 10659 verifyFormat("int a[5];"); 10660 verifyFormat("a[3] += 42;"); 10661 10662 FormatStyle Spaces = getLLVMStyle(); 10663 Spaces.SpacesInSquareBrackets = true; 10664 // Not lambdas. 10665 verifyFormat("int a[ 5 ];", Spaces); 10666 verifyFormat("a[ 3 ] += 42;", Spaces); 10667 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 10668 verifyFormat("double &operator[](int i) { return 0; }\n" 10669 "int i;", 10670 Spaces); 10671 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 10672 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 10673 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 10674 // Lambdas. 10675 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 10676 verifyFormat("return [ i, args... ] {};", Spaces); 10677 verifyFormat("int foo = [ &bar ]() {};", Spaces); 10678 verifyFormat("int foo = [ = ]() {};", Spaces); 10679 verifyFormat("int foo = [ & ]() {};", Spaces); 10680 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 10681 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 10682 } 10683 10684 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 10685 FormatStyle NoSpaceStyle = getLLVMStyle(); 10686 verifyFormat("int a[5];", NoSpaceStyle); 10687 verifyFormat("a[3] += 42;", NoSpaceStyle); 10688 10689 verifyFormat("int a[1];", NoSpaceStyle); 10690 verifyFormat("int 1 [a];", NoSpaceStyle); 10691 verifyFormat("int a[1][2];", NoSpaceStyle); 10692 verifyFormat("a[7] = 5;", NoSpaceStyle); 10693 verifyFormat("int a = (f())[23];", NoSpaceStyle); 10694 verifyFormat("f([] {})", NoSpaceStyle); 10695 10696 FormatStyle Space = getLLVMStyle(); 10697 Space.SpaceBeforeSquareBrackets = true; 10698 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 10699 verifyFormat("return [i, args...] {};", Space); 10700 10701 verifyFormat("int a [5];", Space); 10702 verifyFormat("a [3] += 42;", Space); 10703 verifyFormat("constexpr char hello []{\"hello\"};", Space); 10704 verifyFormat("double &operator[](int i) { return 0; }\n" 10705 "int i;", 10706 Space); 10707 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 10708 verifyFormat("int i = a [a][a]->f();", Space); 10709 verifyFormat("int i = (*b) [a]->f();", Space); 10710 10711 verifyFormat("int a [1];", Space); 10712 verifyFormat("int 1 [a];", Space); 10713 verifyFormat("int a [1][2];", Space); 10714 verifyFormat("a [7] = 5;", Space); 10715 verifyFormat("int a = (f()) [23];", Space); 10716 verifyFormat("f([] {})", Space); 10717 } 10718 10719 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10720 verifyFormat("int a = 5;"); 10721 verifyFormat("a += 42;"); 10722 verifyFormat("a or_eq 8;"); 10723 10724 FormatStyle Spaces = getLLVMStyle(); 10725 Spaces.SpaceBeforeAssignmentOperators = false; 10726 verifyFormat("int a= 5;", Spaces); 10727 verifyFormat("a+= 42;", Spaces); 10728 verifyFormat("a or_eq 8;", Spaces); 10729 } 10730 10731 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10732 verifyFormat("class Foo : public Bar {};"); 10733 verifyFormat("Foo::Foo() : foo(1) {}"); 10734 verifyFormat("for (auto a : b) {\n}"); 10735 verifyFormat("int x = a ? b : c;"); 10736 verifyFormat("{\n" 10737 "label0:\n" 10738 " int x = 0;\n" 10739 "}"); 10740 verifyFormat("switch (x) {\n" 10741 "case 1:\n" 10742 "default:\n" 10743 "}"); 10744 10745 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10746 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10747 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10748 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10749 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10750 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10751 verifyFormat("{\n" 10752 "label1:\n" 10753 " int x = 0;\n" 10754 "}", 10755 CtorInitializerStyle); 10756 verifyFormat("switch (x) {\n" 10757 "case 1:\n" 10758 "default:\n" 10759 "}", 10760 CtorInitializerStyle); 10761 CtorInitializerStyle.BreakConstructorInitializers = 10762 FormatStyle::BCIS_AfterColon; 10763 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10764 " aaaaaaaaaaaaaaaa(1),\n" 10765 " bbbbbbbbbbbbbbbb(2) {}", 10766 CtorInitializerStyle); 10767 CtorInitializerStyle.BreakConstructorInitializers = 10768 FormatStyle::BCIS_BeforeComma; 10769 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10770 " : aaaaaaaaaaaaaaaa(1)\n" 10771 " , bbbbbbbbbbbbbbbb(2) {}", 10772 CtorInitializerStyle); 10773 CtorInitializerStyle.BreakConstructorInitializers = 10774 FormatStyle::BCIS_BeforeColon; 10775 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10776 " : aaaaaaaaaaaaaaaa(1),\n" 10777 " bbbbbbbbbbbbbbbb(2) {}", 10778 CtorInitializerStyle); 10779 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10780 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10781 ": aaaaaaaaaaaaaaaa(1),\n" 10782 " bbbbbbbbbbbbbbbb(2) {}", 10783 CtorInitializerStyle); 10784 10785 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10786 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10787 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10788 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10789 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10790 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10791 verifyFormat("{\n" 10792 "label2:\n" 10793 " int x = 0;\n" 10794 "}", 10795 InheritanceStyle); 10796 verifyFormat("switch (x) {\n" 10797 "case 1:\n" 10798 "default:\n" 10799 "}", 10800 InheritanceStyle); 10801 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10802 verifyFormat("class Foooooooooooooooooooooo:\n" 10803 " public aaaaaaaaaaaaaaaaaa,\n" 10804 " public bbbbbbbbbbbbbbbbbb {\n" 10805 "}", 10806 InheritanceStyle); 10807 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10808 verifyFormat("class Foooooooooooooooooooooo\n" 10809 " : public aaaaaaaaaaaaaaaaaa\n" 10810 " , public bbbbbbbbbbbbbbbbbb {\n" 10811 "}", 10812 InheritanceStyle); 10813 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10814 verifyFormat("class Foooooooooooooooooooooo\n" 10815 " : public aaaaaaaaaaaaaaaaaa,\n" 10816 " public bbbbbbbbbbbbbbbbbb {\n" 10817 "}", 10818 InheritanceStyle); 10819 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10820 verifyFormat("class Foooooooooooooooooooooo\n" 10821 ": public aaaaaaaaaaaaaaaaaa,\n" 10822 " public bbbbbbbbbbbbbbbbbb {}", 10823 InheritanceStyle); 10824 10825 FormatStyle ForLoopStyle = getLLVMStyle(); 10826 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10827 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10828 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10829 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10830 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10831 verifyFormat("{\n" 10832 "label2:\n" 10833 " int x = 0;\n" 10834 "}", 10835 ForLoopStyle); 10836 verifyFormat("switch (x) {\n" 10837 "case 1:\n" 10838 "default:\n" 10839 "}", 10840 ForLoopStyle); 10841 10842 FormatStyle NoSpaceStyle = getLLVMStyle(); 10843 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10844 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10845 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10846 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10847 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10848 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10849 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10850 verifyFormat("{\n" 10851 "label3:\n" 10852 " int x = 0;\n" 10853 "}", 10854 NoSpaceStyle); 10855 verifyFormat("switch (x) {\n" 10856 "case 1:\n" 10857 "default:\n" 10858 "}", 10859 NoSpaceStyle); 10860 } 10861 10862 TEST_F(FormatTest, AlignConsecutiveMacros) { 10863 FormatStyle Style = getLLVMStyle(); 10864 Style.AlignConsecutiveAssignments = true; 10865 Style.AlignConsecutiveDeclarations = true; 10866 Style.AlignConsecutiveMacros = false; 10867 10868 verifyFormat("#define a 3\n" 10869 "#define bbbb 4\n" 10870 "#define ccc (5)", 10871 Style); 10872 10873 verifyFormat("#define f(x) (x * x)\n" 10874 "#define fff(x, y, z) (x * y + z)\n" 10875 "#define ffff(x, y) (x - y)", 10876 Style); 10877 10878 verifyFormat("#define foo(x, y) (x + y)\n" 10879 "#define bar (5, 6)(2 + 2)", 10880 Style); 10881 10882 verifyFormat("#define a 3\n" 10883 "#define bbbb 4\n" 10884 "#define ccc (5)\n" 10885 "#define f(x) (x * x)\n" 10886 "#define fff(x, y, z) (x * y + z)\n" 10887 "#define ffff(x, y) (x - y)", 10888 Style); 10889 10890 Style.AlignConsecutiveMacros = true; 10891 verifyFormat("#define a 3\n" 10892 "#define bbbb 4\n" 10893 "#define ccc (5)", 10894 Style); 10895 10896 verifyFormat("#define f(x) (x * x)\n" 10897 "#define fff(x, y, z) (x * y + z)\n" 10898 "#define ffff(x, y) (x - y)", 10899 Style); 10900 10901 verifyFormat("#define foo(x, y) (x + y)\n" 10902 "#define bar (5, 6)(2 + 2)", 10903 Style); 10904 10905 verifyFormat("#define a 3\n" 10906 "#define bbbb 4\n" 10907 "#define ccc (5)\n" 10908 "#define f(x) (x * x)\n" 10909 "#define fff(x, y, z) (x * y + z)\n" 10910 "#define ffff(x, y) (x - y)", 10911 Style); 10912 10913 verifyFormat("#define a 5\n" 10914 "#define foo(x, y) (x + y)\n" 10915 "#define CCC (6)\n" 10916 "auto lambda = []() {\n" 10917 " auto ii = 0;\n" 10918 " float j = 0;\n" 10919 " return 0;\n" 10920 "};\n" 10921 "int i = 0;\n" 10922 "float i2 = 0;\n" 10923 "auto v = type{\n" 10924 " i = 1, //\n" 10925 " (i = 2), //\n" 10926 " i = 3 //\n" 10927 "};", 10928 Style); 10929 10930 Style.AlignConsecutiveMacros = false; 10931 Style.ColumnLimit = 20; 10932 10933 verifyFormat("#define a \\\n" 10934 " \"aabbbbbbbbbbbb\"\n" 10935 "#define D \\\n" 10936 " \"aabbbbbbbbbbbb\" \\\n" 10937 " \"ccddeeeeeeeee\"\n" 10938 "#define B \\\n" 10939 " \"QQQQQQQQQQQQQ\" \\\n" 10940 " \"FFFFFFFFFFFFF\" \\\n" 10941 " \"LLLLLLLL\"\n", 10942 Style); 10943 10944 Style.AlignConsecutiveMacros = true; 10945 verifyFormat("#define a \\\n" 10946 " \"aabbbbbbbbbbbb\"\n" 10947 "#define D \\\n" 10948 " \"aabbbbbbbbbbbb\" \\\n" 10949 " \"ccddeeeeeeeee\"\n" 10950 "#define B \\\n" 10951 " \"QQQQQQQQQQQQQ\" \\\n" 10952 " \"FFFFFFFFFFFFF\" \\\n" 10953 " \"LLLLLLLL\"\n", 10954 Style); 10955 } 10956 10957 TEST_F(FormatTest, AlignConsecutiveAssignments) { 10958 FormatStyle Alignment = getLLVMStyle(); 10959 Alignment.AlignConsecutiveMacros = true; 10960 Alignment.AlignConsecutiveAssignments = false; 10961 verifyFormat("int a = 5;\n" 10962 "int oneTwoThree = 123;", 10963 Alignment); 10964 verifyFormat("int a = 5;\n" 10965 "int oneTwoThree = 123;", 10966 Alignment); 10967 10968 Alignment.AlignConsecutiveAssignments = true; 10969 verifyFormat("int a = 5;\n" 10970 "int oneTwoThree = 123;", 10971 Alignment); 10972 verifyFormat("int a = method();\n" 10973 "int oneTwoThree = 133;", 10974 Alignment); 10975 verifyFormat("a &= 5;\n" 10976 "bcd *= 5;\n" 10977 "ghtyf += 5;\n" 10978 "dvfvdb -= 5;\n" 10979 "a /= 5;\n" 10980 "vdsvsv %= 5;\n" 10981 "sfdbddfbdfbb ^= 5;\n" 10982 "dvsdsv |= 5;\n" 10983 "int dsvvdvsdvvv = 123;", 10984 Alignment); 10985 verifyFormat("int i = 1, j = 10;\n" 10986 "something = 2000;", 10987 Alignment); 10988 verifyFormat("something = 2000;\n" 10989 "int i = 1, j = 10;\n", 10990 Alignment); 10991 verifyFormat("something = 2000;\n" 10992 "another = 911;\n" 10993 "int i = 1, j = 10;\n" 10994 "oneMore = 1;\n" 10995 "i = 2;", 10996 Alignment); 10997 verifyFormat("int a = 5;\n" 10998 "int one = 1;\n" 10999 "method();\n" 11000 "int oneTwoThree = 123;\n" 11001 "int oneTwo = 12;", 11002 Alignment); 11003 verifyFormat("int oneTwoThree = 123;\n" 11004 "int oneTwo = 12;\n" 11005 "method();\n", 11006 Alignment); 11007 verifyFormat("int oneTwoThree = 123; // comment\n" 11008 "int oneTwo = 12; // comment", 11009 Alignment); 11010 EXPECT_EQ("int a = 5;\n" 11011 "\n" 11012 "int oneTwoThree = 123;", 11013 format("int a = 5;\n" 11014 "\n" 11015 "int oneTwoThree= 123;", 11016 Alignment)); 11017 EXPECT_EQ("int a = 5;\n" 11018 "int one = 1;\n" 11019 "\n" 11020 "int oneTwoThree = 123;", 11021 format("int a = 5;\n" 11022 "int one = 1;\n" 11023 "\n" 11024 "int oneTwoThree = 123;", 11025 Alignment)); 11026 EXPECT_EQ("int a = 5;\n" 11027 "int one = 1;\n" 11028 "\n" 11029 "int oneTwoThree = 123;\n" 11030 "int oneTwo = 12;", 11031 format("int a = 5;\n" 11032 "int one = 1;\n" 11033 "\n" 11034 "int oneTwoThree = 123;\n" 11035 "int oneTwo = 12;", 11036 Alignment)); 11037 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11038 verifyFormat("#define A \\\n" 11039 " int aaaa = 12; \\\n" 11040 " int b = 23; \\\n" 11041 " int ccc = 234; \\\n" 11042 " int dddddddddd = 2345;", 11043 Alignment); 11044 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11045 verifyFormat("#define A \\\n" 11046 " int aaaa = 12; \\\n" 11047 " int b = 23; \\\n" 11048 " int ccc = 234; \\\n" 11049 " int dddddddddd = 2345;", 11050 Alignment); 11051 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11052 verifyFormat("#define A " 11053 " \\\n" 11054 " int aaaa = 12; " 11055 " \\\n" 11056 " int b = 23; " 11057 " \\\n" 11058 " int ccc = 234; " 11059 " \\\n" 11060 " int dddddddddd = 2345;", 11061 Alignment); 11062 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11063 "k = 4, int l = 5,\n" 11064 " int m = 6) {\n" 11065 " int j = 10;\n" 11066 " otherThing = 1;\n" 11067 "}", 11068 Alignment); 11069 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11070 " int i = 1;\n" 11071 " int j = 2;\n" 11072 " int big = 10000;\n" 11073 "}", 11074 Alignment); 11075 verifyFormat("class C {\n" 11076 "public:\n" 11077 " int i = 1;\n" 11078 " virtual void f() = 0;\n" 11079 "};", 11080 Alignment); 11081 verifyFormat("int i = 1;\n" 11082 "if (SomeType t = getSomething()) {\n" 11083 "}\n" 11084 "int j = 2;\n" 11085 "int big = 10000;", 11086 Alignment); 11087 verifyFormat("int j = 7;\n" 11088 "for (int k = 0; k < N; ++k) {\n" 11089 "}\n" 11090 "int j = 2;\n" 11091 "int big = 10000;\n" 11092 "}", 11093 Alignment); 11094 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11095 verifyFormat("int i = 1;\n" 11096 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11097 " = someLooooooooooooooooongFunction();\n" 11098 "int j = 2;", 11099 Alignment); 11100 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11101 verifyFormat("int i = 1;\n" 11102 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11103 " someLooooooooooooooooongFunction();\n" 11104 "int j = 2;", 11105 Alignment); 11106 11107 verifyFormat("auto lambda = []() {\n" 11108 " auto i = 0;\n" 11109 " return 0;\n" 11110 "};\n" 11111 "int i = 0;\n" 11112 "auto v = type{\n" 11113 " i = 1, //\n" 11114 " (i = 2), //\n" 11115 " i = 3 //\n" 11116 "};", 11117 Alignment); 11118 11119 verifyFormat( 11120 "int i = 1;\n" 11121 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11122 " loooooooooooooooooooooongParameterB);\n" 11123 "int j = 2;", 11124 Alignment); 11125 11126 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 11127 " typename B = very_long_type_name_1,\n" 11128 " typename T_2 = very_long_type_name_2>\n" 11129 "auto foo() {}\n", 11130 Alignment); 11131 verifyFormat("int a, b = 1;\n" 11132 "int c = 2;\n" 11133 "int dd = 3;\n", 11134 Alignment); 11135 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11136 "float b[1][] = {{3.f}};\n", 11137 Alignment); 11138 verifyFormat("for (int i = 0; i < 1; i++)\n" 11139 " int x = 1;\n", 11140 Alignment); 11141 verifyFormat("for (i = 0; i < 1; i++)\n" 11142 " x = 1;\n" 11143 "y = 1;\n", 11144 Alignment); 11145 } 11146 11147 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 11148 FormatStyle Alignment = getLLVMStyle(); 11149 Alignment.AlignConsecutiveMacros = true; 11150 Alignment.AlignConsecutiveDeclarations = false; 11151 verifyFormat("float const a = 5;\n" 11152 "int oneTwoThree = 123;", 11153 Alignment); 11154 verifyFormat("int a = 5;\n" 11155 "float const oneTwoThree = 123;", 11156 Alignment); 11157 11158 Alignment.AlignConsecutiveDeclarations = true; 11159 verifyFormat("float const a = 5;\n" 11160 "int oneTwoThree = 123;", 11161 Alignment); 11162 verifyFormat("int a = method();\n" 11163 "float const oneTwoThree = 133;", 11164 Alignment); 11165 verifyFormat("int i = 1, j = 10;\n" 11166 "something = 2000;", 11167 Alignment); 11168 verifyFormat("something = 2000;\n" 11169 "int i = 1, j = 10;\n", 11170 Alignment); 11171 verifyFormat("float something = 2000;\n" 11172 "double another = 911;\n" 11173 "int i = 1, j = 10;\n" 11174 "const int *oneMore = 1;\n" 11175 "unsigned i = 2;", 11176 Alignment); 11177 verifyFormat("float a = 5;\n" 11178 "int one = 1;\n" 11179 "method();\n" 11180 "const double oneTwoThree = 123;\n" 11181 "const unsigned int oneTwo = 12;", 11182 Alignment); 11183 verifyFormat("int oneTwoThree{0}; // comment\n" 11184 "unsigned oneTwo; // comment", 11185 Alignment); 11186 EXPECT_EQ("float const a = 5;\n" 11187 "\n" 11188 "int oneTwoThree = 123;", 11189 format("float const a = 5;\n" 11190 "\n" 11191 "int oneTwoThree= 123;", 11192 Alignment)); 11193 EXPECT_EQ("float a = 5;\n" 11194 "int one = 1;\n" 11195 "\n" 11196 "unsigned oneTwoThree = 123;", 11197 format("float a = 5;\n" 11198 "int one = 1;\n" 11199 "\n" 11200 "unsigned oneTwoThree = 123;", 11201 Alignment)); 11202 EXPECT_EQ("float a = 5;\n" 11203 "int one = 1;\n" 11204 "\n" 11205 "unsigned oneTwoThree = 123;\n" 11206 "int oneTwo = 12;", 11207 format("float a = 5;\n" 11208 "int one = 1;\n" 11209 "\n" 11210 "unsigned oneTwoThree = 123;\n" 11211 "int oneTwo = 12;", 11212 Alignment)); 11213 // Function prototype alignment 11214 verifyFormat("int a();\n" 11215 "double b();", 11216 Alignment); 11217 verifyFormat("int a(int x);\n" 11218 "double b();", 11219 Alignment); 11220 unsigned OldColumnLimit = Alignment.ColumnLimit; 11221 // We need to set ColumnLimit to zero, in order to stress nested alignments, 11222 // otherwise the function parameters will be re-flowed onto a single line. 11223 Alignment.ColumnLimit = 0; 11224 EXPECT_EQ("int a(int x,\n" 11225 " float y);\n" 11226 "double b(int x,\n" 11227 " double y);", 11228 format("int a(int x,\n" 11229 " float y);\n" 11230 "double b(int x,\n" 11231 " double y);", 11232 Alignment)); 11233 // This ensures that function parameters of function declarations are 11234 // correctly indented when their owning functions are indented. 11235 // The failure case here is for 'double y' to not be indented enough. 11236 EXPECT_EQ("double a(int x);\n" 11237 "int b(int y,\n" 11238 " double z);", 11239 format("double a(int x);\n" 11240 "int b(int y,\n" 11241 " double z);", 11242 Alignment)); 11243 // Set ColumnLimit low so that we induce wrapping immediately after 11244 // the function name and opening paren. 11245 Alignment.ColumnLimit = 13; 11246 verifyFormat("int function(\n" 11247 " int x,\n" 11248 " bool y);", 11249 Alignment); 11250 Alignment.ColumnLimit = OldColumnLimit; 11251 // Ensure function pointers don't screw up recursive alignment 11252 verifyFormat("int a(int x, void (*fp)(int y));\n" 11253 "double b();", 11254 Alignment); 11255 Alignment.AlignConsecutiveAssignments = true; 11256 // Ensure recursive alignment is broken by function braces, so that the 11257 // "a = 1" does not align with subsequent assignments inside the function 11258 // body. 11259 verifyFormat("int func(int a = 1) {\n" 11260 " int b = 2;\n" 11261 " int cc = 3;\n" 11262 "}", 11263 Alignment); 11264 verifyFormat("float something = 2000;\n" 11265 "double another = 911;\n" 11266 "int i = 1, j = 10;\n" 11267 "const int *oneMore = 1;\n" 11268 "unsigned i = 2;", 11269 Alignment); 11270 verifyFormat("int oneTwoThree = {0}; // comment\n" 11271 "unsigned oneTwo = 0; // comment", 11272 Alignment); 11273 // Make sure that scope is correctly tracked, in the absence of braces 11274 verifyFormat("for (int i = 0; i < n; i++)\n" 11275 " j = i;\n" 11276 "double x = 1;\n", 11277 Alignment); 11278 verifyFormat("if (int i = 0)\n" 11279 " j = i;\n" 11280 "double x = 1;\n", 11281 Alignment); 11282 // Ensure operator[] and operator() are comprehended 11283 verifyFormat("struct test {\n" 11284 " long long int foo();\n" 11285 " int operator[](int a);\n" 11286 " double bar();\n" 11287 "};\n", 11288 Alignment); 11289 verifyFormat("struct test {\n" 11290 " long long int foo();\n" 11291 " int operator()(int a);\n" 11292 " double bar();\n" 11293 "};\n", 11294 Alignment); 11295 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 11296 " int const i = 1;\n" 11297 " int * j = 2;\n" 11298 " int big = 10000;\n" 11299 "\n" 11300 " unsigned oneTwoThree = 123;\n" 11301 " int oneTwo = 12;\n" 11302 " method();\n" 11303 " float k = 2;\n" 11304 " int ll = 10000;\n" 11305 "}", 11306 format("void SomeFunction(int parameter= 0) {\n" 11307 " int const i= 1;\n" 11308 " int *j=2;\n" 11309 " int big = 10000;\n" 11310 "\n" 11311 "unsigned oneTwoThree =123;\n" 11312 "int oneTwo = 12;\n" 11313 " method();\n" 11314 "float k= 2;\n" 11315 "int ll=10000;\n" 11316 "}", 11317 Alignment)); 11318 Alignment.AlignConsecutiveAssignments = false; 11319 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11320 verifyFormat("#define A \\\n" 11321 " int aaaa = 12; \\\n" 11322 " float b = 23; \\\n" 11323 " const int ccc = 234; \\\n" 11324 " unsigned dddddddddd = 2345;", 11325 Alignment); 11326 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11327 verifyFormat("#define A \\\n" 11328 " int aaaa = 12; \\\n" 11329 " float b = 23; \\\n" 11330 " const int ccc = 234; \\\n" 11331 " unsigned dddddddddd = 2345;", 11332 Alignment); 11333 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11334 Alignment.ColumnLimit = 30; 11335 verifyFormat("#define A \\\n" 11336 " int aaaa = 12; \\\n" 11337 " float b = 23; \\\n" 11338 " const int ccc = 234; \\\n" 11339 " int dddddddddd = 2345;", 11340 Alignment); 11341 Alignment.ColumnLimit = 80; 11342 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11343 "k = 4, int l = 5,\n" 11344 " int m = 6) {\n" 11345 " const int j = 10;\n" 11346 " otherThing = 1;\n" 11347 "}", 11348 Alignment); 11349 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11350 " int const i = 1;\n" 11351 " int * j = 2;\n" 11352 " int big = 10000;\n" 11353 "}", 11354 Alignment); 11355 verifyFormat("class C {\n" 11356 "public:\n" 11357 " int i = 1;\n" 11358 " virtual void f() = 0;\n" 11359 "};", 11360 Alignment); 11361 verifyFormat("float i = 1;\n" 11362 "if (SomeType t = getSomething()) {\n" 11363 "}\n" 11364 "const unsigned j = 2;\n" 11365 "int big = 10000;", 11366 Alignment); 11367 verifyFormat("float j = 7;\n" 11368 "for (int k = 0; k < N; ++k) {\n" 11369 "}\n" 11370 "unsigned j = 2;\n" 11371 "int big = 10000;\n" 11372 "}", 11373 Alignment); 11374 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11375 verifyFormat("float i = 1;\n" 11376 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11377 " = someLooooooooooooooooongFunction();\n" 11378 "int j = 2;", 11379 Alignment); 11380 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11381 verifyFormat("int i = 1;\n" 11382 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11383 " someLooooooooooooooooongFunction();\n" 11384 "int j = 2;", 11385 Alignment); 11386 11387 Alignment.AlignConsecutiveAssignments = true; 11388 verifyFormat("auto lambda = []() {\n" 11389 " auto ii = 0;\n" 11390 " float j = 0;\n" 11391 " return 0;\n" 11392 "};\n" 11393 "int i = 0;\n" 11394 "float i2 = 0;\n" 11395 "auto v = type{\n" 11396 " i = 1, //\n" 11397 " (i = 2), //\n" 11398 " i = 3 //\n" 11399 "};", 11400 Alignment); 11401 Alignment.AlignConsecutiveAssignments = false; 11402 11403 verifyFormat( 11404 "int i = 1;\n" 11405 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11406 " loooooooooooooooooooooongParameterB);\n" 11407 "int j = 2;", 11408 Alignment); 11409 11410 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 11411 // We expect declarations and assignments to align, as long as it doesn't 11412 // exceed the column limit, starting a new alignment sequence whenever it 11413 // happens. 11414 Alignment.AlignConsecutiveAssignments = true; 11415 Alignment.ColumnLimit = 30; 11416 verifyFormat("float ii = 1;\n" 11417 "unsigned j = 2;\n" 11418 "int someVerylongVariable = 1;\n" 11419 "AnotherLongType ll = 123456;\n" 11420 "VeryVeryLongType k = 2;\n" 11421 "int myvar = 1;", 11422 Alignment); 11423 Alignment.ColumnLimit = 80; 11424 Alignment.AlignConsecutiveAssignments = false; 11425 11426 verifyFormat( 11427 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 11428 " typename LongType, typename B>\n" 11429 "auto foo() {}\n", 11430 Alignment); 11431 verifyFormat("float a, b = 1;\n" 11432 "int c = 2;\n" 11433 "int dd = 3;\n", 11434 Alignment); 11435 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11436 "float b[1][] = {{3.f}};\n", 11437 Alignment); 11438 Alignment.AlignConsecutiveAssignments = true; 11439 verifyFormat("float a, b = 1;\n" 11440 "int c = 2;\n" 11441 "int dd = 3;\n", 11442 Alignment); 11443 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11444 "float b[1][] = {{3.f}};\n", 11445 Alignment); 11446 Alignment.AlignConsecutiveAssignments = false; 11447 11448 Alignment.ColumnLimit = 30; 11449 Alignment.BinPackParameters = false; 11450 verifyFormat("void foo(float a,\n" 11451 " float b,\n" 11452 " int c,\n" 11453 " uint32_t *d) {\n" 11454 " int * e = 0;\n" 11455 " float f = 0;\n" 11456 " double g = 0;\n" 11457 "}\n" 11458 "void bar(ino_t a,\n" 11459 " int b,\n" 11460 " uint32_t *c,\n" 11461 " bool d) {}\n", 11462 Alignment); 11463 Alignment.BinPackParameters = true; 11464 Alignment.ColumnLimit = 80; 11465 11466 // Bug 33507 11467 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 11468 verifyFormat( 11469 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 11470 " static const Version verVs2017;\n" 11471 " return true;\n" 11472 "});\n", 11473 Alignment); 11474 Alignment.PointerAlignment = FormatStyle::PAS_Right; 11475 11476 // See llvm.org/PR35641 11477 Alignment.AlignConsecutiveDeclarations = true; 11478 verifyFormat("int func() { //\n" 11479 " int b;\n" 11480 " unsigned c;\n" 11481 "}", 11482 Alignment); 11483 11484 // See PR37175 11485 FormatStyle Style = getMozillaStyle(); 11486 Style.AlignConsecutiveDeclarations = true; 11487 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 11488 "foo(int a);", 11489 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 11490 } 11491 11492 TEST_F(FormatTest, LinuxBraceBreaking) { 11493 FormatStyle LinuxBraceStyle = getLLVMStyle(); 11494 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 11495 verifyFormat("namespace a\n" 11496 "{\n" 11497 "class A\n" 11498 "{\n" 11499 " void f()\n" 11500 " {\n" 11501 " if (true) {\n" 11502 " a();\n" 11503 " b();\n" 11504 " } else {\n" 11505 " a();\n" 11506 " }\n" 11507 " }\n" 11508 " void g() { return; }\n" 11509 "};\n" 11510 "struct B {\n" 11511 " int x;\n" 11512 "};\n" 11513 "} // namespace a\n", 11514 LinuxBraceStyle); 11515 verifyFormat("enum X {\n" 11516 " Y = 0,\n" 11517 "}\n", 11518 LinuxBraceStyle); 11519 verifyFormat("struct S {\n" 11520 " int Type;\n" 11521 " union {\n" 11522 " int x;\n" 11523 " double y;\n" 11524 " } Value;\n" 11525 " class C\n" 11526 " {\n" 11527 " MyFavoriteType Value;\n" 11528 " } Class;\n" 11529 "}\n", 11530 LinuxBraceStyle); 11531 } 11532 11533 TEST_F(FormatTest, MozillaBraceBreaking) { 11534 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11535 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11536 MozillaBraceStyle.FixNamespaceComments = false; 11537 verifyFormat("namespace a {\n" 11538 "class A\n" 11539 "{\n" 11540 " void f()\n" 11541 " {\n" 11542 " if (true) {\n" 11543 " a();\n" 11544 " b();\n" 11545 " }\n" 11546 " }\n" 11547 " void g() { return; }\n" 11548 "};\n" 11549 "enum E\n" 11550 "{\n" 11551 " A,\n" 11552 " // foo\n" 11553 " B,\n" 11554 " C\n" 11555 "};\n" 11556 "struct B\n" 11557 "{\n" 11558 " int x;\n" 11559 "};\n" 11560 "}\n", 11561 MozillaBraceStyle); 11562 verifyFormat("struct S\n" 11563 "{\n" 11564 " int Type;\n" 11565 " union\n" 11566 " {\n" 11567 " int x;\n" 11568 " double y;\n" 11569 " } Value;\n" 11570 " class C\n" 11571 " {\n" 11572 " MyFavoriteType Value;\n" 11573 " } Class;\n" 11574 "}\n", 11575 MozillaBraceStyle); 11576 } 11577 11578 TEST_F(FormatTest, StroustrupBraceBreaking) { 11579 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11580 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11581 verifyFormat("namespace a {\n" 11582 "class A {\n" 11583 " void f()\n" 11584 " {\n" 11585 " if (true) {\n" 11586 " a();\n" 11587 " b();\n" 11588 " }\n" 11589 " }\n" 11590 " void g() { return; }\n" 11591 "};\n" 11592 "struct B {\n" 11593 " int x;\n" 11594 "};\n" 11595 "} // namespace a\n", 11596 StroustrupBraceStyle); 11597 11598 verifyFormat("void foo()\n" 11599 "{\n" 11600 " if (a) {\n" 11601 " a();\n" 11602 " }\n" 11603 " else {\n" 11604 " b();\n" 11605 " }\n" 11606 "}\n", 11607 StroustrupBraceStyle); 11608 11609 verifyFormat("#ifdef _DEBUG\n" 11610 "int foo(int i = 0)\n" 11611 "#else\n" 11612 "int foo(int i = 5)\n" 11613 "#endif\n" 11614 "{\n" 11615 " return i;\n" 11616 "}", 11617 StroustrupBraceStyle); 11618 11619 verifyFormat("void foo() {}\n" 11620 "void bar()\n" 11621 "#ifdef _DEBUG\n" 11622 "{\n" 11623 " foo();\n" 11624 "}\n" 11625 "#else\n" 11626 "{\n" 11627 "}\n" 11628 "#endif", 11629 StroustrupBraceStyle); 11630 11631 verifyFormat("void foobar() { int i = 5; }\n" 11632 "#ifdef _DEBUG\n" 11633 "void bar() {}\n" 11634 "#else\n" 11635 "void bar() { foobar(); }\n" 11636 "#endif", 11637 StroustrupBraceStyle); 11638 } 11639 11640 TEST_F(FormatTest, AllmanBraceBreaking) { 11641 FormatStyle AllmanBraceStyle = getLLVMStyle(); 11642 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 11643 11644 EXPECT_EQ("namespace a\n" 11645 "{\n" 11646 "void f();\n" 11647 "void g();\n" 11648 "} // namespace a\n", 11649 format("namespace a\n" 11650 "{\n" 11651 "void f();\n" 11652 "void g();\n" 11653 "}\n", 11654 AllmanBraceStyle)); 11655 11656 verifyFormat("namespace a\n" 11657 "{\n" 11658 "class A\n" 11659 "{\n" 11660 " void f()\n" 11661 " {\n" 11662 " if (true)\n" 11663 " {\n" 11664 " a();\n" 11665 " b();\n" 11666 " }\n" 11667 " }\n" 11668 " void g() { return; }\n" 11669 "};\n" 11670 "struct B\n" 11671 "{\n" 11672 " int x;\n" 11673 "};\n" 11674 "union C\n" 11675 "{\n" 11676 "};\n" 11677 "} // namespace a", 11678 AllmanBraceStyle); 11679 11680 verifyFormat("void f()\n" 11681 "{\n" 11682 " if (true)\n" 11683 " {\n" 11684 " a();\n" 11685 " }\n" 11686 " else if (false)\n" 11687 " {\n" 11688 " b();\n" 11689 " }\n" 11690 " else\n" 11691 " {\n" 11692 " c();\n" 11693 " }\n" 11694 "}\n", 11695 AllmanBraceStyle); 11696 11697 verifyFormat("void f()\n" 11698 "{\n" 11699 " for (int i = 0; i < 10; ++i)\n" 11700 " {\n" 11701 " a();\n" 11702 " }\n" 11703 " while (false)\n" 11704 " {\n" 11705 " b();\n" 11706 " }\n" 11707 " do\n" 11708 " {\n" 11709 " c();\n" 11710 " } while (false)\n" 11711 "}\n", 11712 AllmanBraceStyle); 11713 11714 verifyFormat("void f(int a)\n" 11715 "{\n" 11716 " switch (a)\n" 11717 " {\n" 11718 " case 0:\n" 11719 " break;\n" 11720 " case 1:\n" 11721 " {\n" 11722 " break;\n" 11723 " }\n" 11724 " case 2:\n" 11725 " {\n" 11726 " }\n" 11727 " break;\n" 11728 " default:\n" 11729 " break;\n" 11730 " }\n" 11731 "}\n", 11732 AllmanBraceStyle); 11733 11734 verifyFormat("enum X\n" 11735 "{\n" 11736 " Y = 0,\n" 11737 "}\n", 11738 AllmanBraceStyle); 11739 verifyFormat("enum X\n" 11740 "{\n" 11741 " Y = 0\n" 11742 "}\n", 11743 AllmanBraceStyle); 11744 11745 verifyFormat("@interface BSApplicationController ()\n" 11746 "{\n" 11747 "@private\n" 11748 " id _extraIvar;\n" 11749 "}\n" 11750 "@end\n", 11751 AllmanBraceStyle); 11752 11753 verifyFormat("#ifdef _DEBUG\n" 11754 "int foo(int i = 0)\n" 11755 "#else\n" 11756 "int foo(int i = 5)\n" 11757 "#endif\n" 11758 "{\n" 11759 " return i;\n" 11760 "}", 11761 AllmanBraceStyle); 11762 11763 verifyFormat("void foo() {}\n" 11764 "void bar()\n" 11765 "#ifdef _DEBUG\n" 11766 "{\n" 11767 " foo();\n" 11768 "}\n" 11769 "#else\n" 11770 "{\n" 11771 "}\n" 11772 "#endif", 11773 AllmanBraceStyle); 11774 11775 verifyFormat("void foobar() { int i = 5; }\n" 11776 "#ifdef _DEBUG\n" 11777 "void bar() {}\n" 11778 "#else\n" 11779 "void bar() { foobar(); }\n" 11780 "#endif", 11781 AllmanBraceStyle); 11782 11783 // This shouldn't affect ObjC blocks.. 11784 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11785 " // ...\n" 11786 " int i;\n" 11787 "}];", 11788 AllmanBraceStyle); 11789 verifyFormat("void (^block)(void) = ^{\n" 11790 " // ...\n" 11791 " int i;\n" 11792 "};", 11793 AllmanBraceStyle); 11794 // .. or dict literals. 11795 verifyFormat("void f()\n" 11796 "{\n" 11797 " // ...\n" 11798 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11799 "}", 11800 AllmanBraceStyle); 11801 verifyFormat("void f()\n" 11802 "{\n" 11803 " // ...\n" 11804 " [object someMethod:@{a : @\"b\"}];\n" 11805 "}", 11806 AllmanBraceStyle); 11807 verifyFormat("int f()\n" 11808 "{ // comment\n" 11809 " return 42;\n" 11810 "}", 11811 AllmanBraceStyle); 11812 11813 AllmanBraceStyle.ColumnLimit = 19; 11814 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11815 AllmanBraceStyle.ColumnLimit = 18; 11816 verifyFormat("void f()\n" 11817 "{\n" 11818 " int i;\n" 11819 "}", 11820 AllmanBraceStyle); 11821 AllmanBraceStyle.ColumnLimit = 80; 11822 11823 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11824 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11825 FormatStyle::SIS_WithoutElse; 11826 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11827 verifyFormat("void f(bool b)\n" 11828 "{\n" 11829 " if (b)\n" 11830 " {\n" 11831 " return;\n" 11832 " }\n" 11833 "}\n", 11834 BreakBeforeBraceShortIfs); 11835 verifyFormat("void f(bool b)\n" 11836 "{\n" 11837 " if constexpr (b)\n" 11838 " {\n" 11839 " return;\n" 11840 " }\n" 11841 "}\n", 11842 BreakBeforeBraceShortIfs); 11843 verifyFormat("void f(bool b)\n" 11844 "{\n" 11845 " if CONSTEXPR (b)\n" 11846 " {\n" 11847 " return;\n" 11848 " }\n" 11849 "}\n", 11850 BreakBeforeBraceShortIfs); 11851 verifyFormat("void f(bool b)\n" 11852 "{\n" 11853 " if (b) return;\n" 11854 "}\n", 11855 BreakBeforeBraceShortIfs); 11856 verifyFormat("void f(bool b)\n" 11857 "{\n" 11858 " if constexpr (b) return;\n" 11859 "}\n", 11860 BreakBeforeBraceShortIfs); 11861 verifyFormat("void f(bool b)\n" 11862 "{\n" 11863 " if CONSTEXPR (b) return;\n" 11864 "}\n", 11865 BreakBeforeBraceShortIfs); 11866 verifyFormat("void f(bool b)\n" 11867 "{\n" 11868 " while (b)\n" 11869 " {\n" 11870 " return;\n" 11871 " }\n" 11872 "}\n", 11873 BreakBeforeBraceShortIfs); 11874 } 11875 11876 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 11877 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 11878 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 11879 11880 // Make a few changes to the style for testing purposes 11881 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 11882 FormatStyle::SFS_Empty; 11883 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 11884 WhitesmithsBraceStyle.ColumnLimit = 0; 11885 11886 // FIXME: this test case can't decide whether there should be a blank line 11887 // after the ~D() line or not. It adds one if one doesn't exist in the test 11888 // and it removes the line if one exists. 11889 /* 11890 verifyFormat("class A;\n" 11891 "namespace B\n" 11892 " {\n" 11893 "class C;\n" 11894 "// Comment\n" 11895 "class D\n" 11896 " {\n" 11897 "public:\n" 11898 " D();\n" 11899 " ~D() {}\n" 11900 "private:\n" 11901 " enum E\n" 11902 " {\n" 11903 " F\n" 11904 " }\n" 11905 " };\n" 11906 " } // namespace B\n", 11907 WhitesmithsBraceStyle); 11908 */ 11909 11910 verifyFormat("namespace a\n" 11911 " {\n" 11912 "class A\n" 11913 " {\n" 11914 " void f()\n" 11915 " {\n" 11916 " if (true)\n" 11917 " {\n" 11918 " a();\n" 11919 " b();\n" 11920 " }\n" 11921 " }\n" 11922 " void g()\n" 11923 " {\n" 11924 " return;\n" 11925 " }\n" 11926 " };\n" 11927 "struct B\n" 11928 " {\n" 11929 " int x;\n" 11930 " };\n" 11931 " } // namespace a", 11932 WhitesmithsBraceStyle); 11933 11934 verifyFormat("void f()\n" 11935 " {\n" 11936 " if (true)\n" 11937 " {\n" 11938 " a();\n" 11939 " }\n" 11940 " else if (false)\n" 11941 " {\n" 11942 " b();\n" 11943 " }\n" 11944 " else\n" 11945 " {\n" 11946 " c();\n" 11947 " }\n" 11948 " }\n", 11949 WhitesmithsBraceStyle); 11950 11951 verifyFormat("void f()\n" 11952 " {\n" 11953 " for (int i = 0; i < 10; ++i)\n" 11954 " {\n" 11955 " a();\n" 11956 " }\n" 11957 " while (false)\n" 11958 " {\n" 11959 " b();\n" 11960 " }\n" 11961 " do\n" 11962 " {\n" 11963 " c();\n" 11964 " } while (false)\n" 11965 " }\n", 11966 WhitesmithsBraceStyle); 11967 11968 // FIXME: the block and the break under case 2 in this test don't get indented 11969 // correctly 11970 /* 11971 verifyFormat("void switchTest1(int a)\n" 11972 " {\n" 11973 " switch (a)\n" 11974 " {\n" 11975 " case 2:\n" 11976 " {\n" 11977 " }\n" 11978 " break;\n" 11979 " }\n" 11980 " }\n", 11981 WhitesmithsBraceStyle); 11982 */ 11983 11984 // FIXME: the block and the break under case 2 in this test don't get indented 11985 // correctly 11986 /* 11987 verifyFormat("void switchTest2(int a)\n" 11988 " {\n" 11989 " switch (a)\n" 11990 " {\n" 11991 " case 0:\n" 11992 " break;\n" 11993 " case 1:\n" 11994 " {\n" 11995 " break;\n" 11996 " }\n" 11997 " case 2:\n" 11998 " {\n" 11999 " }\n" 12000 " break;\n" 12001 " default:\n" 12002 " break;\n" 12003 " }\n" 12004 " }\n", 12005 WhitesmithsBraceStyle); 12006 */ 12007 12008 verifyFormat("enum X\n" 12009 " {\n" 12010 " Y = 0, // testing\n" 12011 " }\n", 12012 WhitesmithsBraceStyle); 12013 12014 verifyFormat("enum X\n" 12015 " {\n" 12016 " Y = 0\n" 12017 " }\n", 12018 WhitesmithsBraceStyle); 12019 verifyFormat("enum X\n" 12020 " {\n" 12021 " Y = 0,\n" 12022 " Z = 1\n" 12023 " };\n", 12024 WhitesmithsBraceStyle); 12025 12026 verifyFormat("@interface BSApplicationController ()\n" 12027 " {\n" 12028 "@private\n" 12029 " id _extraIvar;\n" 12030 " }\n" 12031 "@end\n", 12032 WhitesmithsBraceStyle); 12033 12034 verifyFormat("#ifdef _DEBUG\n" 12035 "int foo(int i = 0)\n" 12036 "#else\n" 12037 "int foo(int i = 5)\n" 12038 "#endif\n" 12039 " {\n" 12040 " return i;\n" 12041 " }", 12042 WhitesmithsBraceStyle); 12043 12044 verifyFormat("void foo() {}\n" 12045 "void bar()\n" 12046 "#ifdef _DEBUG\n" 12047 " {\n" 12048 " foo();\n" 12049 " }\n" 12050 "#else\n" 12051 " {\n" 12052 " }\n" 12053 "#endif", 12054 WhitesmithsBraceStyle); 12055 12056 verifyFormat("void foobar()\n" 12057 " {\n" 12058 " int i = 5;\n" 12059 " }\n" 12060 "#ifdef _DEBUG\n" 12061 "void bar()\n" 12062 " {\n" 12063 " }\n" 12064 "#else\n" 12065 "void bar()\n" 12066 " {\n" 12067 " foobar();\n" 12068 " }\n" 12069 "#endif", 12070 WhitesmithsBraceStyle); 12071 12072 // This shouldn't affect ObjC blocks.. 12073 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 12074 " // ...\n" 12075 " int i;\n" 12076 "}];", 12077 WhitesmithsBraceStyle); 12078 verifyFormat("void (^block)(void) = ^{\n" 12079 " // ...\n" 12080 " int i;\n" 12081 "};", 12082 WhitesmithsBraceStyle); 12083 // .. or dict literals. 12084 verifyFormat("void f()\n" 12085 " {\n" 12086 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 12087 " }", 12088 WhitesmithsBraceStyle); 12089 12090 verifyFormat("int f()\n" 12091 " { // comment\n" 12092 " return 42;\n" 12093 " }", 12094 WhitesmithsBraceStyle); 12095 12096 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 12097 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 12098 FormatStyle::SIS_Always; 12099 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 12100 verifyFormat("void f(bool b)\n" 12101 " {\n" 12102 " if (b)\n" 12103 " {\n" 12104 " return;\n" 12105 " }\n" 12106 " }\n", 12107 BreakBeforeBraceShortIfs); 12108 verifyFormat("void f(bool b)\n" 12109 " {\n" 12110 " if (b) return;\n" 12111 " }\n", 12112 BreakBeforeBraceShortIfs); 12113 verifyFormat("void f(bool b)\n" 12114 " {\n" 12115 " while (b)\n" 12116 " {\n" 12117 " return;\n" 12118 " }\n" 12119 " }\n", 12120 BreakBeforeBraceShortIfs); 12121 } 12122 12123 TEST_F(FormatTest, GNUBraceBreaking) { 12124 FormatStyle GNUBraceStyle = getLLVMStyle(); 12125 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 12126 verifyFormat("namespace a\n" 12127 "{\n" 12128 "class A\n" 12129 "{\n" 12130 " void f()\n" 12131 " {\n" 12132 " int a;\n" 12133 " {\n" 12134 " int b;\n" 12135 " }\n" 12136 " if (true)\n" 12137 " {\n" 12138 " a();\n" 12139 " b();\n" 12140 " }\n" 12141 " }\n" 12142 " void g() { return; }\n" 12143 "}\n" 12144 "} // namespace a", 12145 GNUBraceStyle); 12146 12147 verifyFormat("void f()\n" 12148 "{\n" 12149 " if (true)\n" 12150 " {\n" 12151 " a();\n" 12152 " }\n" 12153 " else if (false)\n" 12154 " {\n" 12155 " b();\n" 12156 " }\n" 12157 " else\n" 12158 " {\n" 12159 " c();\n" 12160 " }\n" 12161 "}\n", 12162 GNUBraceStyle); 12163 12164 verifyFormat("void f()\n" 12165 "{\n" 12166 " for (int i = 0; i < 10; ++i)\n" 12167 " {\n" 12168 " a();\n" 12169 " }\n" 12170 " while (false)\n" 12171 " {\n" 12172 " b();\n" 12173 " }\n" 12174 " do\n" 12175 " {\n" 12176 " c();\n" 12177 " }\n" 12178 " while (false);\n" 12179 "}\n", 12180 GNUBraceStyle); 12181 12182 verifyFormat("void f(int a)\n" 12183 "{\n" 12184 " switch (a)\n" 12185 " {\n" 12186 " case 0:\n" 12187 " break;\n" 12188 " case 1:\n" 12189 " {\n" 12190 " break;\n" 12191 " }\n" 12192 " case 2:\n" 12193 " {\n" 12194 " }\n" 12195 " break;\n" 12196 " default:\n" 12197 " break;\n" 12198 " }\n" 12199 "}\n", 12200 GNUBraceStyle); 12201 12202 verifyFormat("enum X\n" 12203 "{\n" 12204 " Y = 0,\n" 12205 "}\n", 12206 GNUBraceStyle); 12207 12208 verifyFormat("@interface BSApplicationController ()\n" 12209 "{\n" 12210 "@private\n" 12211 " id _extraIvar;\n" 12212 "}\n" 12213 "@end\n", 12214 GNUBraceStyle); 12215 12216 verifyFormat("#ifdef _DEBUG\n" 12217 "int foo(int i = 0)\n" 12218 "#else\n" 12219 "int foo(int i = 5)\n" 12220 "#endif\n" 12221 "{\n" 12222 " return i;\n" 12223 "}", 12224 GNUBraceStyle); 12225 12226 verifyFormat("void foo() {}\n" 12227 "void bar()\n" 12228 "#ifdef _DEBUG\n" 12229 "{\n" 12230 " foo();\n" 12231 "}\n" 12232 "#else\n" 12233 "{\n" 12234 "}\n" 12235 "#endif", 12236 GNUBraceStyle); 12237 12238 verifyFormat("void foobar() { int i = 5; }\n" 12239 "#ifdef _DEBUG\n" 12240 "void bar() {}\n" 12241 "#else\n" 12242 "void bar() { foobar(); }\n" 12243 "#endif", 12244 GNUBraceStyle); 12245 } 12246 12247 TEST_F(FormatTest, WebKitBraceBreaking) { 12248 FormatStyle WebKitBraceStyle = getLLVMStyle(); 12249 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 12250 WebKitBraceStyle.FixNamespaceComments = false; 12251 verifyFormat("namespace a {\n" 12252 "class A {\n" 12253 " void f()\n" 12254 " {\n" 12255 " if (true) {\n" 12256 " a();\n" 12257 " b();\n" 12258 " }\n" 12259 " }\n" 12260 " void g() { return; }\n" 12261 "};\n" 12262 "enum E {\n" 12263 " A,\n" 12264 " // foo\n" 12265 " B,\n" 12266 " C\n" 12267 "};\n" 12268 "struct B {\n" 12269 " int x;\n" 12270 "};\n" 12271 "}\n", 12272 WebKitBraceStyle); 12273 verifyFormat("struct S {\n" 12274 " int Type;\n" 12275 " union {\n" 12276 " int x;\n" 12277 " double y;\n" 12278 " } Value;\n" 12279 " class C {\n" 12280 " MyFavoriteType Value;\n" 12281 " } Class;\n" 12282 "};\n", 12283 WebKitBraceStyle); 12284 } 12285 12286 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 12287 verifyFormat("void f() {\n" 12288 " try {\n" 12289 " } catch (const Exception &e) {\n" 12290 " }\n" 12291 "}\n", 12292 getLLVMStyle()); 12293 } 12294 12295 TEST_F(FormatTest, UnderstandsPragmas) { 12296 verifyFormat("#pragma omp reduction(| : var)"); 12297 verifyFormat("#pragma omp reduction(+ : var)"); 12298 12299 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 12300 "(including parentheses).", 12301 format("#pragma mark Any non-hyphenated or hyphenated string " 12302 "(including parentheses).")); 12303 } 12304 12305 TEST_F(FormatTest, UnderstandPragmaOption) { 12306 verifyFormat("#pragma option -C -A"); 12307 12308 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 12309 } 12310 12311 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 12312 FormatStyle Style = getLLVMStyle(); 12313 Style.ColumnLimit = 20; 12314 12315 // See PR41213 12316 EXPECT_EQ("/*\n" 12317 " *\t9012345\n" 12318 " * /8901\n" 12319 " */", 12320 format("/*\n" 12321 " *\t9012345 /8901\n" 12322 " */", 12323 Style)); 12324 EXPECT_EQ("/*\n" 12325 " *345678\n" 12326 " *\t/8901\n" 12327 " */", 12328 format("/*\n" 12329 " *345678\t/8901\n" 12330 " */", 12331 Style)); 12332 12333 verifyFormat("int a; // the\n" 12334 " // comment", 12335 Style); 12336 EXPECT_EQ("int a; /* first line\n" 12337 " * second\n" 12338 " * line third\n" 12339 " * line\n" 12340 " */", 12341 format("int a; /* first line\n" 12342 " * second\n" 12343 " * line third\n" 12344 " * line\n" 12345 " */", 12346 Style)); 12347 EXPECT_EQ("int a; // first line\n" 12348 " // second\n" 12349 " // line third\n" 12350 " // line", 12351 format("int a; // first line\n" 12352 " // second line\n" 12353 " // third line", 12354 Style)); 12355 12356 Style.PenaltyExcessCharacter = 90; 12357 verifyFormat("int a; // the comment", Style); 12358 EXPECT_EQ("int a; // the comment\n" 12359 " // aaa", 12360 format("int a; // the comment aaa", Style)); 12361 EXPECT_EQ("int a; /* first line\n" 12362 " * second line\n" 12363 " * third line\n" 12364 " */", 12365 format("int a; /* first line\n" 12366 " * second line\n" 12367 " * third line\n" 12368 " */", 12369 Style)); 12370 EXPECT_EQ("int a; // first line\n" 12371 " // second line\n" 12372 " // third line", 12373 format("int a; // first line\n" 12374 " // second line\n" 12375 " // third line", 12376 Style)); 12377 // FIXME: Investigate why this is not getting the same layout as the test 12378 // above. 12379 EXPECT_EQ("int a; /* first line\n" 12380 " * second line\n" 12381 " * third line\n" 12382 " */", 12383 format("int a; /* first line second line third line" 12384 "\n*/", 12385 Style)); 12386 12387 EXPECT_EQ("// foo bar baz bazfoo\n" 12388 "// foo bar foo bar\n", 12389 format("// foo bar baz bazfoo\n" 12390 "// foo bar foo bar\n", 12391 Style)); 12392 EXPECT_EQ("// foo bar baz bazfoo\n" 12393 "// foo bar foo bar\n", 12394 format("// foo bar baz bazfoo\n" 12395 "// foo bar foo bar\n", 12396 Style)); 12397 12398 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 12399 // next one. 12400 EXPECT_EQ("// foo bar baz bazfoo\n" 12401 "// bar foo bar\n", 12402 format("// foo bar baz bazfoo bar\n" 12403 "// foo bar\n", 12404 Style)); 12405 12406 EXPECT_EQ("// foo bar baz bazfoo\n" 12407 "// foo bar baz bazfoo\n" 12408 "// bar foo bar\n", 12409 format("// foo bar baz bazfoo\n" 12410 "// foo bar baz bazfoo bar\n" 12411 "// foo bar\n", 12412 Style)); 12413 12414 EXPECT_EQ("// foo bar baz bazfoo\n" 12415 "// foo bar baz bazfoo\n" 12416 "// bar foo bar\n", 12417 format("// foo bar baz bazfoo\n" 12418 "// foo bar baz bazfoo bar\n" 12419 "// foo bar\n", 12420 Style)); 12421 12422 // Make sure we do not keep protruding characters if strict mode reflow is 12423 // cheaper than keeping protruding characters. 12424 Style.ColumnLimit = 21; 12425 EXPECT_EQ( 12426 "// foo foo foo foo\n" 12427 "// foo foo foo foo\n" 12428 "// foo foo foo foo\n", 12429 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 12430 12431 EXPECT_EQ("int a = /* long block\n" 12432 " comment */\n" 12433 " 42;", 12434 format("int a = /* long block comment */ 42;", Style)); 12435 } 12436 12437 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 12438 for (size_t i = 1; i < Styles.size(); ++i) \ 12439 EXPECT_EQ(Styles[0], Styles[i]) \ 12440 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 12441 12442 TEST_F(FormatTest, GetsPredefinedStyleByName) { 12443 SmallVector<FormatStyle, 3> Styles; 12444 Styles.resize(3); 12445 12446 Styles[0] = getLLVMStyle(); 12447 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 12448 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 12449 EXPECT_ALL_STYLES_EQUAL(Styles); 12450 12451 Styles[0] = getGoogleStyle(); 12452 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 12453 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 12454 EXPECT_ALL_STYLES_EQUAL(Styles); 12455 12456 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12457 EXPECT_TRUE( 12458 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 12459 EXPECT_TRUE( 12460 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 12461 EXPECT_ALL_STYLES_EQUAL(Styles); 12462 12463 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 12464 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 12465 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 12466 EXPECT_ALL_STYLES_EQUAL(Styles); 12467 12468 Styles[0] = getMozillaStyle(); 12469 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 12470 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 12471 EXPECT_ALL_STYLES_EQUAL(Styles); 12472 12473 Styles[0] = getWebKitStyle(); 12474 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 12475 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 12476 EXPECT_ALL_STYLES_EQUAL(Styles); 12477 12478 Styles[0] = getGNUStyle(); 12479 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 12480 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 12481 EXPECT_ALL_STYLES_EQUAL(Styles); 12482 12483 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 12484 } 12485 12486 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 12487 SmallVector<FormatStyle, 8> Styles; 12488 Styles.resize(2); 12489 12490 Styles[0] = getGoogleStyle(); 12491 Styles[1] = getLLVMStyle(); 12492 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12493 EXPECT_ALL_STYLES_EQUAL(Styles); 12494 12495 Styles.resize(5); 12496 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12497 Styles[1] = getLLVMStyle(); 12498 Styles[1].Language = FormatStyle::LK_JavaScript; 12499 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12500 12501 Styles[2] = getLLVMStyle(); 12502 Styles[2].Language = FormatStyle::LK_JavaScript; 12503 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 12504 "BasedOnStyle: Google", 12505 &Styles[2]) 12506 .value()); 12507 12508 Styles[3] = getLLVMStyle(); 12509 Styles[3].Language = FormatStyle::LK_JavaScript; 12510 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 12511 "Language: JavaScript", 12512 &Styles[3]) 12513 .value()); 12514 12515 Styles[4] = getLLVMStyle(); 12516 Styles[4].Language = FormatStyle::LK_JavaScript; 12517 EXPECT_EQ(0, parseConfiguration("---\n" 12518 "BasedOnStyle: LLVM\n" 12519 "IndentWidth: 123\n" 12520 "---\n" 12521 "BasedOnStyle: Google\n" 12522 "Language: JavaScript", 12523 &Styles[4]) 12524 .value()); 12525 EXPECT_ALL_STYLES_EQUAL(Styles); 12526 } 12527 12528 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 12529 Style.FIELD = false; \ 12530 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 12531 EXPECT_TRUE(Style.FIELD); \ 12532 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 12533 EXPECT_FALSE(Style.FIELD); 12534 12535 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 12536 12537 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 12538 Style.STRUCT.FIELD = false; \ 12539 EXPECT_EQ(0, \ 12540 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 12541 .value()); \ 12542 EXPECT_TRUE(Style.STRUCT.FIELD); \ 12543 EXPECT_EQ(0, \ 12544 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 12545 .value()); \ 12546 EXPECT_FALSE(Style.STRUCT.FIELD); 12547 12548 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 12549 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 12550 12551 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 12552 EXPECT_NE(VALUE, Style.FIELD); \ 12553 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 12554 EXPECT_EQ(VALUE, Style.FIELD) 12555 12556 TEST_F(FormatTest, ParsesConfigurationBools) { 12557 FormatStyle Style = {}; 12558 Style.Language = FormatStyle::LK_Cpp; 12559 CHECK_PARSE_BOOL(AlignOperands); 12560 CHECK_PARSE_BOOL(AlignTrailingComments); 12561 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 12562 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 12563 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 12564 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 12565 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 12566 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 12567 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 12568 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 12569 CHECK_PARSE_BOOL(BinPackArguments); 12570 CHECK_PARSE_BOOL(BinPackParameters); 12571 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 12572 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 12573 CHECK_PARSE_BOOL(BreakStringLiterals); 12574 CHECK_PARSE_BOOL(CompactNamespaces); 12575 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 12576 CHECK_PARSE_BOOL(DeriveLineEnding); 12577 CHECK_PARSE_BOOL(DerivePointerAlignment); 12578 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 12579 CHECK_PARSE_BOOL(DisableFormat); 12580 CHECK_PARSE_BOOL(IndentCaseLabels); 12581 CHECK_PARSE_BOOL(IndentGotoLabels); 12582 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 12583 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 12584 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 12585 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 12586 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 12587 CHECK_PARSE_BOOL(ReflowComments); 12588 CHECK_PARSE_BOOL(SortIncludes); 12589 CHECK_PARSE_BOOL(SortUsingDeclarations); 12590 CHECK_PARSE_BOOL(SpacesInParentheses); 12591 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 12592 CHECK_PARSE_BOOL(SpacesInAngles); 12593 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 12594 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 12595 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 12596 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 12597 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 12598 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 12599 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 12600 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 12601 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 12602 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 12603 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 12604 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 12605 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 12606 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 12607 CHECK_PARSE_BOOL(UseCRLF); 12608 12609 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 12610 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 12611 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 12612 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 12613 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 12614 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 12615 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 12616 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 12617 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 12618 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 12619 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 12620 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 12621 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 12622 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 12623 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 12624 } 12625 12626 #undef CHECK_PARSE_BOOL 12627 12628 TEST_F(FormatTest, ParsesConfiguration) { 12629 FormatStyle Style = {}; 12630 Style.Language = FormatStyle::LK_Cpp; 12631 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 12632 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 12633 ConstructorInitializerIndentWidth, 1234u); 12634 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 12635 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 12636 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 12637 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 12638 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 12639 PenaltyBreakBeforeFirstCallParameter, 1234u); 12640 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 12641 PenaltyBreakTemplateDeclaration, 1234u); 12642 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 12643 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 12644 PenaltyReturnTypeOnItsOwnLine, 1234u); 12645 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 12646 SpacesBeforeTrailingComments, 1234u); 12647 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 12648 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 12649 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 12650 12651 Style.PointerAlignment = FormatStyle::PAS_Middle; 12652 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 12653 FormatStyle::PAS_Left); 12654 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 12655 FormatStyle::PAS_Right); 12656 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 12657 FormatStyle::PAS_Middle); 12658 // For backward compatibility: 12659 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 12660 FormatStyle::PAS_Left); 12661 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 12662 FormatStyle::PAS_Right); 12663 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 12664 FormatStyle::PAS_Middle); 12665 12666 Style.Standard = FormatStyle::LS_Auto; 12667 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 12668 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 12669 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 12670 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 12671 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 12672 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 12673 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 12674 // Legacy aliases: 12675 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 12676 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 12677 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 12678 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 12679 12680 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12681 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 12682 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 12683 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 12684 FormatStyle::BOS_None); 12685 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 12686 FormatStyle::BOS_All); 12687 // For backward compatibility: 12688 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 12689 FormatStyle::BOS_None); 12690 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 12691 FormatStyle::BOS_All); 12692 12693 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 12694 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 12695 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12696 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 12697 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 12698 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 12699 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 12700 // For backward compatibility: 12701 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 12702 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12703 12704 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12705 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 12706 FormatStyle::BILS_BeforeComma); 12707 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 12708 FormatStyle::BILS_AfterColon); 12709 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 12710 FormatStyle::BILS_BeforeColon); 12711 // For backward compatibility: 12712 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 12713 FormatStyle::BILS_BeforeComma); 12714 12715 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12716 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 12717 FormatStyle::BAS_Align); 12718 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 12719 FormatStyle::BAS_DontAlign); 12720 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 12721 FormatStyle::BAS_AlwaysBreak); 12722 // For backward compatibility: 12723 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 12724 FormatStyle::BAS_DontAlign); 12725 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 12726 FormatStyle::BAS_Align); 12727 12728 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12729 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 12730 FormatStyle::ENAS_DontAlign); 12731 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 12732 FormatStyle::ENAS_Left); 12733 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 12734 FormatStyle::ENAS_Right); 12735 // For backward compatibility: 12736 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 12737 FormatStyle::ENAS_Left); 12738 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 12739 FormatStyle::ENAS_Right); 12740 12741 Style.UseTab = FormatStyle::UT_ForIndentation; 12742 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 12743 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 12744 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 12745 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 12746 FormatStyle::UT_ForContinuationAndIndentation); 12747 // For backward compatibility: 12748 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 12749 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 12750 12751 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 12752 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 12753 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12754 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 12755 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 12756 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 12757 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12758 // For backward compatibility: 12759 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 12760 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12761 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 12762 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12763 12764 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 12765 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 12766 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12767 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 12768 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 12769 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 12770 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 12771 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 12772 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12773 // For backward compatibility: 12774 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 12775 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12776 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 12777 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12778 12779 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 12780 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 12781 FormatStyle::SBPO_Never); 12782 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 12783 FormatStyle::SBPO_Always); 12784 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 12785 FormatStyle::SBPO_ControlStatements); 12786 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 12787 FormatStyle::SBPO_NonEmptyParentheses); 12788 // For backward compatibility: 12789 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 12790 FormatStyle::SBPO_Never); 12791 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 12792 FormatStyle::SBPO_ControlStatements); 12793 12794 Style.ColumnLimit = 123; 12795 FormatStyle BaseStyle = getLLVMStyle(); 12796 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 12797 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 12798 12799 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12800 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 12801 FormatStyle::BS_Attach); 12802 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 12803 FormatStyle::BS_Linux); 12804 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 12805 FormatStyle::BS_Mozilla); 12806 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 12807 FormatStyle::BS_Stroustrup); 12808 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 12809 FormatStyle::BS_Allman); 12810 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 12811 FormatStyle::BS_Whitesmiths); 12812 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 12813 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 12814 FormatStyle::BS_WebKit); 12815 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 12816 FormatStyle::BS_Custom); 12817 12818 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 12819 CHECK_PARSE("BraceWrapping:\n" 12820 " AfterControlStatement: MultiLine", 12821 BraceWrapping.AfterControlStatement, 12822 FormatStyle::BWACS_MultiLine); 12823 CHECK_PARSE("BraceWrapping:\n" 12824 " AfterControlStatement: Always", 12825 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12826 CHECK_PARSE("BraceWrapping:\n" 12827 " AfterControlStatement: Never", 12828 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12829 // For backward compatibility: 12830 CHECK_PARSE("BraceWrapping:\n" 12831 " AfterControlStatement: true", 12832 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12833 CHECK_PARSE("BraceWrapping:\n" 12834 " AfterControlStatement: false", 12835 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12836 12837 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 12838 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 12839 FormatStyle::RTBS_None); 12840 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 12841 FormatStyle::RTBS_All); 12842 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 12843 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 12844 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 12845 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 12846 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 12847 AlwaysBreakAfterReturnType, 12848 FormatStyle::RTBS_TopLevelDefinitions); 12849 12850 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 12851 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 12852 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 12853 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 12854 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12855 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 12856 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12857 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 12858 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12859 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 12860 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12861 12862 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 12863 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 12864 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 12865 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 12866 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 12867 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 12868 AlwaysBreakAfterDefinitionReturnType, 12869 FormatStyle::DRTBS_TopLevel); 12870 12871 Style.NamespaceIndentation = FormatStyle::NI_All; 12872 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 12873 FormatStyle::NI_None); 12874 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 12875 FormatStyle::NI_Inner); 12876 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 12877 FormatStyle::NI_All); 12878 12879 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 12880 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 12881 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12882 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 12883 AllowShortIfStatementsOnASingleLine, 12884 FormatStyle::SIS_WithoutElse); 12885 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 12886 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 12887 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 12888 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12889 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 12890 AllowShortIfStatementsOnASingleLine, 12891 FormatStyle::SIS_WithoutElse); 12892 12893 // FIXME: This is required because parsing a configuration simply overwrites 12894 // the first N elements of the list instead of resetting it. 12895 Style.ForEachMacros.clear(); 12896 std::vector<std::string> BoostForeach; 12897 BoostForeach.push_back("BOOST_FOREACH"); 12898 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 12899 std::vector<std::string> BoostAndQForeach; 12900 BoostAndQForeach.push_back("BOOST_FOREACH"); 12901 BoostAndQForeach.push_back("Q_FOREACH"); 12902 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 12903 BoostAndQForeach); 12904 12905 Style.StatementMacros.clear(); 12906 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 12907 std::vector<std::string>{"QUNUSED"}); 12908 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 12909 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 12910 12911 Style.NamespaceMacros.clear(); 12912 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 12913 std::vector<std::string>{"TESTSUITE"}); 12914 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 12915 std::vector<std::string>({"TESTSUITE", "SUITE"})); 12916 12917 Style.IncludeStyle.IncludeCategories.clear(); 12918 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 12919 {"abc/.*", 2, 0}, {".*", 1, 0}}; 12920 CHECK_PARSE("IncludeCategories:\n" 12921 " - Regex: abc/.*\n" 12922 " Priority: 2\n" 12923 " - Regex: .*\n" 12924 " Priority: 1", 12925 IncludeStyle.IncludeCategories, ExpectedCategories); 12926 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 12927 "abc$"); 12928 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 12929 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 12930 12931 Style.RawStringFormats.clear(); 12932 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 12933 { 12934 FormatStyle::LK_TextProto, 12935 {"pb", "proto"}, 12936 {"PARSE_TEXT_PROTO"}, 12937 /*CanonicalDelimiter=*/"", 12938 "llvm", 12939 }, 12940 { 12941 FormatStyle::LK_Cpp, 12942 {"cc", "cpp"}, 12943 {"C_CODEBLOCK", "CPPEVAL"}, 12944 /*CanonicalDelimiter=*/"cc", 12945 /*BasedOnStyle=*/"", 12946 }, 12947 }; 12948 12949 CHECK_PARSE("RawStringFormats:\n" 12950 " - Language: TextProto\n" 12951 " Delimiters:\n" 12952 " - 'pb'\n" 12953 " - 'proto'\n" 12954 " EnclosingFunctions:\n" 12955 " - 'PARSE_TEXT_PROTO'\n" 12956 " BasedOnStyle: llvm\n" 12957 " - Language: Cpp\n" 12958 " Delimiters:\n" 12959 " - 'cc'\n" 12960 " - 'cpp'\n" 12961 " EnclosingFunctions:\n" 12962 " - 'C_CODEBLOCK'\n" 12963 " - 'CPPEVAL'\n" 12964 " CanonicalDelimiter: 'cc'", 12965 RawStringFormats, ExpectedRawStringFormats); 12966 } 12967 12968 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 12969 FormatStyle Style = {}; 12970 Style.Language = FormatStyle::LK_Cpp; 12971 CHECK_PARSE("Language: Cpp\n" 12972 "IndentWidth: 12", 12973 IndentWidth, 12u); 12974 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 12975 "IndentWidth: 34", 12976 &Style), 12977 ParseError::Unsuitable); 12978 EXPECT_EQ(12u, Style.IndentWidth); 12979 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12980 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12981 12982 Style.Language = FormatStyle::LK_JavaScript; 12983 CHECK_PARSE("Language: JavaScript\n" 12984 "IndentWidth: 12", 12985 IndentWidth, 12u); 12986 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 12987 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 12988 "IndentWidth: 34", 12989 &Style), 12990 ParseError::Unsuitable); 12991 EXPECT_EQ(23u, Style.IndentWidth); 12992 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12993 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12994 12995 CHECK_PARSE("BasedOnStyle: LLVM\n" 12996 "IndentWidth: 67", 12997 IndentWidth, 67u); 12998 12999 CHECK_PARSE("---\n" 13000 "Language: JavaScript\n" 13001 "IndentWidth: 12\n" 13002 "---\n" 13003 "Language: Cpp\n" 13004 "IndentWidth: 34\n" 13005 "...\n", 13006 IndentWidth, 12u); 13007 13008 Style.Language = FormatStyle::LK_Cpp; 13009 CHECK_PARSE("---\n" 13010 "Language: JavaScript\n" 13011 "IndentWidth: 12\n" 13012 "---\n" 13013 "Language: Cpp\n" 13014 "IndentWidth: 34\n" 13015 "...\n", 13016 IndentWidth, 34u); 13017 CHECK_PARSE("---\n" 13018 "IndentWidth: 78\n" 13019 "---\n" 13020 "Language: JavaScript\n" 13021 "IndentWidth: 56\n" 13022 "...\n", 13023 IndentWidth, 78u); 13024 13025 Style.ColumnLimit = 123; 13026 Style.IndentWidth = 234; 13027 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 13028 Style.TabWidth = 345; 13029 EXPECT_FALSE(parseConfiguration("---\n" 13030 "IndentWidth: 456\n" 13031 "BreakBeforeBraces: Allman\n" 13032 "---\n" 13033 "Language: JavaScript\n" 13034 "IndentWidth: 111\n" 13035 "TabWidth: 111\n" 13036 "---\n" 13037 "Language: Cpp\n" 13038 "BreakBeforeBraces: Stroustrup\n" 13039 "TabWidth: 789\n" 13040 "...\n", 13041 &Style)); 13042 EXPECT_EQ(123u, Style.ColumnLimit); 13043 EXPECT_EQ(456u, Style.IndentWidth); 13044 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 13045 EXPECT_EQ(789u, Style.TabWidth); 13046 13047 EXPECT_EQ(parseConfiguration("---\n" 13048 "Language: JavaScript\n" 13049 "IndentWidth: 56\n" 13050 "---\n" 13051 "IndentWidth: 78\n" 13052 "...\n", 13053 &Style), 13054 ParseError::Error); 13055 EXPECT_EQ(parseConfiguration("---\n" 13056 "Language: JavaScript\n" 13057 "IndentWidth: 56\n" 13058 "---\n" 13059 "Language: JavaScript\n" 13060 "IndentWidth: 78\n" 13061 "...\n", 13062 &Style), 13063 ParseError::Error); 13064 13065 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 13066 } 13067 13068 #undef CHECK_PARSE 13069 13070 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 13071 FormatStyle Style = {}; 13072 Style.Language = FormatStyle::LK_JavaScript; 13073 Style.BreakBeforeTernaryOperators = true; 13074 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 13075 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 13076 13077 Style.BreakBeforeTernaryOperators = true; 13078 EXPECT_EQ(0, parseConfiguration("---\n" 13079 "BasedOnStyle: Google\n" 13080 "---\n" 13081 "Language: JavaScript\n" 13082 "IndentWidth: 76\n" 13083 "...\n", 13084 &Style) 13085 .value()); 13086 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 13087 EXPECT_EQ(76u, Style.IndentWidth); 13088 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 13089 } 13090 13091 TEST_F(FormatTest, ConfigurationRoundTripTest) { 13092 FormatStyle Style = getLLVMStyle(); 13093 std::string YAML = configurationAsText(Style); 13094 FormatStyle ParsedStyle = {}; 13095 ParsedStyle.Language = FormatStyle::LK_Cpp; 13096 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 13097 EXPECT_EQ(Style, ParsedStyle); 13098 } 13099 13100 TEST_F(FormatTest, WorksFor8bitEncodings) { 13101 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 13102 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 13103 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 13104 "\"\xef\xee\xf0\xf3...\"", 13105 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 13106 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 13107 "\xef\xee\xf0\xf3...\"", 13108 getLLVMStyleWithColumns(12))); 13109 } 13110 13111 TEST_F(FormatTest, HandlesUTF8BOM) { 13112 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 13113 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 13114 format("\xef\xbb\xbf#include <iostream>")); 13115 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 13116 format("\xef\xbb\xbf\n#include <iostream>")); 13117 } 13118 13119 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 13120 #if !defined(_MSC_VER) 13121 13122 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 13123 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 13124 getLLVMStyleWithColumns(35)); 13125 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 13126 getLLVMStyleWithColumns(31)); 13127 verifyFormat("// Однажды в студёную зимнюю пору...", 13128 getLLVMStyleWithColumns(36)); 13129 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 13130 verifyFormat("/* Однажды в студёную зимнюю пору... */", 13131 getLLVMStyleWithColumns(39)); 13132 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 13133 getLLVMStyleWithColumns(35)); 13134 } 13135 13136 TEST_F(FormatTest, SplitsUTF8Strings) { 13137 // Non-printable characters' width is currently considered to be the length in 13138 // bytes in UTF8. The characters can be displayed in very different manner 13139 // (zero-width, single width with a substitution glyph, expanded to their code 13140 // (e.g. "<8d>"), so there's no single correct way to handle them. 13141 EXPECT_EQ("\"aaaaÄ\"\n" 13142 "\"\xc2\x8d\";", 13143 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13144 EXPECT_EQ("\"aaaaaaaÄ\"\n" 13145 "\"\xc2\x8d\";", 13146 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13147 EXPECT_EQ("\"Однажды, в \"\n" 13148 "\"студёную \"\n" 13149 "\"зимнюю \"\n" 13150 "\"пору,\"", 13151 format("\"Однажды, в студёную зимнюю пору,\"", 13152 getLLVMStyleWithColumns(13))); 13153 EXPECT_EQ( 13154 "\"一 二 三 \"\n" 13155 "\"四 五六 \"\n" 13156 "\"七 八 九 \"\n" 13157 "\"十\"", 13158 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 13159 EXPECT_EQ("\"一\t\"\n" 13160 "\"二 \t\"\n" 13161 "\"三 四 \"\n" 13162 "\"五\t\"\n" 13163 "\"六 \t\"\n" 13164 "\"七 \"\n" 13165 "\"八九十\tqq\"", 13166 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 13167 getLLVMStyleWithColumns(11))); 13168 13169 // UTF8 character in an escape sequence. 13170 EXPECT_EQ("\"aaaaaa\"\n" 13171 "\"\\\xC2\x8D\"", 13172 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 13173 } 13174 13175 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 13176 EXPECT_EQ("const char *sssss =\n" 13177 " \"一二三四五六七八\\\n" 13178 " 九 十\";", 13179 format("const char *sssss = \"一二三四五六七八\\\n" 13180 " 九 十\";", 13181 getLLVMStyleWithColumns(30))); 13182 } 13183 13184 TEST_F(FormatTest, SplitsUTF8LineComments) { 13185 EXPECT_EQ("// aaaaÄ\xc2\x8d", 13186 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 13187 EXPECT_EQ("// Я из лесу\n" 13188 "// вышел; был\n" 13189 "// сильный\n" 13190 "// мороз.", 13191 format("// Я из лесу вышел; был сильный мороз.", 13192 getLLVMStyleWithColumns(13))); 13193 EXPECT_EQ("// 一二三\n" 13194 "// 四五六七\n" 13195 "// 八 九\n" 13196 "// 十", 13197 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 13198 } 13199 13200 TEST_F(FormatTest, SplitsUTF8BlockComments) { 13201 EXPECT_EQ("/* Гляжу,\n" 13202 " * поднимается\n" 13203 " * медленно в\n" 13204 " * гору\n" 13205 " * Лошадка,\n" 13206 " * везущая\n" 13207 " * хворосту\n" 13208 " * воз. */", 13209 format("/* Гляжу, поднимается медленно в гору\n" 13210 " * Лошадка, везущая хворосту воз. */", 13211 getLLVMStyleWithColumns(13))); 13212 EXPECT_EQ( 13213 "/* 一二三\n" 13214 " * 四五六七\n" 13215 " * 八 九\n" 13216 " * 十 */", 13217 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 13218 EXPECT_EQ("/* \n" 13219 " * \n" 13220 " * - */", 13221 format("/* - */", getLLVMStyleWithColumns(12))); 13222 } 13223 13224 #endif // _MSC_VER 13225 13226 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 13227 FormatStyle Style = getLLVMStyle(); 13228 13229 Style.ConstructorInitializerIndentWidth = 4; 13230 verifyFormat( 13231 "SomeClass::Constructor()\n" 13232 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13233 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13234 Style); 13235 13236 Style.ConstructorInitializerIndentWidth = 2; 13237 verifyFormat( 13238 "SomeClass::Constructor()\n" 13239 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13240 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13241 Style); 13242 13243 Style.ConstructorInitializerIndentWidth = 0; 13244 verifyFormat( 13245 "SomeClass::Constructor()\n" 13246 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13247 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13248 Style); 13249 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13250 verifyFormat( 13251 "SomeLongTemplateVariableName<\n" 13252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 13253 Style); 13254 verifyFormat("bool smaller = 1 < " 13255 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 13256 " " 13257 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 13258 Style); 13259 13260 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 13261 verifyFormat("SomeClass::Constructor() :\n" 13262 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 13263 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 13264 Style); 13265 } 13266 13267 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 13268 FormatStyle Style = getLLVMStyle(); 13269 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 13270 Style.ConstructorInitializerIndentWidth = 4; 13271 verifyFormat("SomeClass::Constructor()\n" 13272 " : a(a)\n" 13273 " , b(b)\n" 13274 " , c(c) {}", 13275 Style); 13276 verifyFormat("SomeClass::Constructor()\n" 13277 " : a(a) {}", 13278 Style); 13279 13280 Style.ColumnLimit = 0; 13281 verifyFormat("SomeClass::Constructor()\n" 13282 " : a(a) {}", 13283 Style); 13284 verifyFormat("SomeClass::Constructor() noexcept\n" 13285 " : a(a) {}", 13286 Style); 13287 verifyFormat("SomeClass::Constructor()\n" 13288 " : a(a)\n" 13289 " , b(b)\n" 13290 " , c(c) {}", 13291 Style); 13292 verifyFormat("SomeClass::Constructor()\n" 13293 " : a(a) {\n" 13294 " foo();\n" 13295 " bar();\n" 13296 "}", 13297 Style); 13298 13299 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 13300 verifyFormat("SomeClass::Constructor()\n" 13301 " : a(a)\n" 13302 " , b(b)\n" 13303 " , c(c) {\n}", 13304 Style); 13305 verifyFormat("SomeClass::Constructor()\n" 13306 " : a(a) {\n}", 13307 Style); 13308 13309 Style.ColumnLimit = 80; 13310 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 13311 Style.ConstructorInitializerIndentWidth = 2; 13312 verifyFormat("SomeClass::Constructor()\n" 13313 " : a(a)\n" 13314 " , b(b)\n" 13315 " , c(c) {}", 13316 Style); 13317 13318 Style.ConstructorInitializerIndentWidth = 0; 13319 verifyFormat("SomeClass::Constructor()\n" 13320 ": a(a)\n" 13321 ", b(b)\n" 13322 ", c(c) {}", 13323 Style); 13324 13325 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 13326 Style.ConstructorInitializerIndentWidth = 4; 13327 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 13328 verifyFormat( 13329 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 13330 Style); 13331 verifyFormat( 13332 "SomeClass::Constructor()\n" 13333 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 13334 Style); 13335 Style.ConstructorInitializerIndentWidth = 4; 13336 Style.ColumnLimit = 60; 13337 verifyFormat("SomeClass::Constructor()\n" 13338 " : aaaaaaaa(aaaaaaaa)\n" 13339 " , aaaaaaaa(aaaaaaaa)\n" 13340 " , aaaaaaaa(aaaaaaaa) {}", 13341 Style); 13342 } 13343 13344 TEST_F(FormatTest, Destructors) { 13345 verifyFormat("void F(int &i) { i.~int(); }"); 13346 verifyFormat("void F(int &i) { i->~int(); }"); 13347 } 13348 13349 TEST_F(FormatTest, FormatsWithWebKitStyle) { 13350 FormatStyle Style = getWebKitStyle(); 13351 13352 // Don't indent in outer namespaces. 13353 verifyFormat("namespace outer {\n" 13354 "int i;\n" 13355 "namespace inner {\n" 13356 " int i;\n" 13357 "} // namespace inner\n" 13358 "} // namespace outer\n" 13359 "namespace other_outer {\n" 13360 "int i;\n" 13361 "}", 13362 Style); 13363 13364 // Don't indent case labels. 13365 verifyFormat("switch (variable) {\n" 13366 "case 1:\n" 13367 "case 2:\n" 13368 " doSomething();\n" 13369 " break;\n" 13370 "default:\n" 13371 " ++variable;\n" 13372 "}", 13373 Style); 13374 13375 // Wrap before binary operators. 13376 EXPECT_EQ("void f()\n" 13377 "{\n" 13378 " if (aaaaaaaaaaaaaaaa\n" 13379 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 13380 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13381 " return;\n" 13382 "}", 13383 format("void f() {\n" 13384 "if (aaaaaaaaaaaaaaaa\n" 13385 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 13386 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13387 "return;\n" 13388 "}", 13389 Style)); 13390 13391 // Allow functions on a single line. 13392 verifyFormat("void f() { return; }", Style); 13393 13394 // Allow empty blocks on a single line and insert a space in empty blocks. 13395 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 13396 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 13397 // However, don't merge non-empty short loops. 13398 EXPECT_EQ("while (true) {\n" 13399 " continue;\n" 13400 "}", 13401 format("while (true) { continue; }", Style)); 13402 13403 // Constructor initializers are formatted one per line with the "," on the 13404 // new line. 13405 verifyFormat("Constructor()\n" 13406 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 13407 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 13408 " aaaaaaaaaaaaaa)\n" 13409 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 13410 "{\n" 13411 "}", 13412 Style); 13413 verifyFormat("SomeClass::Constructor()\n" 13414 " : a(a)\n" 13415 "{\n" 13416 "}", 13417 Style); 13418 EXPECT_EQ("SomeClass::Constructor()\n" 13419 " : a(a)\n" 13420 "{\n" 13421 "}", 13422 format("SomeClass::Constructor():a(a){}", Style)); 13423 verifyFormat("SomeClass::Constructor()\n" 13424 " : a(a)\n" 13425 " , b(b)\n" 13426 " , c(c)\n" 13427 "{\n" 13428 "}", 13429 Style); 13430 verifyFormat("SomeClass::Constructor()\n" 13431 " : a(a)\n" 13432 "{\n" 13433 " foo();\n" 13434 " bar();\n" 13435 "}", 13436 Style); 13437 13438 // Access specifiers should be aligned left. 13439 verifyFormat("class C {\n" 13440 "public:\n" 13441 " int i;\n" 13442 "};", 13443 Style); 13444 13445 // Do not align comments. 13446 verifyFormat("int a; // Do not\n" 13447 "double b; // align comments.", 13448 Style); 13449 13450 // Do not align operands. 13451 EXPECT_EQ("ASSERT(aaaa\n" 13452 " || bbbb);", 13453 format("ASSERT ( aaaa\n||bbbb);", Style)); 13454 13455 // Accept input's line breaks. 13456 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 13457 " || bbbbbbbbbbbbbbb) {\n" 13458 " i++;\n" 13459 "}", 13460 format("if (aaaaaaaaaaaaaaa\n" 13461 "|| bbbbbbbbbbbbbbb) { i++; }", 13462 Style)); 13463 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 13464 " i++;\n" 13465 "}", 13466 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 13467 13468 // Don't automatically break all macro definitions (llvm.org/PR17842). 13469 verifyFormat("#define aNumber 10", Style); 13470 // However, generally keep the line breaks that the user authored. 13471 EXPECT_EQ("#define aNumber \\\n" 13472 " 10", 13473 format("#define aNumber \\\n" 13474 " 10", 13475 Style)); 13476 13477 // Keep empty and one-element array literals on a single line. 13478 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 13479 " copyItems:YES];", 13480 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 13481 "copyItems:YES];", 13482 Style)); 13483 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 13484 " copyItems:YES];", 13485 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 13486 " copyItems:YES];", 13487 Style)); 13488 // FIXME: This does not seem right, there should be more indentation before 13489 // the array literal's entries. Nested blocks have the same problem. 13490 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13491 " @\"a\",\n" 13492 " @\"a\"\n" 13493 "]\n" 13494 " copyItems:YES];", 13495 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13496 " @\"a\",\n" 13497 " @\"a\"\n" 13498 " ]\n" 13499 " copyItems:YES];", 13500 Style)); 13501 EXPECT_EQ( 13502 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13503 " copyItems:YES];", 13504 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13505 " copyItems:YES];", 13506 Style)); 13507 13508 verifyFormat("[self.a b:c c:d];", Style); 13509 EXPECT_EQ("[self.a b:c\n" 13510 " c:d];", 13511 format("[self.a b:c\n" 13512 "c:d];", 13513 Style)); 13514 } 13515 13516 TEST_F(FormatTest, FormatsLambdas) { 13517 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 13518 verifyFormat( 13519 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 13520 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 13521 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 13522 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 13523 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 13524 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 13525 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 13526 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 13527 verifyFormat("int x = f(*+[] {});"); 13528 verifyFormat("void f() {\n" 13529 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 13530 "}\n"); 13531 verifyFormat("void f() {\n" 13532 " other(x.begin(), //\n" 13533 " x.end(), //\n" 13534 " [&](int, int) { return 1; });\n" 13535 "}\n"); 13536 verifyFormat("void f() {\n" 13537 " other.other.other.other.other(\n" 13538 " x.begin(), x.end(),\n" 13539 " [something, rather](int, int, int, int, int, int, int) { " 13540 "return 1; });\n" 13541 "}\n"); 13542 verifyFormat( 13543 "void f() {\n" 13544 " other.other.other.other.other(\n" 13545 " x.begin(), x.end(),\n" 13546 " [something, rather](int, int, int, int, int, int, int) {\n" 13547 " //\n" 13548 " });\n" 13549 "}\n"); 13550 verifyFormat("SomeFunction([]() { // A cool function...\n" 13551 " return 43;\n" 13552 "});"); 13553 EXPECT_EQ("SomeFunction([]() {\n" 13554 "#define A a\n" 13555 " return 43;\n" 13556 "});", 13557 format("SomeFunction([](){\n" 13558 "#define A a\n" 13559 "return 43;\n" 13560 "});")); 13561 verifyFormat("void f() {\n" 13562 " SomeFunction([](decltype(x), A *a) {});\n" 13563 "}"); 13564 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13565 " [](const aaaaaaaaaa &a) { return a; });"); 13566 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 13567 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 13568 "});"); 13569 verifyFormat("Constructor()\n" 13570 " : Field([] { // comment\n" 13571 " int i;\n" 13572 " }) {}"); 13573 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 13574 " return some_parameter.size();\n" 13575 "};"); 13576 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 13577 " [](const string &s) { return s; };"); 13578 verifyFormat("int i = aaaaaa ? 1 //\n" 13579 " : [] {\n" 13580 " return 2; //\n" 13581 " }();"); 13582 verifyFormat("llvm::errs() << \"number of twos is \"\n" 13583 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 13584 " return x == 2; // force break\n" 13585 " });"); 13586 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13587 " [=](int iiiiiiiiiiii) {\n" 13588 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 13589 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 13590 " });", 13591 getLLVMStyleWithColumns(60)); 13592 verifyFormat("SomeFunction({[&] {\n" 13593 " // comment\n" 13594 " },\n" 13595 " [&] {\n" 13596 " // comment\n" 13597 " }});"); 13598 verifyFormat("SomeFunction({[&] {\n" 13599 " // comment\n" 13600 "}});"); 13601 verifyFormat( 13602 "virtual aaaaaaaaaaaaaaaa(\n" 13603 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 13604 " aaaaa aaaaaaaaa);"); 13605 13606 // Lambdas with return types. 13607 verifyFormat("int c = []() -> int { return 2; }();\n"); 13608 verifyFormat("int c = []() -> int * { return 2; }();\n"); 13609 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 13610 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 13611 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 13612 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 13613 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 13614 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 13615 verifyFormat("[a, a]() -> a<1> {};"); 13616 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 13617 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 13618 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 13619 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 13620 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 13621 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 13622 verifyFormat("[]() -> foo<!5> { return {}; };"); 13623 verifyFormat("[]() -> foo<~5> { return {}; };"); 13624 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 13625 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 13626 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 13627 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 13628 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 13629 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 13630 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 13631 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 13632 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 13633 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 13634 verifyFormat("namespace bar {\n" 13635 "// broken:\n" 13636 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 13637 "} // namespace bar"); 13638 verifyFormat("namespace bar {\n" 13639 "// broken:\n" 13640 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 13641 "} // namespace bar"); 13642 verifyFormat("namespace bar {\n" 13643 "// broken:\n" 13644 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 13645 "} // namespace bar"); 13646 verifyFormat("namespace bar {\n" 13647 "// broken:\n" 13648 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 13649 "} // namespace bar"); 13650 verifyFormat("namespace bar {\n" 13651 "// broken:\n" 13652 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 13653 "} // namespace bar"); 13654 verifyFormat("namespace bar {\n" 13655 "// broken:\n" 13656 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 13657 "} // namespace bar"); 13658 verifyFormat("namespace bar {\n" 13659 "// broken:\n" 13660 "auto foo{[]() -> foo<!5> { return {}; }};\n" 13661 "} // namespace bar"); 13662 verifyFormat("namespace bar {\n" 13663 "// broken:\n" 13664 "auto foo{[]() -> foo<~5> { return {}; }};\n" 13665 "} // namespace bar"); 13666 verifyFormat("namespace bar {\n" 13667 "// broken:\n" 13668 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 13669 "} // namespace bar"); 13670 verifyFormat("namespace bar {\n" 13671 "// broken:\n" 13672 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 13673 "} // namespace bar"); 13674 verifyFormat("namespace bar {\n" 13675 "// broken:\n" 13676 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 13677 "} // namespace bar"); 13678 verifyFormat("namespace bar {\n" 13679 "// broken:\n" 13680 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 13681 "} // namespace bar"); 13682 verifyFormat("namespace bar {\n" 13683 "// broken:\n" 13684 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 13685 "} // namespace bar"); 13686 verifyFormat("namespace bar {\n" 13687 "// broken:\n" 13688 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 13689 "} // namespace bar"); 13690 verifyFormat("namespace bar {\n" 13691 "// broken:\n" 13692 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 13693 "} // namespace bar"); 13694 verifyFormat("namespace bar {\n" 13695 "// broken:\n" 13696 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 13697 "} // namespace bar"); 13698 verifyFormat("namespace bar {\n" 13699 "// broken:\n" 13700 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 13701 "} // namespace bar"); 13702 verifyFormat("namespace bar {\n" 13703 "// broken:\n" 13704 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 13705 "} // namespace bar"); 13706 verifyFormat("[]() -> a<1> {};"); 13707 verifyFormat("[]() -> a<1> { ; };"); 13708 verifyFormat("[]() -> a<1> { ; }();"); 13709 verifyFormat("[a, a]() -> a<true> {};"); 13710 verifyFormat("[]() -> a<true> {};"); 13711 verifyFormat("[]() -> a<true> { ; };"); 13712 verifyFormat("[]() -> a<true> { ; }();"); 13713 verifyFormat("[a, a]() -> a<false> {};"); 13714 verifyFormat("[]() -> a<false> {};"); 13715 verifyFormat("[]() -> a<false> { ; };"); 13716 verifyFormat("[]() -> a<false> { ; }();"); 13717 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 13718 verifyFormat("namespace bar {\n" 13719 "auto foo{[]() -> foo<false> { ; }};\n" 13720 "} // namespace bar"); 13721 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 13722 " int j) -> int {\n" 13723 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 13724 "};"); 13725 verifyFormat( 13726 "aaaaaaaaaaaaaaaaaaaaaa(\n" 13727 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 13728 " return aaaaaaaaaaaaaaaaa;\n" 13729 " });", 13730 getLLVMStyleWithColumns(70)); 13731 verifyFormat("[]() //\n" 13732 " -> int {\n" 13733 " return 1; //\n" 13734 "};"); 13735 13736 // Lambdas with explicit template argument lists. 13737 verifyFormat( 13738 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 13739 13740 // Multiple lambdas in the same parentheses change indentation rules. These 13741 // lambdas are forced to start on new lines. 13742 verifyFormat("SomeFunction(\n" 13743 " []() {\n" 13744 " //\n" 13745 " },\n" 13746 " []() {\n" 13747 " //\n" 13748 " });"); 13749 13750 // A lambda passed as arg0 is always pushed to the next line. 13751 verifyFormat("SomeFunction(\n" 13752 " [this] {\n" 13753 " //\n" 13754 " },\n" 13755 " 1);\n"); 13756 13757 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 13758 // the arg0 case above. 13759 auto Style = getGoogleStyle(); 13760 Style.BinPackArguments = false; 13761 verifyFormat("SomeFunction(\n" 13762 " a,\n" 13763 " [this] {\n" 13764 " //\n" 13765 " },\n" 13766 " b);\n", 13767 Style); 13768 verifyFormat("SomeFunction(\n" 13769 " a,\n" 13770 " [this] {\n" 13771 " //\n" 13772 " },\n" 13773 " b);\n"); 13774 13775 // A lambda with a very long line forces arg0 to be pushed out irrespective of 13776 // the BinPackArguments value (as long as the code is wide enough). 13777 verifyFormat( 13778 "something->SomeFunction(\n" 13779 " a,\n" 13780 " [this] {\n" 13781 " " 13782 "D0000000000000000000000000000000000000000000000000000000000001();\n" 13783 " },\n" 13784 " b);\n"); 13785 13786 // A multi-line lambda is pulled up as long as the introducer fits on the 13787 // previous line and there are no further args. 13788 verifyFormat("function(1, [this, that] {\n" 13789 " //\n" 13790 "});\n"); 13791 verifyFormat("function([this, that] {\n" 13792 " //\n" 13793 "});\n"); 13794 // FIXME: this format is not ideal and we should consider forcing the first 13795 // arg onto its own line. 13796 verifyFormat("function(a, b, c, //\n" 13797 " d, [this, that] {\n" 13798 " //\n" 13799 " });\n"); 13800 13801 // Multiple lambdas are treated correctly even when there is a short arg0. 13802 verifyFormat("SomeFunction(\n" 13803 " 1,\n" 13804 " [this] {\n" 13805 " //\n" 13806 " },\n" 13807 " [this] {\n" 13808 " //\n" 13809 " },\n" 13810 " 1);\n"); 13811 13812 // More complex introducers. 13813 verifyFormat("return [i, args...] {};"); 13814 13815 // Not lambdas. 13816 verifyFormat("constexpr char hello[]{\"hello\"};"); 13817 verifyFormat("double &operator[](int i) { return 0; }\n" 13818 "int i;"); 13819 verifyFormat("std::unique_ptr<int[]> foo() {}"); 13820 verifyFormat("int i = a[a][a]->f();"); 13821 verifyFormat("int i = (*b)[a]->f();"); 13822 13823 // Other corner cases. 13824 verifyFormat("void f() {\n" 13825 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 13826 " );\n" 13827 "}"); 13828 13829 // Lambdas created through weird macros. 13830 verifyFormat("void f() {\n" 13831 " MACRO((const AA &a) { return 1; });\n" 13832 " MACRO((AA &a) { return 1; });\n" 13833 "}"); 13834 13835 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 13836 " doo_dah();\n" 13837 " doo_dah();\n" 13838 " })) {\n" 13839 "}"); 13840 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 13841 " doo_dah();\n" 13842 " doo_dah();\n" 13843 " })) {\n" 13844 "}"); 13845 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 13846 " doo_dah();\n" 13847 " doo_dah();\n" 13848 " })) {\n" 13849 "}"); 13850 verifyFormat("auto lambda = []() {\n" 13851 " int a = 2\n" 13852 "#if A\n" 13853 " + 2\n" 13854 "#endif\n" 13855 " ;\n" 13856 "};"); 13857 13858 // Lambdas with complex multiline introducers. 13859 verifyFormat( 13860 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13861 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 13862 " -> ::std::unordered_set<\n" 13863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 13864 " //\n" 13865 " });"); 13866 13867 FormatStyle DoNotMerge = getLLVMStyle(); 13868 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13869 verifyFormat("auto c = []() {\n" 13870 " return b;\n" 13871 "};", 13872 "auto c = []() { return b; };", DoNotMerge); 13873 verifyFormat("auto c = []() {\n" 13874 "};", 13875 " auto c = []() {};", DoNotMerge); 13876 13877 FormatStyle MergeEmptyOnly = getLLVMStyle(); 13878 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 13879 verifyFormat("auto c = []() {\n" 13880 " return b;\n" 13881 "};", 13882 "auto c = []() {\n" 13883 " return b;\n" 13884 " };", 13885 MergeEmptyOnly); 13886 verifyFormat("auto c = []() {};", 13887 "auto c = []() {\n" 13888 "};", 13889 MergeEmptyOnly); 13890 13891 FormatStyle MergeInline = getLLVMStyle(); 13892 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 13893 verifyFormat("auto c = []() {\n" 13894 " return b;\n" 13895 "};", 13896 "auto c = []() { return b; };", MergeInline); 13897 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 13898 MergeInline); 13899 verifyFormat("function([]() { return b; }, a)", 13900 "function([]() { return b; }, a)", MergeInline); 13901 verifyFormat("function(a, []() { return b; })", 13902 "function(a, []() { return b; })", MergeInline); 13903 } 13904 13905 TEST_F(FormatTest, EmptyLinesInLambdas) { 13906 verifyFormat("auto lambda = []() {\n" 13907 " x(); //\n" 13908 "};", 13909 "auto lambda = []() {\n" 13910 "\n" 13911 " x(); //\n" 13912 "\n" 13913 "};"); 13914 } 13915 13916 TEST_F(FormatTest, FormatsBlocks) { 13917 FormatStyle ShortBlocks = getLLVMStyle(); 13918 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13919 verifyFormat("int (^Block)(int, int);", ShortBlocks); 13920 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 13921 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 13922 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 13923 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 13924 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 13925 13926 verifyFormat("foo(^{ bar(); });", ShortBlocks); 13927 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 13928 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 13929 13930 verifyFormat("[operation setCompletionBlock:^{\n" 13931 " [self onOperationDone];\n" 13932 "}];"); 13933 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 13934 " [self onOperationDone];\n" 13935 "}]};"); 13936 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 13937 " f();\n" 13938 "}];"); 13939 verifyFormat("int a = [operation block:^int(int *i) {\n" 13940 " return 1;\n" 13941 "}];"); 13942 verifyFormat("[myObject doSomethingWith:arg1\n" 13943 " aaa:^int(int *a) {\n" 13944 " return 1;\n" 13945 " }\n" 13946 " bbb:f(a * bbbbbbbb)];"); 13947 13948 verifyFormat("[operation setCompletionBlock:^{\n" 13949 " [self.delegate newDataAvailable];\n" 13950 "}];", 13951 getLLVMStyleWithColumns(60)); 13952 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 13953 " NSString *path = [self sessionFilePath];\n" 13954 " if (path) {\n" 13955 " // ...\n" 13956 " }\n" 13957 "});"); 13958 verifyFormat("[[SessionService sharedService]\n" 13959 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13960 " if (window) {\n" 13961 " [self windowDidLoad:window];\n" 13962 " } else {\n" 13963 " [self errorLoadingWindow];\n" 13964 " }\n" 13965 " }];"); 13966 verifyFormat("void (^largeBlock)(void) = ^{\n" 13967 " // ...\n" 13968 "};\n", 13969 getLLVMStyleWithColumns(40)); 13970 verifyFormat("[[SessionService sharedService]\n" 13971 " loadWindowWithCompletionBlock: //\n" 13972 " ^(SessionWindow *window) {\n" 13973 " if (window) {\n" 13974 " [self windowDidLoad:window];\n" 13975 " } else {\n" 13976 " [self errorLoadingWindow];\n" 13977 " }\n" 13978 " }];", 13979 getLLVMStyleWithColumns(60)); 13980 verifyFormat("[myObject doSomethingWith:arg1\n" 13981 " firstBlock:^(Foo *a) {\n" 13982 " // ...\n" 13983 " int i;\n" 13984 " }\n" 13985 " secondBlock:^(Bar *b) {\n" 13986 " // ...\n" 13987 " int i;\n" 13988 " }\n" 13989 " thirdBlock:^Foo(Bar *b) {\n" 13990 " // ...\n" 13991 " int i;\n" 13992 " }];"); 13993 verifyFormat("[myObject doSomethingWith:arg1\n" 13994 " firstBlock:-1\n" 13995 " secondBlock:^(Bar *b) {\n" 13996 " // ...\n" 13997 " int i;\n" 13998 " }];"); 13999 14000 verifyFormat("f(^{\n" 14001 " @autoreleasepool {\n" 14002 " if (a) {\n" 14003 " g();\n" 14004 " }\n" 14005 " }\n" 14006 "});"); 14007 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 14008 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 14009 "};"); 14010 14011 FormatStyle FourIndent = getLLVMStyle(); 14012 FourIndent.ObjCBlockIndentWidth = 4; 14013 verifyFormat("[operation setCompletionBlock:^{\n" 14014 " [self onOperationDone];\n" 14015 "}];", 14016 FourIndent); 14017 } 14018 14019 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 14020 FormatStyle ZeroColumn = getLLVMStyle(); 14021 ZeroColumn.ColumnLimit = 0; 14022 14023 verifyFormat("[[SessionService sharedService] " 14024 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14025 " if (window) {\n" 14026 " [self windowDidLoad:window];\n" 14027 " } else {\n" 14028 " [self errorLoadingWindow];\n" 14029 " }\n" 14030 "}];", 14031 ZeroColumn); 14032 EXPECT_EQ("[[SessionService sharedService]\n" 14033 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14034 " if (window) {\n" 14035 " [self windowDidLoad:window];\n" 14036 " } else {\n" 14037 " [self errorLoadingWindow];\n" 14038 " }\n" 14039 " }];", 14040 format("[[SessionService sharedService]\n" 14041 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14042 " if (window) {\n" 14043 " [self windowDidLoad:window];\n" 14044 " } else {\n" 14045 " [self errorLoadingWindow];\n" 14046 " }\n" 14047 "}];", 14048 ZeroColumn)); 14049 verifyFormat("[myObject doSomethingWith:arg1\n" 14050 " firstBlock:^(Foo *a) {\n" 14051 " // ...\n" 14052 " int i;\n" 14053 " }\n" 14054 " secondBlock:^(Bar *b) {\n" 14055 " // ...\n" 14056 " int i;\n" 14057 " }\n" 14058 " thirdBlock:^Foo(Bar *b) {\n" 14059 " // ...\n" 14060 " int i;\n" 14061 " }];", 14062 ZeroColumn); 14063 verifyFormat("f(^{\n" 14064 " @autoreleasepool {\n" 14065 " if (a) {\n" 14066 " g();\n" 14067 " }\n" 14068 " }\n" 14069 "});", 14070 ZeroColumn); 14071 verifyFormat("void (^largeBlock)(void) = ^{\n" 14072 " // ...\n" 14073 "};", 14074 ZeroColumn); 14075 14076 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 14077 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 14078 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 14079 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 14080 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 14081 " int i;\n" 14082 "};", 14083 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 14084 } 14085 14086 TEST_F(FormatTest, SupportsCRLF) { 14087 EXPECT_EQ("int a;\r\n" 14088 "int b;\r\n" 14089 "int c;\r\n", 14090 format("int a;\r\n" 14091 " int b;\r\n" 14092 " int c;\r\n", 14093 getLLVMStyle())); 14094 EXPECT_EQ("int a;\r\n" 14095 "int b;\r\n" 14096 "int c;\r\n", 14097 format("int a;\r\n" 14098 " int b;\n" 14099 " int c;\r\n", 14100 getLLVMStyle())); 14101 EXPECT_EQ("int a;\n" 14102 "int b;\n" 14103 "int c;\n", 14104 format("int a;\r\n" 14105 " int b;\n" 14106 " int c;\n", 14107 getLLVMStyle())); 14108 EXPECT_EQ("\"aaaaaaa \"\r\n" 14109 "\"bbbbbbb\";\r\n", 14110 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 14111 EXPECT_EQ("#define A \\\r\n" 14112 " b; \\\r\n" 14113 " c; \\\r\n" 14114 " d;\r\n", 14115 format("#define A \\\r\n" 14116 " b; \\\r\n" 14117 " c; d; \r\n", 14118 getGoogleStyle())); 14119 14120 EXPECT_EQ("/*\r\n" 14121 "multi line block comments\r\n" 14122 "should not introduce\r\n" 14123 "an extra carriage return\r\n" 14124 "*/\r\n", 14125 format("/*\r\n" 14126 "multi line block comments\r\n" 14127 "should not introduce\r\n" 14128 "an extra carriage return\r\n" 14129 "*/\r\n")); 14130 EXPECT_EQ("/*\r\n" 14131 "\r\n" 14132 "*/", 14133 format("/*\r\n" 14134 " \r\r\r\n" 14135 "*/")); 14136 14137 FormatStyle style = getLLVMStyle(); 14138 14139 style.DeriveLineEnding = true; 14140 style.UseCRLF = false; 14141 EXPECT_EQ("union FooBarBazQux {\n" 14142 " int foo;\n" 14143 " int bar;\n" 14144 " int baz;\n" 14145 "};", 14146 format("union FooBarBazQux {\r\n" 14147 " int foo;\n" 14148 " int bar;\r\n" 14149 " int baz;\n" 14150 "};", 14151 style)); 14152 style.UseCRLF = true; 14153 EXPECT_EQ("union FooBarBazQux {\r\n" 14154 " int foo;\r\n" 14155 " int bar;\r\n" 14156 " int baz;\r\n" 14157 "};", 14158 format("union FooBarBazQux {\r\n" 14159 " int foo;\n" 14160 " int bar;\r\n" 14161 " int baz;\n" 14162 "};", 14163 style)); 14164 14165 style.DeriveLineEnding = false; 14166 style.UseCRLF = false; 14167 EXPECT_EQ("union FooBarBazQux {\n" 14168 " int foo;\n" 14169 " int bar;\n" 14170 " int baz;\n" 14171 " int qux;\n" 14172 "};", 14173 format("union FooBarBazQux {\r\n" 14174 " int foo;\n" 14175 " int bar;\r\n" 14176 " int baz;\n" 14177 " int qux;\r\n" 14178 "};", 14179 style)); 14180 style.UseCRLF = true; 14181 EXPECT_EQ("union FooBarBazQux {\r\n" 14182 " int foo;\r\n" 14183 " int bar;\r\n" 14184 " int baz;\r\n" 14185 " int qux;\r\n" 14186 "};", 14187 format("union FooBarBazQux {\r\n" 14188 " int foo;\n" 14189 " int bar;\r\n" 14190 " int baz;\n" 14191 " int qux;\n" 14192 "};", 14193 style)); 14194 14195 style.DeriveLineEnding = true; 14196 style.UseCRLF = false; 14197 EXPECT_EQ("union FooBarBazQux {\r\n" 14198 " int foo;\r\n" 14199 " int bar;\r\n" 14200 " int baz;\r\n" 14201 " int qux;\r\n" 14202 "};", 14203 format("union FooBarBazQux {\r\n" 14204 " int foo;\n" 14205 " int bar;\r\n" 14206 " int baz;\n" 14207 " int qux;\r\n" 14208 "};", 14209 style)); 14210 style.UseCRLF = true; 14211 EXPECT_EQ("union FooBarBazQux {\n" 14212 " int foo;\n" 14213 " int bar;\n" 14214 " int baz;\n" 14215 " int qux;\n" 14216 "};", 14217 format("union FooBarBazQux {\r\n" 14218 " int foo;\n" 14219 " int bar;\r\n" 14220 " int baz;\n" 14221 " int qux;\n" 14222 "};", 14223 style)); 14224 } 14225 14226 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 14227 verifyFormat("MY_CLASS(C) {\n" 14228 " int i;\n" 14229 " int j;\n" 14230 "};"); 14231 } 14232 14233 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 14234 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 14235 TwoIndent.ContinuationIndentWidth = 2; 14236 14237 EXPECT_EQ("int i =\n" 14238 " longFunction(\n" 14239 " arg);", 14240 format("int i = longFunction(arg);", TwoIndent)); 14241 14242 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 14243 SixIndent.ContinuationIndentWidth = 6; 14244 14245 EXPECT_EQ("int i =\n" 14246 " longFunction(\n" 14247 " arg);", 14248 format("int i = longFunction(arg);", SixIndent)); 14249 } 14250 14251 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 14252 FormatStyle Style = getLLVMStyle(); 14253 verifyFormat("int Foo::getter(\n" 14254 " //\n" 14255 ") const {\n" 14256 " return foo;\n" 14257 "}", 14258 Style); 14259 verifyFormat("void Foo::setter(\n" 14260 " //\n" 14261 ") {\n" 14262 " foo = 1;\n" 14263 "}", 14264 Style); 14265 } 14266 14267 TEST_F(FormatTest, SpacesInAngles) { 14268 FormatStyle Spaces = getLLVMStyle(); 14269 Spaces.SpacesInAngles = true; 14270 14271 verifyFormat("static_cast< int >(arg);", Spaces); 14272 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 14273 verifyFormat("f< int, float >();", Spaces); 14274 verifyFormat("template <> g() {}", Spaces); 14275 verifyFormat("template < std::vector< int > > f() {}", Spaces); 14276 verifyFormat("std::function< void(int, int) > fct;", Spaces); 14277 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 14278 Spaces); 14279 14280 Spaces.Standard = FormatStyle::LS_Cpp03; 14281 Spaces.SpacesInAngles = true; 14282 verifyFormat("A< A< int > >();", Spaces); 14283 14284 Spaces.SpacesInAngles = false; 14285 verifyFormat("A<A<int> >();", Spaces); 14286 14287 Spaces.Standard = FormatStyle::LS_Cpp11; 14288 Spaces.SpacesInAngles = true; 14289 verifyFormat("A< A< int > >();", Spaces); 14290 14291 Spaces.SpacesInAngles = false; 14292 verifyFormat("A<A<int>>();", Spaces); 14293 } 14294 14295 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 14296 FormatStyle Style = getLLVMStyle(); 14297 Style.SpaceAfterTemplateKeyword = false; 14298 verifyFormat("template<int> void foo();", Style); 14299 } 14300 14301 TEST_F(FormatTest, TripleAngleBrackets) { 14302 verifyFormat("f<<<1, 1>>>();"); 14303 verifyFormat("f<<<1, 1, 1, s>>>();"); 14304 verifyFormat("f<<<a, b, c, d>>>();"); 14305 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 14306 verifyFormat("f<param><<<1, 1>>>();"); 14307 verifyFormat("f<1><<<1, 1>>>();"); 14308 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 14309 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14310 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 14311 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 14312 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 14313 } 14314 14315 TEST_F(FormatTest, MergeLessLessAtEnd) { 14316 verifyFormat("<<"); 14317 EXPECT_EQ("< < <", format("\\\n<<<")); 14318 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14319 "aaallvm::outs() <<"); 14320 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14321 "aaaallvm::outs()\n <<"); 14322 } 14323 14324 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 14325 std::string code = "#if A\n" 14326 "#if B\n" 14327 "a.\n" 14328 "#endif\n" 14329 " a = 1;\n" 14330 "#else\n" 14331 "#endif\n" 14332 "#if C\n" 14333 "#else\n" 14334 "#endif\n"; 14335 EXPECT_EQ(code, format(code)); 14336 } 14337 14338 TEST_F(FormatTest, HandleConflictMarkers) { 14339 // Git/SVN conflict markers. 14340 EXPECT_EQ("int a;\n" 14341 "void f() {\n" 14342 " callme(some(parameter1,\n" 14343 "<<<<<<< text by the vcs\n" 14344 " parameter2),\n" 14345 "||||||| text by the vcs\n" 14346 " parameter2),\n" 14347 " parameter3,\n" 14348 "======= text by the vcs\n" 14349 " parameter2, parameter3),\n" 14350 ">>>>>>> text by the vcs\n" 14351 " otherparameter);\n", 14352 format("int a;\n" 14353 "void f() {\n" 14354 " callme(some(parameter1,\n" 14355 "<<<<<<< text by the vcs\n" 14356 " parameter2),\n" 14357 "||||||| text by the vcs\n" 14358 " parameter2),\n" 14359 " parameter3,\n" 14360 "======= text by the vcs\n" 14361 " parameter2,\n" 14362 " parameter3),\n" 14363 ">>>>>>> text by the vcs\n" 14364 " otherparameter);\n")); 14365 14366 // Perforce markers. 14367 EXPECT_EQ("void f() {\n" 14368 " function(\n" 14369 ">>>> text by the vcs\n" 14370 " parameter,\n" 14371 "==== text by the vcs\n" 14372 " parameter,\n" 14373 "==== text by the vcs\n" 14374 " parameter,\n" 14375 "<<<< text by the vcs\n" 14376 " parameter);\n", 14377 format("void f() {\n" 14378 " function(\n" 14379 ">>>> text by the vcs\n" 14380 " parameter,\n" 14381 "==== text by the vcs\n" 14382 " parameter,\n" 14383 "==== text by the vcs\n" 14384 " parameter,\n" 14385 "<<<< text by the vcs\n" 14386 " parameter);\n")); 14387 14388 EXPECT_EQ("<<<<<<<\n" 14389 "|||||||\n" 14390 "=======\n" 14391 ">>>>>>>", 14392 format("<<<<<<<\n" 14393 "|||||||\n" 14394 "=======\n" 14395 ">>>>>>>")); 14396 14397 EXPECT_EQ("<<<<<<<\n" 14398 "|||||||\n" 14399 "int i;\n" 14400 "=======\n" 14401 ">>>>>>>", 14402 format("<<<<<<<\n" 14403 "|||||||\n" 14404 "int i;\n" 14405 "=======\n" 14406 ">>>>>>>")); 14407 14408 // FIXME: Handle parsing of macros around conflict markers correctly: 14409 EXPECT_EQ("#define Macro \\\n" 14410 "<<<<<<<\n" 14411 "Something \\\n" 14412 "|||||||\n" 14413 "Else \\\n" 14414 "=======\n" 14415 "Other \\\n" 14416 ">>>>>>>\n" 14417 " End int i;\n", 14418 format("#define Macro \\\n" 14419 "<<<<<<<\n" 14420 " Something \\\n" 14421 "|||||||\n" 14422 " Else \\\n" 14423 "=======\n" 14424 " Other \\\n" 14425 ">>>>>>>\n" 14426 " End\n" 14427 "int i;\n")); 14428 } 14429 14430 TEST_F(FormatTest, DisableRegions) { 14431 EXPECT_EQ("int i;\n" 14432 "// clang-format off\n" 14433 " int j;\n" 14434 "// clang-format on\n" 14435 "int k;", 14436 format(" int i;\n" 14437 " // clang-format off\n" 14438 " int j;\n" 14439 " // clang-format on\n" 14440 " int k;")); 14441 EXPECT_EQ("int i;\n" 14442 "/* clang-format off */\n" 14443 " int j;\n" 14444 "/* clang-format on */\n" 14445 "int k;", 14446 format(" int i;\n" 14447 " /* clang-format off */\n" 14448 " int j;\n" 14449 " /* clang-format on */\n" 14450 " int k;")); 14451 14452 // Don't reflow comments within disabled regions. 14453 EXPECT_EQ("// clang-format off\n" 14454 "// long long long long long long line\n" 14455 "/* clang-format on */\n" 14456 "/* long long long\n" 14457 " * long long long\n" 14458 " * line */\n" 14459 "int i;\n" 14460 "/* clang-format off */\n" 14461 "/* long long long long long long line */\n", 14462 format("// clang-format off\n" 14463 "// long long long long long long line\n" 14464 "/* clang-format on */\n" 14465 "/* long long long long long long line */\n" 14466 "int i;\n" 14467 "/* clang-format off */\n" 14468 "/* long long long long long long line */\n", 14469 getLLVMStyleWithColumns(20))); 14470 } 14471 14472 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 14473 format("? ) ="); 14474 verifyNoCrash("#define a\\\n /**/}"); 14475 } 14476 14477 TEST_F(FormatTest, FormatsTableGenCode) { 14478 FormatStyle Style = getLLVMStyle(); 14479 Style.Language = FormatStyle::LK_TableGen; 14480 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 14481 } 14482 14483 TEST_F(FormatTest, ArrayOfTemplates) { 14484 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 14485 format("auto a = new unique_ptr<int > [ 10];")); 14486 14487 FormatStyle Spaces = getLLVMStyle(); 14488 Spaces.SpacesInSquareBrackets = true; 14489 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 14490 format("auto a = new unique_ptr<int > [10];", Spaces)); 14491 } 14492 14493 TEST_F(FormatTest, ArrayAsTemplateType) { 14494 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 14495 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 14496 14497 FormatStyle Spaces = getLLVMStyle(); 14498 Spaces.SpacesInSquareBrackets = true; 14499 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 14500 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 14501 } 14502 14503 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 14504 14505 TEST(FormatStyle, GetStyleWithEmptyFileName) { 14506 llvm::vfs::InMemoryFileSystem FS; 14507 auto Style1 = getStyle("file", "", "Google", "", &FS); 14508 ASSERT_TRUE((bool)Style1); 14509 ASSERT_EQ(*Style1, getGoogleStyle()); 14510 } 14511 14512 TEST(FormatStyle, GetStyleOfFile) { 14513 llvm::vfs::InMemoryFileSystem FS; 14514 // Test 1: format file in the same directory. 14515 ASSERT_TRUE( 14516 FS.addFile("/a/.clang-format", 0, 14517 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 14518 ASSERT_TRUE( 14519 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14520 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 14521 ASSERT_TRUE((bool)Style1); 14522 ASSERT_EQ(*Style1, getLLVMStyle()); 14523 14524 // Test 2.1: fallback to default. 14525 ASSERT_TRUE( 14526 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14527 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 14528 ASSERT_TRUE((bool)Style2); 14529 ASSERT_EQ(*Style2, getMozillaStyle()); 14530 14531 // Test 2.2: no format on 'none' fallback style. 14532 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14533 ASSERT_TRUE((bool)Style2); 14534 ASSERT_EQ(*Style2, getNoStyle()); 14535 14536 // Test 2.3: format if config is found with no based style while fallback is 14537 // 'none'. 14538 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 14539 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 14540 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14541 ASSERT_TRUE((bool)Style2); 14542 ASSERT_EQ(*Style2, getLLVMStyle()); 14543 14544 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 14545 Style2 = getStyle("{}", "a.h", "none", "", &FS); 14546 ASSERT_TRUE((bool)Style2); 14547 ASSERT_EQ(*Style2, getLLVMStyle()); 14548 14549 // Test 3: format file in parent directory. 14550 ASSERT_TRUE( 14551 FS.addFile("/c/.clang-format", 0, 14552 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 14553 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 14554 llvm::MemoryBuffer::getMemBuffer("int i;"))); 14555 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 14556 ASSERT_TRUE((bool)Style3); 14557 ASSERT_EQ(*Style3, getGoogleStyle()); 14558 14559 // Test 4: error on invalid fallback style 14560 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 14561 ASSERT_FALSE((bool)Style4); 14562 llvm::consumeError(Style4.takeError()); 14563 14564 // Test 5: error on invalid yaml on command line 14565 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 14566 ASSERT_FALSE((bool)Style5); 14567 llvm::consumeError(Style5.takeError()); 14568 14569 // Test 6: error on invalid style 14570 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 14571 ASSERT_FALSE((bool)Style6); 14572 llvm::consumeError(Style6.takeError()); 14573 14574 // Test 7: found config file, error on parsing it 14575 ASSERT_TRUE( 14576 FS.addFile("/d/.clang-format", 0, 14577 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 14578 "InvalidKey: InvalidValue"))); 14579 ASSERT_TRUE( 14580 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14581 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 14582 ASSERT_FALSE((bool)Style7); 14583 llvm::consumeError(Style7.takeError()); 14584 14585 // Test 8: inferred per-language defaults apply. 14586 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 14587 ASSERT_TRUE((bool)StyleTd); 14588 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 14589 } 14590 14591 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 14592 // Column limit is 20. 14593 std::string Code = "Type *a =\n" 14594 " new Type();\n" 14595 "g(iiiii, 0, jjjjj,\n" 14596 " 0, kkkkk, 0, mm);\n" 14597 "int bad = format ;"; 14598 std::string Expected = "auto a = new Type();\n" 14599 "g(iiiii, nullptr,\n" 14600 " jjjjj, nullptr,\n" 14601 " kkkkk, nullptr,\n" 14602 " mm);\n" 14603 "int bad = format ;"; 14604 FileID ID = Context.createInMemoryFile("format.cpp", Code); 14605 tooling::Replacements Replaces = toReplacements( 14606 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 14607 "auto "), 14608 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 14609 "nullptr"), 14610 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 14611 "nullptr"), 14612 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 14613 "nullptr")}); 14614 14615 format::FormatStyle Style = format::getLLVMStyle(); 14616 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 14617 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14618 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14619 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14620 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14621 EXPECT_TRUE(static_cast<bool>(Result)); 14622 EXPECT_EQ(Expected, *Result); 14623 } 14624 14625 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 14626 std::string Code = "#include \"a.h\"\n" 14627 "#include \"c.h\"\n" 14628 "\n" 14629 "int main() {\n" 14630 " return 0;\n" 14631 "}"; 14632 std::string Expected = "#include \"a.h\"\n" 14633 "#include \"b.h\"\n" 14634 "#include \"c.h\"\n" 14635 "\n" 14636 "int main() {\n" 14637 " return 0;\n" 14638 "}"; 14639 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 14640 tooling::Replacements Replaces = toReplacements( 14641 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 14642 "#include \"b.h\"\n")}); 14643 14644 format::FormatStyle Style = format::getLLVMStyle(); 14645 Style.SortIncludes = true; 14646 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14647 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14648 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14649 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14650 EXPECT_TRUE(static_cast<bool>(Result)); 14651 EXPECT_EQ(Expected, *Result); 14652 } 14653 14654 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 14655 EXPECT_EQ("using std::cin;\n" 14656 "using std::cout;", 14657 format("using std::cout;\n" 14658 "using std::cin;", 14659 getGoogleStyle())); 14660 } 14661 14662 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 14663 format::FormatStyle Style = format::getLLVMStyle(); 14664 Style.Standard = FormatStyle::LS_Cpp03; 14665 // cpp03 recognize this string as identifier u8 and literal character 'a' 14666 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 14667 } 14668 14669 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 14670 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 14671 // all modes, including C++11, C++14 and C++17 14672 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 14673 } 14674 14675 TEST_F(FormatTest, DoNotFormatLikelyXml) { 14676 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 14677 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 14678 } 14679 14680 TEST_F(FormatTest, StructuredBindings) { 14681 // Structured bindings is a C++17 feature. 14682 // all modes, including C++11, C++14 and C++17 14683 verifyFormat("auto [a, b] = f();"); 14684 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 14685 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 14686 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 14687 EXPECT_EQ("auto const volatile [a, b] = f();", 14688 format("auto const volatile[a, b] = f();")); 14689 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 14690 EXPECT_EQ("auto &[a, b, c] = f();", 14691 format("auto &[ a , b,c ] = f();")); 14692 EXPECT_EQ("auto &&[a, b, c] = f();", 14693 format("auto &&[ a , b,c ] = f();")); 14694 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 14695 EXPECT_EQ("auto const volatile &&[a, b] = f();", 14696 format("auto const volatile &&[a, b] = f();")); 14697 EXPECT_EQ("auto const &&[a, b] = f();", 14698 format("auto const && [a, b] = f();")); 14699 EXPECT_EQ("const auto &[a, b] = f();", 14700 format("const auto & [a, b] = f();")); 14701 EXPECT_EQ("const auto volatile &&[a, b] = f();", 14702 format("const auto volatile &&[a, b] = f();")); 14703 EXPECT_EQ("volatile const auto &&[a, b] = f();", 14704 format("volatile const auto &&[a, b] = f();")); 14705 EXPECT_EQ("const auto &&[a, b] = f();", 14706 format("const auto && [a, b] = f();")); 14707 14708 // Make sure we don't mistake structured bindings for lambdas. 14709 FormatStyle PointerMiddle = getLLVMStyle(); 14710 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 14711 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 14712 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 14713 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 14714 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 14715 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 14716 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 14717 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 14718 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 14719 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 14720 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 14721 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 14722 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 14723 14724 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 14725 format("for (const auto && [a, b] : some_range) {\n}")); 14726 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 14727 format("for (const auto & [a, b] : some_range) {\n}")); 14728 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 14729 format("for (const auto[a, b] : some_range) {\n}")); 14730 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 14731 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 14732 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 14733 EXPECT_EQ("auto const &[x, y](expr);", 14734 format("auto const & [x,y] (expr);")); 14735 EXPECT_EQ("auto const &&[x, y](expr);", 14736 format("auto const && [x,y] (expr);")); 14737 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 14738 EXPECT_EQ("auto const &[x, y]{expr};", 14739 format("auto const & [x,y] {expr};")); 14740 EXPECT_EQ("auto const &&[x, y]{expr};", 14741 format("auto const && [x,y] {expr};")); 14742 14743 format::FormatStyle Spaces = format::getLLVMStyle(); 14744 Spaces.SpacesInSquareBrackets = true; 14745 verifyFormat("auto [ a, b ] = f();", Spaces); 14746 verifyFormat("auto &&[ a, b ] = f();", Spaces); 14747 verifyFormat("auto &[ a, b ] = f();", Spaces); 14748 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 14749 verifyFormat("auto const &[ a, b ] = f();", Spaces); 14750 } 14751 14752 TEST_F(FormatTest, FileAndCode) { 14753 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 14754 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 14755 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 14756 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 14757 EXPECT_EQ(FormatStyle::LK_ObjC, 14758 guessLanguage("foo.h", "@interface Foo\n@end\n")); 14759 EXPECT_EQ( 14760 FormatStyle::LK_ObjC, 14761 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 14762 EXPECT_EQ(FormatStyle::LK_ObjC, 14763 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 14764 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 14765 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 14766 EXPECT_EQ(FormatStyle::LK_ObjC, 14767 guessLanguage("foo", "@interface Foo\n@end\n")); 14768 EXPECT_EQ(FormatStyle::LK_ObjC, 14769 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 14770 EXPECT_EQ( 14771 FormatStyle::LK_ObjC, 14772 guessLanguage("foo.h", 14773 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 14774 EXPECT_EQ( 14775 FormatStyle::LK_Cpp, 14776 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 14777 } 14778 14779 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 14780 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 14781 EXPECT_EQ(FormatStyle::LK_ObjC, 14782 guessLanguage("foo.h", "array[[calculator getIndex]];")); 14783 EXPECT_EQ(FormatStyle::LK_Cpp, 14784 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 14785 EXPECT_EQ( 14786 FormatStyle::LK_Cpp, 14787 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 14788 EXPECT_EQ(FormatStyle::LK_ObjC, 14789 guessLanguage("foo.h", "[[noreturn foo] bar];")); 14790 EXPECT_EQ(FormatStyle::LK_Cpp, 14791 guessLanguage("foo.h", "[[clang::fallthrough]];")); 14792 EXPECT_EQ(FormatStyle::LK_ObjC, 14793 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 14794 EXPECT_EQ(FormatStyle::LK_Cpp, 14795 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 14796 EXPECT_EQ(FormatStyle::LK_Cpp, 14797 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 14798 EXPECT_EQ(FormatStyle::LK_ObjC, 14799 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 14800 EXPECT_EQ(FormatStyle::LK_Cpp, 14801 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 14802 EXPECT_EQ( 14803 FormatStyle::LK_Cpp, 14804 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 14805 EXPECT_EQ( 14806 FormatStyle::LK_Cpp, 14807 guessLanguage("foo.h", 14808 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 14809 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 14810 } 14811 14812 TEST_F(FormatTest, GuessLanguageWithCaret) { 14813 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 14814 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 14815 EXPECT_EQ(FormatStyle::LK_ObjC, 14816 guessLanguage("foo.h", "int(^)(char, float);")); 14817 EXPECT_EQ(FormatStyle::LK_ObjC, 14818 guessLanguage("foo.h", "int(^foo)(char, float);")); 14819 EXPECT_EQ(FormatStyle::LK_ObjC, 14820 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 14821 EXPECT_EQ(FormatStyle::LK_ObjC, 14822 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 14823 EXPECT_EQ( 14824 FormatStyle::LK_ObjC, 14825 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 14826 } 14827 14828 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 14829 EXPECT_EQ(FormatStyle::LK_Cpp, 14830 guessLanguage("foo.h", "void f() {\n" 14831 " asm (\"mov %[e], %[d]\"\n" 14832 " : [d] \"=rm\" (d)\n" 14833 " [e] \"rm\" (*e));\n" 14834 "}")); 14835 EXPECT_EQ(FormatStyle::LK_Cpp, 14836 guessLanguage("foo.h", "void f() {\n" 14837 " _asm (\"mov %[e], %[d]\"\n" 14838 " : [d] \"=rm\" (d)\n" 14839 " [e] \"rm\" (*e));\n" 14840 "}")); 14841 EXPECT_EQ(FormatStyle::LK_Cpp, 14842 guessLanguage("foo.h", "void f() {\n" 14843 " __asm (\"mov %[e], %[d]\"\n" 14844 " : [d] \"=rm\" (d)\n" 14845 " [e] \"rm\" (*e));\n" 14846 "}")); 14847 EXPECT_EQ(FormatStyle::LK_Cpp, 14848 guessLanguage("foo.h", "void f() {\n" 14849 " __asm__ (\"mov %[e], %[d]\"\n" 14850 " : [d] \"=rm\" (d)\n" 14851 " [e] \"rm\" (*e));\n" 14852 "}")); 14853 EXPECT_EQ(FormatStyle::LK_Cpp, 14854 guessLanguage("foo.h", "void f() {\n" 14855 " asm (\"mov %[e], %[d]\"\n" 14856 " : [d] \"=rm\" (d),\n" 14857 " [e] \"rm\" (*e));\n" 14858 "}")); 14859 EXPECT_EQ(FormatStyle::LK_Cpp, 14860 guessLanguage("foo.h", "void f() {\n" 14861 " asm volatile (\"mov %[e], %[d]\"\n" 14862 " : [d] \"=rm\" (d)\n" 14863 " [e] \"rm\" (*e));\n" 14864 "}")); 14865 } 14866 14867 TEST_F(FormatTest, GuessLanguageWithChildLines) { 14868 EXPECT_EQ(FormatStyle::LK_Cpp, 14869 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 14870 EXPECT_EQ(FormatStyle::LK_ObjC, 14871 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 14872 EXPECT_EQ( 14873 FormatStyle::LK_Cpp, 14874 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 14875 EXPECT_EQ( 14876 FormatStyle::LK_ObjC, 14877 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 14878 } 14879 14880 TEST_F(FormatTest, TypenameMacros) { 14881 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 14882 14883 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 14884 FormatStyle Google = getGoogleStyleWithColumns(0); 14885 Google.TypenameMacros = TypenameMacros; 14886 verifyFormat("struct foo {\n" 14887 " int bar;\n" 14888 " TAILQ_ENTRY(a) bleh;\n" 14889 "};", 14890 Google); 14891 14892 FormatStyle Macros = getLLVMStyle(); 14893 Macros.TypenameMacros = TypenameMacros; 14894 14895 verifyFormat("STACK_OF(int) a;", Macros); 14896 verifyFormat("STACK_OF(int) *a;", Macros); 14897 verifyFormat("STACK_OF(int const *) *a;", Macros); 14898 verifyFormat("STACK_OF(int *const) *a;", Macros); 14899 verifyFormat("STACK_OF(int, string) a;", Macros); 14900 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 14901 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 14902 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 14903 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 14904 14905 Macros.PointerAlignment = FormatStyle::PAS_Left; 14906 verifyFormat("STACK_OF(int)* a;", Macros); 14907 verifyFormat("STACK_OF(int*)* a;", Macros); 14908 } 14909 14910 TEST_F(FormatTest, AmbersandInLamda) { 14911 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 14912 FormatStyle AlignStyle = getLLVMStyle(); 14913 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 14914 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14915 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 14916 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14917 } 14918 14919 TEST_F(FormatTest, SpacesInConditionalStatement) { 14920 FormatStyle Spaces = getLLVMStyle(); 14921 Spaces.SpacesInConditionalStatement = true; 14922 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 14923 verifyFormat("if ( !a )\n return;", Spaces); 14924 verifyFormat("if ( a )\n return;", Spaces); 14925 verifyFormat("if constexpr ( a )\n return;", Spaces); 14926 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 14927 verifyFormat("while ( a )\n return;", Spaces); 14928 verifyFormat("while ( (a && b) )\n return;", Spaces); 14929 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 14930 // Check that space on the left of "::" is inserted as expected at beginning 14931 // of condition. 14932 verifyFormat("while ( ::func() )\n return;", Spaces); 14933 } 14934 14935 TEST_F(FormatTest, AlternativeOperators) { 14936 // Test case for ensuring alternate operators are not 14937 // combined with their right most neighbour. 14938 verifyFormat("int a and b;"); 14939 verifyFormat("int a and_eq b;"); 14940 verifyFormat("int a bitand b;"); 14941 verifyFormat("int a bitor b;"); 14942 verifyFormat("int a compl b;"); 14943 verifyFormat("int a not b;"); 14944 verifyFormat("int a not_eq b;"); 14945 verifyFormat("int a or b;"); 14946 verifyFormat("int a xor b;"); 14947 verifyFormat("int a xor_eq b;"); 14948 verifyFormat("return this not_eq bitand other;"); 14949 verifyFormat("bool operator not_eq(const X bitand other)"); 14950 14951 verifyFormat("int a and 5;"); 14952 verifyFormat("int a and_eq 5;"); 14953 verifyFormat("int a bitand 5;"); 14954 verifyFormat("int a bitor 5;"); 14955 verifyFormat("int a compl 5;"); 14956 verifyFormat("int a not 5;"); 14957 verifyFormat("int a not_eq 5;"); 14958 verifyFormat("int a or 5;"); 14959 verifyFormat("int a xor 5;"); 14960 verifyFormat("int a xor_eq 5;"); 14961 14962 verifyFormat("int a compl(5);"); 14963 verifyFormat("int a not(5);"); 14964 14965 /* FIXME handle alternate tokens 14966 * https://en.cppreference.com/w/cpp/language/operator_alternative 14967 // alternative tokens 14968 verifyFormat("compl foo();"); // ~foo(); 14969 verifyFormat("foo() <%%>;"); // foo(); 14970 verifyFormat("void foo() <%%>;"); // void foo(){} 14971 verifyFormat("int a <:1:>;"); // int a[1];[ 14972 verifyFormat("%:define ABC abc"); // #define ABC abc 14973 verifyFormat("%:%:"); // ## 14974 */ 14975 } 14976 14977 TEST_F(FormatTest, STLWhileNotDefineChed) { 14978 verifyFormat("#if defined(while)\n" 14979 "#define while EMIT WARNING C4005\n" 14980 "#endif // while"); 14981 } 14982 14983 TEST_F(FormatTest, OperatorSpacing) { 14984 FormatStyle Style = getLLVMStyle(); 14985 Style.PointerAlignment = FormatStyle::PAS_Right; 14986 verifyFormat("Foo::operator*();", Style); 14987 verifyFormat("Foo::operator void *();", Style); 14988 verifyFormat("Foo::operator()(void *);", Style); 14989 verifyFormat("Foo::operator*(void *);", Style); 14990 verifyFormat("Foo::operator*();", Style); 14991 verifyFormat("operator*(int (*)(), class Foo);", Style); 14992 14993 verifyFormat("Foo::operator&();", Style); 14994 verifyFormat("Foo::operator void &();", Style); 14995 verifyFormat("Foo::operator()(void &);", Style); 14996 verifyFormat("Foo::operator&(void &);", Style); 14997 verifyFormat("Foo::operator&();", Style); 14998 verifyFormat("operator&(int (&)(), class Foo);", Style); 14999 15000 verifyFormat("Foo::operator&&();", Style); 15001 verifyFormat("Foo::operator void &&();", Style); 15002 verifyFormat("Foo::operator()(void &&);", Style); 15003 verifyFormat("Foo::operator&&(void &&);", Style); 15004 verifyFormat("Foo::operator&&();", Style); 15005 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15006 15007 Style.PointerAlignment = FormatStyle::PAS_Left; 15008 verifyFormat("Foo::operator*();", Style); 15009 verifyFormat("Foo::operator void*();", Style); 15010 verifyFormat("Foo::operator()(void*);", Style); 15011 verifyFormat("Foo::operator*(void*);", Style); 15012 verifyFormat("Foo::operator*();", Style); 15013 verifyFormat("operator*(int (*)(), class Foo);", Style); 15014 15015 verifyFormat("Foo::operator&();", Style); 15016 verifyFormat("Foo::operator void&();", Style); 15017 verifyFormat("Foo::operator()(void&);", Style); 15018 verifyFormat("Foo::operator&(void&);", Style); 15019 verifyFormat("Foo::operator&();", Style); 15020 verifyFormat("operator&(int (&)(), class Foo);", Style); 15021 15022 verifyFormat("Foo::operator&&();", Style); 15023 verifyFormat("Foo::operator void&&();", Style); 15024 verifyFormat("Foo::operator()(void&&);", Style); 15025 verifyFormat("Foo::operator&&(void&&);", Style); 15026 verifyFormat("Foo::operator&&();", Style); 15027 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15028 15029 Style.PointerAlignment = FormatStyle::PAS_Middle; 15030 verifyFormat("Foo::operator*();", Style); 15031 verifyFormat("Foo::operator void *();", Style); 15032 verifyFormat("Foo::operator()(void *);", Style); 15033 verifyFormat("Foo::operator*(void *);", Style); 15034 verifyFormat("Foo::operator*();", Style); 15035 verifyFormat("operator*(int (*)(), class Foo);", Style); 15036 15037 verifyFormat("Foo::operator&();", Style); 15038 verifyFormat("Foo::operator void &();", Style); 15039 verifyFormat("Foo::operator()(void &);", Style); 15040 verifyFormat("Foo::operator&(void &);", Style); 15041 verifyFormat("Foo::operator&();", Style); 15042 verifyFormat("operator&(int (&)(), class Foo);", Style); 15043 15044 verifyFormat("Foo::operator&&();", Style); 15045 verifyFormat("Foo::operator void &&();", Style); 15046 verifyFormat("Foo::operator()(void &&);", Style); 15047 verifyFormat("Foo::operator&&(void &&);", Style); 15048 verifyFormat("Foo::operator&&();", Style); 15049 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15050 } 15051 15052 } // namespace 15053 } // namespace format 15054 } // namespace clang 15055