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 "llvm/Support/Debug.h" 15 #include "llvm/Support/MemoryBuffer.h" 16 #include "gtest/gtest.h" 17 18 #define DEBUG_TYPE "format-test" 19 20 using clang::tooling::ReplacementTest; 21 using clang::tooling::toReplacements; 22 using testing::internal::ScopedTrace; 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(const char *File, int Line, llvm::StringRef Expected, 69 llvm::StringRef Code, 70 const FormatStyle &Style = getLLVMStyle()) { 71 ScopedTrace t(File, Line, ::testing::Message() << Code.str()); 72 EXPECT_EQ(Expected.str(), format(Expected, Style)) 73 << "Expected code is not stable"; 74 EXPECT_EQ(Expected.str(), format(Code, Style)); 75 if (Style.Language == FormatStyle::LK_Cpp) { 76 // Objective-C++ is a superset of C++, so everything checked for C++ 77 // needs to be checked for Objective-C++ as well. 78 FormatStyle ObjCStyle = Style; 79 ObjCStyle.Language = FormatStyle::LK_ObjC; 80 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle)); 81 } 82 } 83 84 void _verifyFormat(const char *File, int Line, llvm::StringRef Code, 85 const FormatStyle &Style = getLLVMStyle()) { 86 _verifyFormat(File, Line, Code, test::messUp(Code), Style); 87 } 88 89 void _verifyIncompleteFormat(const char *File, int Line, llvm::StringRef Code, 90 const FormatStyle &Style = getLLVMStyle()) { 91 ScopedTrace t(File, Line, ::testing::Message() << Code.str()); 92 EXPECT_EQ(Code.str(), 93 format(test::messUp(Code), Style, SC_ExpectIncomplete)); 94 } 95 96 void _verifyIndependentOfContext(const char *File, int Line, 97 llvm::StringRef Text, 98 const FormatStyle &Style = getLLVMStyle()) { 99 _verifyFormat(File, Line, Text, Style); 100 _verifyFormat(File, Line, llvm::Twine("void f() { " + Text + " }").str(), 101 Style); 102 } 103 104 /// \brief Verify that clang-format does not crash on the given input. 105 void verifyNoCrash(llvm::StringRef Code, 106 const FormatStyle &Style = getLLVMStyle()) { 107 format(Code, Style, SC_DoNotCheck); 108 } 109 110 int ReplacementCount; 111 }; 112 113 #define verifyIndependentOfContext(...) \ 114 _verifyIndependentOfContext(__FILE__, __LINE__, __VA_ARGS__) 115 #define verifyIncompleteFormat(...) \ 116 _verifyIncompleteFormat(__FILE__, __LINE__, __VA_ARGS__) 117 #define verifyFormat(...) _verifyFormat(__FILE__, __LINE__, __VA_ARGS__) 118 #define verifyGoogleFormat(Code) verifyFormat(Code, getGoogleStyle()) 119 120 TEST_F(FormatTest, MessUp) { 121 EXPECT_EQ("1 2 3", test::messUp("1 2 3")); 122 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n")); 123 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc")); 124 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc")); 125 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne")); 126 } 127 128 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) { 129 EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language); 130 } 131 132 TEST_F(FormatTest, LLVMStyleOverride) { 133 EXPECT_EQ(FormatStyle::LK_Proto, 134 getLLVMStyle(FormatStyle::LK_Proto).Language); 135 } 136 137 //===----------------------------------------------------------------------===// 138 // Basic function tests. 139 //===----------------------------------------------------------------------===// 140 141 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) { 142 EXPECT_EQ(";", format(";")); 143 } 144 145 TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 146 EXPECT_EQ("int i;", format(" int i;")); 147 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;")); 148 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 149 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 150 } 151 152 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 153 EXPECT_EQ("int i;", format("int\ni;")); 154 } 155 156 TEST_F(FormatTest, FormatsNestedBlockStatements) { 157 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}")); 158 } 159 160 TEST_F(FormatTest, FormatsNestedCall) { 161 verifyFormat("Method(f1, f2(f3));"); 162 verifyFormat("Method(f1(f2, f3()));"); 163 verifyFormat("Method(f1(f2, (f3())));"); 164 } 165 166 TEST_F(FormatTest, NestedNameSpecifiers) { 167 verifyFormat("vector<::Type> v;"); 168 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); 169 verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); 170 verifyFormat("static constexpr bool Bar = typeof(bar())::value;"); 171 verifyFormat("static constexpr bool Bar = __underlying_type(bar())::value;"); 172 verifyFormat("static constexpr bool Bar = _Atomic(bar())::value;"); 173 verifyFormat("bool a = 2 < ::SomeFunction();"); 174 verifyFormat("ALWAYS_INLINE ::std::string getName();"); 175 verifyFormat("some::string getName();"); 176 } 177 178 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { 179 EXPECT_EQ("if (a) {\n" 180 " f();\n" 181 "}", 182 format("if(a){f();}")); 183 EXPECT_EQ(4, ReplacementCount); 184 EXPECT_EQ("if (a) {\n" 185 " f();\n" 186 "}", 187 format("if (a) {\n" 188 " f();\n" 189 "}")); 190 EXPECT_EQ(0, ReplacementCount); 191 EXPECT_EQ("/*\r\n" 192 "\r\n" 193 "*/\r\n", 194 format("/*\r\n" 195 "\r\n" 196 "*/\r\n")); 197 EXPECT_EQ(0, ReplacementCount); 198 } 199 200 TEST_F(FormatTest, RemovesEmptyLines) { 201 EXPECT_EQ("class C {\n" 202 " int i;\n" 203 "};", 204 format("class C {\n" 205 " int i;\n" 206 "\n" 207 "};")); 208 209 // Don't remove empty lines at the start of namespaces or extern "C" blocks. 210 EXPECT_EQ("namespace N {\n" 211 "\n" 212 "int i;\n" 213 "}", 214 format("namespace N {\n" 215 "\n" 216 "int i;\n" 217 "}", 218 getGoogleStyle())); 219 EXPECT_EQ("/* something */ namespace N {\n" 220 "\n" 221 "int i;\n" 222 "}", 223 format("/* something */ namespace N {\n" 224 "\n" 225 "int i;\n" 226 "}", 227 getGoogleStyle())); 228 EXPECT_EQ("inline namespace N {\n" 229 "\n" 230 "int i;\n" 231 "}", 232 format("inline namespace N {\n" 233 "\n" 234 "int i;\n" 235 "}", 236 getGoogleStyle())); 237 EXPECT_EQ("/* something */ inline namespace N {\n" 238 "\n" 239 "int i;\n" 240 "}", 241 format("/* something */ inline namespace N {\n" 242 "\n" 243 "int i;\n" 244 "}", 245 getGoogleStyle())); 246 EXPECT_EQ("export namespace N {\n" 247 "\n" 248 "int i;\n" 249 "}", 250 format("export namespace N {\n" 251 "\n" 252 "int i;\n" 253 "}", 254 getGoogleStyle())); 255 EXPECT_EQ("extern /**/ \"C\" /**/ {\n" 256 "\n" 257 "int i;\n" 258 "}", 259 format("extern /**/ \"C\" /**/ {\n" 260 "\n" 261 "int i;\n" 262 "}", 263 getGoogleStyle())); 264 265 // ...but do keep inlining and removing empty lines for non-block extern "C" 266 // functions. 267 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); 268 EXPECT_EQ("extern \"C\" int f() {\n" 269 " int i = 42;\n" 270 " return i;\n" 271 "}", 272 format("extern \"C\" int f() {\n" 273 "\n" 274 " int i = 42;\n" 275 " return i;\n" 276 "}", 277 getGoogleStyle())); 278 279 // Remove empty lines at the beginning and end of blocks. 280 EXPECT_EQ("void f() {\n" 281 "\n" 282 " if (a) {\n" 283 "\n" 284 " f();\n" 285 " }\n" 286 "}", 287 format("void f() {\n" 288 "\n" 289 " if (a) {\n" 290 "\n" 291 " f();\n" 292 "\n" 293 " }\n" 294 "\n" 295 "}", 296 getLLVMStyle())); 297 EXPECT_EQ("void f() {\n" 298 " if (a) {\n" 299 " f();\n" 300 " }\n" 301 "}", 302 format("void f() {\n" 303 "\n" 304 " if (a) {\n" 305 "\n" 306 " f();\n" 307 "\n" 308 " }\n" 309 "\n" 310 "}", 311 getGoogleStyle())); 312 313 // Don't remove empty lines in more complex control statements. 314 EXPECT_EQ("void f() {\n" 315 " if (a) {\n" 316 " f();\n" 317 "\n" 318 " } else if (b) {\n" 319 " f();\n" 320 " }\n" 321 "}", 322 format("void f() {\n" 323 " if (a) {\n" 324 " f();\n" 325 "\n" 326 " } else if (b) {\n" 327 " f();\n" 328 "\n" 329 " }\n" 330 "\n" 331 "}")); 332 333 // Don't remove empty lines before namespace endings. 334 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 335 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 336 EXPECT_EQ("namespace {\n" 337 "int i;\n" 338 "\n" 339 "}", 340 format("namespace {\n" 341 "int i;\n" 342 "\n" 343 "}", 344 LLVMWithNoNamespaceFix)); 345 EXPECT_EQ("namespace {\n" 346 "int i;\n" 347 "}", 348 format("namespace {\n" 349 "int i;\n" 350 "}", 351 LLVMWithNoNamespaceFix)); 352 EXPECT_EQ("namespace {\n" 353 "int i;\n" 354 "\n" 355 "};", 356 format("namespace {\n" 357 "int i;\n" 358 "\n" 359 "};", 360 LLVMWithNoNamespaceFix)); 361 EXPECT_EQ("namespace {\n" 362 "int i;\n" 363 "};", 364 format("namespace {\n" 365 "int i;\n" 366 "};", 367 LLVMWithNoNamespaceFix)); 368 EXPECT_EQ("namespace {\n" 369 "int i;\n" 370 "\n" 371 "}", 372 format("namespace {\n" 373 "int i;\n" 374 "\n" 375 "}")); 376 EXPECT_EQ("namespace {\n" 377 "int i;\n" 378 "\n" 379 "} // namespace", 380 format("namespace {\n" 381 "int i;\n" 382 "\n" 383 "} // namespace")); 384 385 FormatStyle Style = getLLVMStyle(); 386 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 387 Style.MaxEmptyLinesToKeep = 2; 388 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 389 Style.BraceWrapping.AfterClass = true; 390 Style.BraceWrapping.AfterFunction = true; 391 Style.KeepEmptyLinesAtTheStartOfBlocks = false; 392 393 EXPECT_EQ("class Foo\n" 394 "{\n" 395 " Foo() {}\n" 396 "\n" 397 " void funk() {}\n" 398 "};", 399 format("class Foo\n" 400 "{\n" 401 " Foo()\n" 402 " {\n" 403 " }\n" 404 "\n" 405 " void funk() {}\n" 406 "};", 407 Style)); 408 } 409 410 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) { 411 verifyFormat("x = (a) and (b);"); 412 verifyFormat("x = (a) or (b);"); 413 verifyFormat("x = (a) bitand (b);"); 414 verifyFormat("x = (a) bitor (b);"); 415 verifyFormat("x = (a) not_eq (b);"); 416 verifyFormat("x = (a) and_eq (b);"); 417 verifyFormat("x = (a) or_eq (b);"); 418 verifyFormat("x = (a) xor (b);"); 419 } 420 421 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) { 422 verifyFormat("x = compl(a);"); 423 verifyFormat("x = not(a);"); 424 verifyFormat("x = bitand(a);"); 425 // Unary operator must not be merged with the next identifier 426 verifyFormat("x = compl a;"); 427 verifyFormat("x = not a;"); 428 verifyFormat("x = bitand a;"); 429 } 430 431 //===----------------------------------------------------------------------===// 432 // Tests for control statements. 433 //===----------------------------------------------------------------------===// 434 435 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) { 436 verifyFormat("if (true)\n f();\ng();"); 437 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();"); 438 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();"); 439 verifyFormat("if constexpr (true)\n" 440 " f();\ng();"); 441 verifyFormat("if CONSTEXPR (true)\n" 442 " f();\ng();"); 443 verifyFormat("if constexpr (a)\n" 444 " if constexpr (b)\n" 445 " if constexpr (c)\n" 446 " g();\n" 447 "h();"); 448 verifyFormat("if CONSTEXPR (a)\n" 449 " if CONSTEXPR (b)\n" 450 " if CONSTEXPR (c)\n" 451 " g();\n" 452 "h();"); 453 verifyFormat("if constexpr (a)\n" 454 " if constexpr (b) {\n" 455 " f();\n" 456 " }\n" 457 "g();"); 458 verifyFormat("if CONSTEXPR (a)\n" 459 " if CONSTEXPR (b) {\n" 460 " f();\n" 461 " }\n" 462 "g();"); 463 464 FormatStyle AllowsMergedIf = getLLVMStyle(); 465 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 466 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 467 FormatStyle::SIS_WithoutElse; 468 verifyFormat("if (a)\n" 469 " // comment\n" 470 " f();", 471 AllowsMergedIf); 472 verifyFormat("{\n" 473 " if (a)\n" 474 " label:\n" 475 " f();\n" 476 "}", 477 AllowsMergedIf); 478 verifyFormat("#define A \\\n" 479 " if (a) \\\n" 480 " label: \\\n" 481 " f()", 482 AllowsMergedIf); 483 verifyFormat("if (a)\n" 484 " ;", 485 AllowsMergedIf); 486 verifyFormat("if (a)\n" 487 " if (b) return;", 488 AllowsMergedIf); 489 490 verifyFormat("if (a) // Can't merge this\n" 491 " f();\n", 492 AllowsMergedIf); 493 verifyFormat("if (a) /* still don't merge */\n" 494 " f();", 495 AllowsMergedIf); 496 verifyFormat("if (a) { // Never merge this\n" 497 " f();\n" 498 "}", 499 AllowsMergedIf); 500 verifyFormat("if (a) { /* Never merge this */\n" 501 " f();\n" 502 "}", 503 AllowsMergedIf); 504 505 AllowsMergedIf.ColumnLimit = 14; 506 verifyFormat("if (a) return;", AllowsMergedIf); 507 verifyFormat("if (aaaaaaaaa)\n" 508 " return;", 509 AllowsMergedIf); 510 511 AllowsMergedIf.ColumnLimit = 13; 512 verifyFormat("if (a)\n return;", AllowsMergedIf); 513 } 514 515 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) { 516 FormatStyle AllowsMergedIf = getLLVMStyle(); 517 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 518 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 519 FormatStyle::SIS_WithoutElse; 520 verifyFormat("if (a)\n" 521 " f();\n" 522 "else {\n" 523 " g();\n" 524 "}", 525 AllowsMergedIf); 526 verifyFormat("if (a)\n" 527 " f();\n" 528 "else\n" 529 " g();\n", 530 AllowsMergedIf); 531 532 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 533 534 verifyFormat("if (a) f();\n" 535 "else {\n" 536 " g();\n" 537 "}", 538 AllowsMergedIf); 539 verifyFormat("if (a) f();\n" 540 "else {\n" 541 " if (a) f();\n" 542 " else {\n" 543 " g();\n" 544 " }\n" 545 " g();\n" 546 "}", 547 AllowsMergedIf); 548 } 549 550 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) { 551 FormatStyle AllowsMergedLoops = getLLVMStyle(); 552 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true; 553 verifyFormat("while (true) continue;", AllowsMergedLoops); 554 verifyFormat("for (;;) continue;", AllowsMergedLoops); 555 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops); 556 verifyFormat("while (true)\n" 557 " ;", 558 AllowsMergedLoops); 559 verifyFormat("for (;;)\n" 560 " ;", 561 AllowsMergedLoops); 562 verifyFormat("for (;;)\n" 563 " for (;;) continue;", 564 AllowsMergedLoops); 565 verifyFormat("for (;;) // Can't merge this\n" 566 " continue;", 567 AllowsMergedLoops); 568 verifyFormat("for (;;) /* still don't merge */\n" 569 " continue;", 570 AllowsMergedLoops); 571 verifyFormat("do a++;\n" 572 "while (true);", 573 AllowsMergedLoops); 574 verifyFormat("do /* Don't merge */\n" 575 " a++;\n" 576 "while (true);", 577 AllowsMergedLoops); 578 verifyFormat("do // Don't merge\n" 579 " a++;\n" 580 "while (true);", 581 AllowsMergedLoops); 582 verifyFormat("do\n" 583 " // Don't merge\n" 584 " a++;\n" 585 "while (true);", 586 AllowsMergedLoops); 587 // Without braces labels are interpreted differently. 588 verifyFormat("{\n" 589 " do\n" 590 " label:\n" 591 " a++;\n" 592 " while (true);\n" 593 "}", 594 AllowsMergedLoops); 595 } 596 597 TEST_F(FormatTest, FormatShortBracedStatements) { 598 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 599 AllowSimpleBracedStatements.ColumnLimit = 40; 600 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = 601 FormatStyle::SBS_Always; 602 603 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 604 FormatStyle::SIS_WithoutElse; 605 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 606 607 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom; 608 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true; 609 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false; 610 611 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 612 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 613 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 614 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 615 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 616 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 617 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 618 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 619 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 620 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 621 verifyFormat("if (true) { fffffffffffffffffffffff(); }", 622 AllowSimpleBracedStatements); 623 verifyFormat("if (true) {\n" 624 " ffffffffffffffffffffffff();\n" 625 "}", 626 AllowSimpleBracedStatements); 627 verifyFormat("if (true) {\n" 628 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 629 "}", 630 AllowSimpleBracedStatements); 631 verifyFormat("if (true) { //\n" 632 " f();\n" 633 "}", 634 AllowSimpleBracedStatements); 635 verifyFormat("if (true) {\n" 636 " f();\n" 637 " f();\n" 638 "}", 639 AllowSimpleBracedStatements); 640 verifyFormat("if (true) {\n" 641 " f();\n" 642 "} else {\n" 643 " f();\n" 644 "}", 645 AllowSimpleBracedStatements); 646 647 verifyFormat("struct A2 {\n" 648 " int X;\n" 649 "};", 650 AllowSimpleBracedStatements); 651 verifyFormat("typedef struct A2 {\n" 652 " int X;\n" 653 "} A2_t;", 654 AllowSimpleBracedStatements); 655 verifyFormat("template <int> struct A2 {\n" 656 " struct B {};\n" 657 "};", 658 AllowSimpleBracedStatements); 659 660 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 661 FormatStyle::SIS_Never; 662 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 663 verifyFormat("if (true) {\n" 664 " f();\n" 665 "}", 666 AllowSimpleBracedStatements); 667 verifyFormat("if (true) {\n" 668 " f();\n" 669 "} else {\n" 670 " f();\n" 671 "}", 672 AllowSimpleBracedStatements); 673 674 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 675 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 676 verifyFormat("while (true) {\n" 677 " f();\n" 678 "}", 679 AllowSimpleBracedStatements); 680 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 681 verifyFormat("for (;;) {\n" 682 " f();\n" 683 "}", 684 AllowSimpleBracedStatements); 685 686 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 687 FormatStyle::SIS_WithoutElse; 688 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 689 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = 690 FormatStyle::BWACS_Always; 691 692 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 693 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 694 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 695 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 696 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 697 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 698 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 699 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 700 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 701 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 702 verifyFormat("if (true) { fffffffffffffffffffffff(); }", 703 AllowSimpleBracedStatements); 704 verifyFormat("if (true)\n" 705 "{\n" 706 " ffffffffffffffffffffffff();\n" 707 "}", 708 AllowSimpleBracedStatements); 709 verifyFormat("if (true)\n" 710 "{\n" 711 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 712 "}", 713 AllowSimpleBracedStatements); 714 verifyFormat("if (true)\n" 715 "{ //\n" 716 " f();\n" 717 "}", 718 AllowSimpleBracedStatements); 719 verifyFormat("if (true)\n" 720 "{\n" 721 " f();\n" 722 " f();\n" 723 "}", 724 AllowSimpleBracedStatements); 725 verifyFormat("if (true)\n" 726 "{\n" 727 " f();\n" 728 "} else\n" 729 "{\n" 730 " f();\n" 731 "}", 732 AllowSimpleBracedStatements); 733 734 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 735 FormatStyle::SIS_Never; 736 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 737 verifyFormat("if (true)\n" 738 "{\n" 739 " f();\n" 740 "}", 741 AllowSimpleBracedStatements); 742 verifyFormat("if (true)\n" 743 "{\n" 744 " f();\n" 745 "} else\n" 746 "{\n" 747 " f();\n" 748 "}", 749 AllowSimpleBracedStatements); 750 751 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 752 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 753 verifyFormat("while (true)\n" 754 "{\n" 755 " f();\n" 756 "}", 757 AllowSimpleBracedStatements); 758 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 759 verifyFormat("for (;;)\n" 760 "{\n" 761 " f();\n" 762 "}", 763 AllowSimpleBracedStatements); 764 } 765 766 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 767 FormatStyle Style = getLLVMStyleWithColumns(60); 768 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 769 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 770 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 771 EXPECT_EQ("#define A \\\n" 772 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 773 " { \\\n" 774 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 775 " }\n" 776 "X;", 777 format("#define A \\\n" 778 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 779 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 780 " }\n" 781 "X;", 782 Style)); 783 } 784 785 TEST_F(FormatTest, ParseIfElse) { 786 verifyFormat("if (true)\n" 787 " if (true)\n" 788 " if (true)\n" 789 " f();\n" 790 " else\n" 791 " g();\n" 792 " else\n" 793 " h();\n" 794 "else\n" 795 " i();"); 796 verifyFormat("if (true)\n" 797 " if (true)\n" 798 " if (true) {\n" 799 " if (true)\n" 800 " f();\n" 801 " } else {\n" 802 " g();\n" 803 " }\n" 804 " else\n" 805 " h();\n" 806 "else {\n" 807 " i();\n" 808 "}"); 809 verifyFormat("if (true)\n" 810 " if constexpr (true)\n" 811 " if (true) {\n" 812 " if constexpr (true)\n" 813 " f();\n" 814 " } else {\n" 815 " g();\n" 816 " }\n" 817 " else\n" 818 " h();\n" 819 "else {\n" 820 " i();\n" 821 "}"); 822 verifyFormat("if (true)\n" 823 " if CONSTEXPR (true)\n" 824 " if (true) {\n" 825 " if CONSTEXPR (true)\n" 826 " f();\n" 827 " } else {\n" 828 " g();\n" 829 " }\n" 830 " else\n" 831 " h();\n" 832 "else {\n" 833 " i();\n" 834 "}"); 835 verifyFormat("void f() {\n" 836 " if (a) {\n" 837 " } else {\n" 838 " }\n" 839 "}"); 840 } 841 842 TEST_F(FormatTest, ElseIf) { 843 verifyFormat("if (a) {\n} else if (b) {\n}"); 844 verifyFormat("if (a)\n" 845 " f();\n" 846 "else if (b)\n" 847 " g();\n" 848 "else\n" 849 " h();"); 850 verifyFormat("if constexpr (a)\n" 851 " f();\n" 852 "else if constexpr (b)\n" 853 " g();\n" 854 "else\n" 855 " h();"); 856 verifyFormat("if CONSTEXPR (a)\n" 857 " f();\n" 858 "else if CONSTEXPR (b)\n" 859 " g();\n" 860 "else\n" 861 " h();"); 862 verifyFormat("if (a) {\n" 863 " f();\n" 864 "}\n" 865 "// or else ..\n" 866 "else {\n" 867 " g()\n" 868 "}"); 869 870 verifyFormat("if (a) {\n" 871 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 872 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 873 "}"); 874 verifyFormat("if (a) {\n" 875 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 877 "}"); 878 verifyFormat("if (a) {\n" 879 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 880 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 881 "}"); 882 verifyFormat("if (a) {\n" 883 "} else if (\n" 884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 885 "}", 886 getLLVMStyleWithColumns(62)); 887 verifyFormat("if (a) {\n" 888 "} else if constexpr (\n" 889 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 890 "}", 891 getLLVMStyleWithColumns(62)); 892 verifyFormat("if (a) {\n" 893 "} else if CONSTEXPR (\n" 894 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 895 "}", 896 getLLVMStyleWithColumns(62)); 897 } 898 899 TEST_F(FormatTest, FormatsForLoop) { 900 verifyFormat( 901 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 902 " ++VeryVeryLongLoopVariable)\n" 903 " ;"); 904 verifyFormat("for (;;)\n" 905 " f();"); 906 verifyFormat("for (;;) {\n}"); 907 verifyFormat("for (;;) {\n" 908 " f();\n" 909 "}"); 910 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 911 912 verifyFormat( 913 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 914 " E = UnwrappedLines.end();\n" 915 " I != E; ++I) {\n}"); 916 917 verifyFormat( 918 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 919 " ++IIIII) {\n}"); 920 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 921 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 922 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 923 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 924 " I = FD->getDeclsInPrototypeScope().begin(),\n" 925 " E = FD->getDeclsInPrototypeScope().end();\n" 926 " I != E; ++I) {\n}"); 927 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 928 " I = Container.begin(),\n" 929 " E = Container.end();\n" 930 " I != E; ++I) {\n}", 931 getLLVMStyleWithColumns(76)); 932 933 verifyFormat( 934 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 935 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 936 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 937 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 938 " ++aaaaaaaaaaa) {\n}"); 939 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 940 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 941 " ++i) {\n}"); 942 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 943 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 944 "}"); 945 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 946 " aaaaaaaaaa);\n" 947 " iter; ++iter) {\n" 948 "}"); 949 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 950 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 951 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 952 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 953 954 // These should not be formatted as Objective-C for-in loops. 955 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 956 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 957 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 958 verifyFormat( 959 "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 960 961 FormatStyle NoBinPacking = getLLVMStyle(); 962 NoBinPacking.BinPackParameters = false; 963 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 964 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 965 " aaaaaaaaaaaaaaaa,\n" 966 " aaaaaaaaaaaaaaaa,\n" 967 " aaaaaaaaaaaaaaaa);\n" 968 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 969 "}", 970 NoBinPacking); 971 verifyFormat( 972 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 973 " E = UnwrappedLines.end();\n" 974 " I != E;\n" 975 " ++I) {\n}", 976 NoBinPacking); 977 978 FormatStyle AlignLeft = getLLVMStyle(); 979 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 980 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 981 } 982 983 TEST_F(FormatTest, RangeBasedForLoops) { 984 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 986 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 987 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 988 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 990 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 991 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 992 } 993 994 TEST_F(FormatTest, ForEachLoops) { 995 verifyFormat("void f() {\n" 996 " foreach (Item *item, itemlist) {}\n" 997 " Q_FOREACH (Item *item, itemlist) {}\n" 998 " BOOST_FOREACH (Item *item, itemlist) {}\n" 999 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 1000 "}"); 1001 1002 FormatStyle Style = getLLVMStyle(); 1003 Style.SpaceBeforeParens = 1004 FormatStyle::SBPO_ControlStatementsExceptForEachMacros; 1005 verifyFormat("void f() {\n" 1006 " foreach(Item *item, itemlist) {}\n" 1007 " Q_FOREACH(Item *item, itemlist) {}\n" 1008 " BOOST_FOREACH(Item *item, itemlist) {}\n" 1009 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 1010 "}", 1011 Style); 1012 1013 // As function-like macros. 1014 verifyFormat("#define foreach(x, y)\n" 1015 "#define Q_FOREACH(x, y)\n" 1016 "#define BOOST_FOREACH(x, y)\n" 1017 "#define UNKNOWN_FOREACH(x, y)\n"); 1018 1019 // Not as function-like macros. 1020 verifyFormat("#define foreach (x, y)\n" 1021 "#define Q_FOREACH (x, y)\n" 1022 "#define BOOST_FOREACH (x, y)\n" 1023 "#define UNKNOWN_FOREACH (x, y)\n"); 1024 1025 // handle microsoft non standard extension 1026 verifyFormat("for each (char c in x->MyStringProperty)"); 1027 } 1028 1029 TEST_F(FormatTest, FormatsWhileLoop) { 1030 verifyFormat("while (true) {\n}"); 1031 verifyFormat("while (true)\n" 1032 " f();"); 1033 verifyFormat("while () {\n}"); 1034 verifyFormat("while () {\n" 1035 " f();\n" 1036 "}"); 1037 } 1038 1039 TEST_F(FormatTest, FormatsDoWhile) { 1040 verifyFormat("do {\n" 1041 " do_something();\n" 1042 "} while (something());"); 1043 verifyFormat("do\n" 1044 " do_something();\n" 1045 "while (something());"); 1046 } 1047 1048 TEST_F(FormatTest, FormatsSwitchStatement) { 1049 verifyFormat("switch (x) {\n" 1050 "case 1:\n" 1051 " f();\n" 1052 " break;\n" 1053 "case kFoo:\n" 1054 "case ns::kBar:\n" 1055 "case kBaz:\n" 1056 " break;\n" 1057 "default:\n" 1058 " g();\n" 1059 " break;\n" 1060 "}"); 1061 verifyFormat("switch (x) {\n" 1062 "case 1: {\n" 1063 " f();\n" 1064 " break;\n" 1065 "}\n" 1066 "case 2: {\n" 1067 " break;\n" 1068 "}\n" 1069 "}"); 1070 verifyFormat("switch (x) {\n" 1071 "case 1: {\n" 1072 " f();\n" 1073 " {\n" 1074 " g();\n" 1075 " h();\n" 1076 " }\n" 1077 " break;\n" 1078 "}\n" 1079 "}"); 1080 verifyFormat("switch (x) {\n" 1081 "case 1: {\n" 1082 " f();\n" 1083 " if (foo) {\n" 1084 " g();\n" 1085 " h();\n" 1086 " }\n" 1087 " break;\n" 1088 "}\n" 1089 "}"); 1090 verifyFormat("switch (x) {\n" 1091 "case 1: {\n" 1092 " f();\n" 1093 " g();\n" 1094 "} break;\n" 1095 "}"); 1096 verifyFormat("switch (test)\n" 1097 " ;"); 1098 verifyFormat("switch (x) {\n" 1099 "default: {\n" 1100 " // Do nothing.\n" 1101 "}\n" 1102 "}"); 1103 verifyFormat("switch (x) {\n" 1104 "// comment\n" 1105 "// if 1, do f()\n" 1106 "case 1:\n" 1107 " f();\n" 1108 "}"); 1109 verifyFormat("switch (x) {\n" 1110 "case 1:\n" 1111 " // Do amazing stuff\n" 1112 " {\n" 1113 " f();\n" 1114 " g();\n" 1115 " }\n" 1116 " break;\n" 1117 "}"); 1118 verifyFormat("#define A \\\n" 1119 " switch (x) { \\\n" 1120 " case a: \\\n" 1121 " foo = b; \\\n" 1122 " }", 1123 getLLVMStyleWithColumns(20)); 1124 verifyFormat("#define OPERATION_CASE(name) \\\n" 1125 " case OP_name: \\\n" 1126 " return operations::Operation##name\n", 1127 getLLVMStyleWithColumns(40)); 1128 verifyFormat("switch (x) {\n" 1129 "case 1:;\n" 1130 "default:;\n" 1131 " int i;\n" 1132 "}"); 1133 1134 verifyGoogleFormat("switch (x) {\n" 1135 " case 1:\n" 1136 " f();\n" 1137 " break;\n" 1138 " case kFoo:\n" 1139 " case ns::kBar:\n" 1140 " case kBaz:\n" 1141 " break;\n" 1142 " default:\n" 1143 " g();\n" 1144 " break;\n" 1145 "}"); 1146 verifyGoogleFormat("switch (x) {\n" 1147 " case 1: {\n" 1148 " f();\n" 1149 " break;\n" 1150 " }\n" 1151 "}"); 1152 verifyGoogleFormat("switch (test)\n" 1153 " ;"); 1154 1155 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1156 " case OP_name: \\\n" 1157 " return operations::Operation##name\n"); 1158 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1159 " // Get the correction operation class.\n" 1160 " switch (OpCode) {\n" 1161 " CASE(Add);\n" 1162 " CASE(Subtract);\n" 1163 " default:\n" 1164 " return operations::Unknown;\n" 1165 " }\n" 1166 "#undef OPERATION_CASE\n" 1167 "}"); 1168 verifyFormat("DEBUG({\n" 1169 " switch (x) {\n" 1170 " case A:\n" 1171 " f();\n" 1172 " break;\n" 1173 " // fallthrough\n" 1174 " case B:\n" 1175 " g();\n" 1176 " break;\n" 1177 " }\n" 1178 "});"); 1179 EXPECT_EQ("DEBUG({\n" 1180 " switch (x) {\n" 1181 " case A:\n" 1182 " f();\n" 1183 " break;\n" 1184 " // On B:\n" 1185 " case B:\n" 1186 " g();\n" 1187 " break;\n" 1188 " }\n" 1189 "});", 1190 format("DEBUG({\n" 1191 " switch (x) {\n" 1192 " case A:\n" 1193 " f();\n" 1194 " break;\n" 1195 " // On B:\n" 1196 " case B:\n" 1197 " g();\n" 1198 " break;\n" 1199 " }\n" 1200 "});", 1201 getLLVMStyle())); 1202 EXPECT_EQ("switch (n) {\n" 1203 "case 0: {\n" 1204 " return false;\n" 1205 "}\n" 1206 "default: {\n" 1207 " return true;\n" 1208 "}\n" 1209 "}", 1210 format("switch (n)\n" 1211 "{\n" 1212 "case 0: {\n" 1213 " return false;\n" 1214 "}\n" 1215 "default: {\n" 1216 " return true;\n" 1217 "}\n" 1218 "}", 1219 getLLVMStyle())); 1220 verifyFormat("switch (a) {\n" 1221 "case (b):\n" 1222 " return;\n" 1223 "}"); 1224 1225 verifyFormat("switch (a) {\n" 1226 "case some_namespace::\n" 1227 " some_constant:\n" 1228 " return;\n" 1229 "}", 1230 getLLVMStyleWithColumns(34)); 1231 1232 FormatStyle Style = getLLVMStyle(); 1233 Style.IndentCaseLabels = true; 1234 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1235 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1236 Style.BraceWrapping.AfterCaseLabel = true; 1237 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1238 EXPECT_EQ("switch (n)\n" 1239 "{\n" 1240 " case 0:\n" 1241 " {\n" 1242 " return false;\n" 1243 " }\n" 1244 " default:\n" 1245 " {\n" 1246 " return true;\n" 1247 " }\n" 1248 "}", 1249 format("switch (n) {\n" 1250 " case 0: {\n" 1251 " return false;\n" 1252 " }\n" 1253 " default: {\n" 1254 " return true;\n" 1255 " }\n" 1256 "}", 1257 Style)); 1258 Style.BraceWrapping.AfterCaseLabel = false; 1259 EXPECT_EQ("switch (n)\n" 1260 "{\n" 1261 " case 0: {\n" 1262 " return false;\n" 1263 " }\n" 1264 " default: {\n" 1265 " return true;\n" 1266 " }\n" 1267 "}", 1268 format("switch (n) {\n" 1269 " case 0:\n" 1270 " {\n" 1271 " return false;\n" 1272 " }\n" 1273 " default:\n" 1274 " {\n" 1275 " return true;\n" 1276 " }\n" 1277 "}", 1278 Style)); 1279 Style.IndentCaseLabels = false; 1280 Style.IndentCaseBlocks = true; 1281 EXPECT_EQ("switch (n)\n" 1282 "{\n" 1283 "case 0:\n" 1284 " {\n" 1285 " return false;\n" 1286 " }\n" 1287 "case 1:\n" 1288 " break;\n" 1289 "default:\n" 1290 " {\n" 1291 " return true;\n" 1292 " }\n" 1293 "}", 1294 format("switch (n) {\n" 1295 "case 0: {\n" 1296 " return false;\n" 1297 "}\n" 1298 "case 1:\n" 1299 " break;\n" 1300 "default: {\n" 1301 " return true;\n" 1302 "}\n" 1303 "}", 1304 Style)); 1305 Style.IndentCaseLabels = true; 1306 Style.IndentCaseBlocks = true; 1307 EXPECT_EQ("switch (n)\n" 1308 "{\n" 1309 " case 0:\n" 1310 " {\n" 1311 " return false;\n" 1312 " }\n" 1313 " case 1:\n" 1314 " break;\n" 1315 " default:\n" 1316 " {\n" 1317 " return true;\n" 1318 " }\n" 1319 "}", 1320 format("switch (n) {\n" 1321 "case 0: {\n" 1322 " return false;\n" 1323 "}\n" 1324 "case 1:\n" 1325 " break;\n" 1326 "default: {\n" 1327 " return true;\n" 1328 "}\n" 1329 "}", 1330 Style)); 1331 } 1332 1333 TEST_F(FormatTest, CaseRanges) { 1334 verifyFormat("switch (x) {\n" 1335 "case 'A' ... 'Z':\n" 1336 "case 1 ... 5:\n" 1337 "case a ... b:\n" 1338 " break;\n" 1339 "}"); 1340 } 1341 1342 TEST_F(FormatTest, ShortEnums) { 1343 FormatStyle Style = getLLVMStyle(); 1344 Style.AllowShortEnumsOnASingleLine = true; 1345 verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style); 1346 Style.AllowShortEnumsOnASingleLine = false; 1347 verifyFormat("enum\n" 1348 "{\n" 1349 " A,\n" 1350 " B,\n" 1351 " C\n" 1352 "} ShortEnum1, ShortEnum2;", 1353 Style); 1354 } 1355 1356 TEST_F(FormatTest, ShortCaseLabels) { 1357 FormatStyle Style = getLLVMStyle(); 1358 Style.AllowShortCaseLabelsOnASingleLine = true; 1359 verifyFormat("switch (a) {\n" 1360 "case 1: x = 1; break;\n" 1361 "case 2: return;\n" 1362 "case 3:\n" 1363 "case 4:\n" 1364 "case 5: return;\n" 1365 "case 6: // comment\n" 1366 " return;\n" 1367 "case 7:\n" 1368 " // comment\n" 1369 " return;\n" 1370 "case 8:\n" 1371 " x = 8; // comment\n" 1372 " break;\n" 1373 "default: y = 1; break;\n" 1374 "}", 1375 Style); 1376 verifyFormat("switch (a) {\n" 1377 "case 0: return; // comment\n" 1378 "case 1: break; // comment\n" 1379 "case 2: return;\n" 1380 "// comment\n" 1381 "case 3: return;\n" 1382 "// comment 1\n" 1383 "// comment 2\n" 1384 "// comment 3\n" 1385 "case 4: break; /* comment */\n" 1386 "case 5:\n" 1387 " // comment\n" 1388 " break;\n" 1389 "case 6: /* comment */ x = 1; break;\n" 1390 "case 7: x = /* comment */ 1; break;\n" 1391 "case 8:\n" 1392 " x = 1; /* comment */\n" 1393 " break;\n" 1394 "case 9:\n" 1395 " break; // comment line 1\n" 1396 " // comment line 2\n" 1397 "}", 1398 Style); 1399 EXPECT_EQ("switch (a) {\n" 1400 "case 1:\n" 1401 " x = 8;\n" 1402 " // fall through\n" 1403 "case 2: x = 8;\n" 1404 "// comment\n" 1405 "case 3:\n" 1406 " return; /* comment line 1\n" 1407 " * comment line 2 */\n" 1408 "case 4: i = 8;\n" 1409 "// something else\n" 1410 "#if FOO\n" 1411 "case 5: break;\n" 1412 "#endif\n" 1413 "}", 1414 format("switch (a) {\n" 1415 "case 1: x = 8;\n" 1416 " // fall through\n" 1417 "case 2:\n" 1418 " x = 8;\n" 1419 "// comment\n" 1420 "case 3:\n" 1421 " return; /* comment line 1\n" 1422 " * comment line 2 */\n" 1423 "case 4:\n" 1424 " i = 8;\n" 1425 "// something else\n" 1426 "#if FOO\n" 1427 "case 5: break;\n" 1428 "#endif\n" 1429 "}", 1430 Style)); 1431 EXPECT_EQ("switch (a) {\n" 1432 "case 0:\n" 1433 " return; // long long long long long long long long long long " 1434 "long long comment\n" 1435 " // line\n" 1436 "}", 1437 format("switch (a) {\n" 1438 "case 0: return; // long long long long long long long long " 1439 "long long long long comment line\n" 1440 "}", 1441 Style)); 1442 EXPECT_EQ("switch (a) {\n" 1443 "case 0:\n" 1444 " return; /* long long long long long long long long long long " 1445 "long long comment\n" 1446 " line */\n" 1447 "}", 1448 format("switch (a) {\n" 1449 "case 0: return; /* long long long long long long long long " 1450 "long long long long comment line */\n" 1451 "}", 1452 Style)); 1453 verifyFormat("switch (a) {\n" 1454 "#if FOO\n" 1455 "case 0: return 0;\n" 1456 "#endif\n" 1457 "}", 1458 Style); 1459 verifyFormat("switch (a) {\n" 1460 "case 1: {\n" 1461 "}\n" 1462 "case 2: {\n" 1463 " return;\n" 1464 "}\n" 1465 "case 3: {\n" 1466 " x = 1;\n" 1467 " return;\n" 1468 "}\n" 1469 "case 4:\n" 1470 " if (x)\n" 1471 " return;\n" 1472 "}", 1473 Style); 1474 Style.ColumnLimit = 21; 1475 verifyFormat("switch (a) {\n" 1476 "case 1: x = 1; break;\n" 1477 "case 2: return;\n" 1478 "case 3:\n" 1479 "case 4:\n" 1480 "case 5: return;\n" 1481 "default:\n" 1482 " y = 1;\n" 1483 " break;\n" 1484 "}", 1485 Style); 1486 Style.ColumnLimit = 80; 1487 Style.AllowShortCaseLabelsOnASingleLine = false; 1488 Style.IndentCaseLabels = true; 1489 EXPECT_EQ("switch (n) {\n" 1490 " default /*comments*/:\n" 1491 " return true;\n" 1492 " case 0:\n" 1493 " return false;\n" 1494 "}", 1495 format("switch (n) {\n" 1496 "default/*comments*/:\n" 1497 " return true;\n" 1498 "case 0:\n" 1499 " return false;\n" 1500 "}", 1501 Style)); 1502 Style.AllowShortCaseLabelsOnASingleLine = true; 1503 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1504 Style.BraceWrapping.AfterCaseLabel = true; 1505 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1506 EXPECT_EQ("switch (n)\n" 1507 "{\n" 1508 " case 0:\n" 1509 " {\n" 1510 " return false;\n" 1511 " }\n" 1512 " default:\n" 1513 " {\n" 1514 " return true;\n" 1515 " }\n" 1516 "}", 1517 format("switch (n) {\n" 1518 " case 0: {\n" 1519 " return false;\n" 1520 " }\n" 1521 " default:\n" 1522 " {\n" 1523 " return true;\n" 1524 " }\n" 1525 "}", 1526 Style)); 1527 } 1528 1529 TEST_F(FormatTest, FormatsLabels) { 1530 verifyFormat("void f() {\n" 1531 " some_code();\n" 1532 "test_label:\n" 1533 " some_other_code();\n" 1534 " {\n" 1535 " some_more_code();\n" 1536 " another_label:\n" 1537 " some_more_code();\n" 1538 " }\n" 1539 "}"); 1540 verifyFormat("{\n" 1541 " some_code();\n" 1542 "test_label:\n" 1543 " some_other_code();\n" 1544 "}"); 1545 verifyFormat("{\n" 1546 " some_code();\n" 1547 "test_label:;\n" 1548 " int i = 0;\n" 1549 "}"); 1550 FormatStyle Style = getLLVMStyle(); 1551 Style.IndentGotoLabels = false; 1552 verifyFormat("void f() {\n" 1553 " some_code();\n" 1554 "test_label:\n" 1555 " some_other_code();\n" 1556 " {\n" 1557 " some_more_code();\n" 1558 "another_label:\n" 1559 " some_more_code();\n" 1560 " }\n" 1561 "}", 1562 Style); 1563 verifyFormat("{\n" 1564 " some_code();\n" 1565 "test_label:\n" 1566 " some_other_code();\n" 1567 "}", 1568 Style); 1569 verifyFormat("{\n" 1570 " some_code();\n" 1571 "test_label:;\n" 1572 " int i = 0;\n" 1573 "}"); 1574 } 1575 1576 TEST_F(FormatTest, MultiLineControlStatements) { 1577 FormatStyle Style = getLLVMStyle(); 1578 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1579 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; 1580 Style.ColumnLimit = 20; 1581 // Short lines should keep opening brace on same line. 1582 EXPECT_EQ("if (foo) {\n" 1583 " bar();\n" 1584 "}", 1585 format("if(foo){bar();}", Style)); 1586 EXPECT_EQ("if (foo) {\n" 1587 " bar();\n" 1588 "} else {\n" 1589 " baz();\n" 1590 "}", 1591 format("if(foo){bar();}else{baz();}", Style)); 1592 EXPECT_EQ("if (foo && bar) {\n" 1593 " baz();\n" 1594 "}", 1595 format("if(foo&&bar){baz();}", Style)); 1596 EXPECT_EQ("if (foo) {\n" 1597 " bar();\n" 1598 "} else if (baz) {\n" 1599 " quux();\n" 1600 "}", 1601 format("if(foo){bar();}else if(baz){quux();}", Style)); 1602 EXPECT_EQ( 1603 "if (foo) {\n" 1604 " bar();\n" 1605 "} else if (baz) {\n" 1606 " quux();\n" 1607 "} else {\n" 1608 " foobar();\n" 1609 "}", 1610 format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); 1611 EXPECT_EQ("for (;;) {\n" 1612 " foo();\n" 1613 "}", 1614 format("for(;;){foo();}")); 1615 EXPECT_EQ("while (1) {\n" 1616 " foo();\n" 1617 "}", 1618 format("while(1){foo();}", Style)); 1619 EXPECT_EQ("switch (foo) {\n" 1620 "case bar:\n" 1621 " return;\n" 1622 "}", 1623 format("switch(foo){case bar:return;}", Style)); 1624 EXPECT_EQ("try {\n" 1625 " foo();\n" 1626 "} catch (...) {\n" 1627 " bar();\n" 1628 "}", 1629 format("try{foo();}catch(...){bar();}", Style)); 1630 EXPECT_EQ("do {\n" 1631 " foo();\n" 1632 "} while (bar &&\n" 1633 " baz);", 1634 format("do{foo();}while(bar&&baz);", Style)); 1635 // Long lines should put opening brace on new line. 1636 EXPECT_EQ("if (foo && bar &&\n" 1637 " baz)\n" 1638 "{\n" 1639 " quux();\n" 1640 "}", 1641 format("if(foo&&bar&&baz){quux();}", Style)); 1642 EXPECT_EQ("if (foo && bar &&\n" 1643 " baz)\n" 1644 "{\n" 1645 " quux();\n" 1646 "}", 1647 format("if (foo && bar &&\n" 1648 " baz) {\n" 1649 " quux();\n" 1650 "}", 1651 Style)); 1652 EXPECT_EQ("if (foo) {\n" 1653 " bar();\n" 1654 "} else if (baz ||\n" 1655 " quux)\n" 1656 "{\n" 1657 " foobar();\n" 1658 "}", 1659 format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); 1660 EXPECT_EQ( 1661 "if (foo) {\n" 1662 " bar();\n" 1663 "} else if (baz ||\n" 1664 " quux)\n" 1665 "{\n" 1666 " foobar();\n" 1667 "} else {\n" 1668 " barbaz();\n" 1669 "}", 1670 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1671 Style)); 1672 EXPECT_EQ("for (int i = 0;\n" 1673 " i < 10; ++i)\n" 1674 "{\n" 1675 " foo();\n" 1676 "}", 1677 format("for(int i=0;i<10;++i){foo();}", Style)); 1678 EXPECT_EQ("foreach (int i,\n" 1679 " list)\n" 1680 "{\n" 1681 " foo();\n" 1682 "}", 1683 format("foreach(int i, list){foo();}", Style)); 1684 Style.ColumnLimit = 1685 40; // to concentrate at brace wrapping, not line wrap due to column limit 1686 EXPECT_EQ("foreach (int i, list) {\n" 1687 " foo();\n" 1688 "}", 1689 format("foreach(int i, list){foo();}", Style)); 1690 Style.ColumnLimit = 1691 20; // to concentrate at brace wrapping, not line wrap due to column limit 1692 EXPECT_EQ("while (foo || bar ||\n" 1693 " baz)\n" 1694 "{\n" 1695 " quux();\n" 1696 "}", 1697 format("while(foo||bar||baz){quux();}", Style)); 1698 EXPECT_EQ("switch (\n" 1699 " foo = barbaz)\n" 1700 "{\n" 1701 "case quux:\n" 1702 " return;\n" 1703 "}", 1704 format("switch(foo=barbaz){case quux:return;}", Style)); 1705 EXPECT_EQ("try {\n" 1706 " foo();\n" 1707 "} catch (\n" 1708 " Exception &bar)\n" 1709 "{\n" 1710 " baz();\n" 1711 "}", 1712 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1713 Style.ColumnLimit = 1714 40; // to concentrate at brace wrapping, not line wrap due to column limit 1715 EXPECT_EQ("try {\n" 1716 " foo();\n" 1717 "} catch (Exception &bar) {\n" 1718 " baz();\n" 1719 "}", 1720 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1721 Style.ColumnLimit = 1722 20; // to concentrate at brace wrapping, not line wrap due to column limit 1723 1724 Style.BraceWrapping.BeforeElse = true; 1725 EXPECT_EQ( 1726 "if (foo) {\n" 1727 " bar();\n" 1728 "}\n" 1729 "else if (baz ||\n" 1730 " quux)\n" 1731 "{\n" 1732 " foobar();\n" 1733 "}\n" 1734 "else {\n" 1735 " barbaz();\n" 1736 "}", 1737 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1738 Style)); 1739 1740 Style.BraceWrapping.BeforeCatch = true; 1741 EXPECT_EQ("try {\n" 1742 " foo();\n" 1743 "}\n" 1744 "catch (...) {\n" 1745 " baz();\n" 1746 "}", 1747 format("try{foo();}catch(...){baz();}", Style)); 1748 } 1749 1750 TEST_F(FormatTest, BeforeWhile) { 1751 FormatStyle Style = getLLVMStyle(); 1752 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1753 1754 verifyFormat("do {\n" 1755 " foo();\n" 1756 "} while (1);", 1757 Style); 1758 Style.BraceWrapping.BeforeWhile = true; 1759 verifyFormat("do {\n" 1760 " foo();\n" 1761 "}\n" 1762 "while (1);", 1763 Style); 1764 } 1765 1766 //===----------------------------------------------------------------------===// 1767 // Tests for classes, namespaces, etc. 1768 //===----------------------------------------------------------------------===// 1769 1770 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1771 verifyFormat("class A {};"); 1772 } 1773 1774 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1775 verifyFormat("class A {\n" 1776 "public:\n" 1777 "public: // comment\n" 1778 "protected:\n" 1779 "private:\n" 1780 " void f() {}\n" 1781 "};"); 1782 verifyFormat("export class A {\n" 1783 "public:\n" 1784 "public: // comment\n" 1785 "protected:\n" 1786 "private:\n" 1787 " void f() {}\n" 1788 "};"); 1789 verifyGoogleFormat("class A {\n" 1790 " public:\n" 1791 " protected:\n" 1792 " private:\n" 1793 " void f() {}\n" 1794 "};"); 1795 verifyGoogleFormat("export class A {\n" 1796 " public:\n" 1797 " protected:\n" 1798 " private:\n" 1799 " void f() {}\n" 1800 "};"); 1801 verifyFormat("class A {\n" 1802 "public slots:\n" 1803 " void f1() {}\n" 1804 "public Q_SLOTS:\n" 1805 " void f2() {}\n" 1806 "protected slots:\n" 1807 " void f3() {}\n" 1808 "protected Q_SLOTS:\n" 1809 " void f4() {}\n" 1810 "private slots:\n" 1811 " void f5() {}\n" 1812 "private Q_SLOTS:\n" 1813 " void f6() {}\n" 1814 "signals:\n" 1815 " void g1();\n" 1816 "Q_SIGNALS:\n" 1817 " void g2();\n" 1818 "};"); 1819 1820 // Don't interpret 'signals' the wrong way. 1821 verifyFormat("signals.set();"); 1822 verifyFormat("for (Signals signals : f()) {\n}"); 1823 verifyFormat("{\n" 1824 " signals.set(); // This needs indentation.\n" 1825 "}"); 1826 verifyFormat("void f() {\n" 1827 "label:\n" 1828 " signals.baz();\n" 1829 "}"); 1830 } 1831 1832 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1833 EXPECT_EQ("class A {\n" 1834 "public:\n" 1835 " void f();\n" 1836 "\n" 1837 "private:\n" 1838 " void g() {}\n" 1839 " // test\n" 1840 "protected:\n" 1841 " int h;\n" 1842 "};", 1843 format("class A {\n" 1844 "public:\n" 1845 "void f();\n" 1846 "private:\n" 1847 "void g() {}\n" 1848 "// test\n" 1849 "protected:\n" 1850 "int h;\n" 1851 "};")); 1852 EXPECT_EQ("class A {\n" 1853 "protected:\n" 1854 "public:\n" 1855 " void f();\n" 1856 "};", 1857 format("class A {\n" 1858 "protected:\n" 1859 "\n" 1860 "public:\n" 1861 "\n" 1862 " void f();\n" 1863 "};")); 1864 1865 // Even ensure proper spacing inside macros. 1866 EXPECT_EQ("#define B \\\n" 1867 " class A { \\\n" 1868 " protected: \\\n" 1869 " public: \\\n" 1870 " void f(); \\\n" 1871 " };", 1872 format("#define B \\\n" 1873 " class A { \\\n" 1874 " protected: \\\n" 1875 " \\\n" 1876 " public: \\\n" 1877 " \\\n" 1878 " void f(); \\\n" 1879 " };", 1880 getGoogleStyle())); 1881 // But don't remove empty lines after macros ending in access specifiers. 1882 EXPECT_EQ("#define A private:\n" 1883 "\n" 1884 "int i;", 1885 format("#define A private:\n" 1886 "\n" 1887 "int i;")); 1888 } 1889 1890 TEST_F(FormatTest, FormatsClasses) { 1891 verifyFormat("class A : public B {};"); 1892 verifyFormat("class A : public ::B {};"); 1893 1894 verifyFormat( 1895 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1896 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1897 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1898 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1899 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1900 verifyFormat( 1901 "class A : public B, public C, public D, public E, public F {};"); 1902 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1903 " public C,\n" 1904 " public D,\n" 1905 " public E,\n" 1906 " public F,\n" 1907 " public G {};"); 1908 1909 verifyFormat("class\n" 1910 " ReallyReallyLongClassName {\n" 1911 " int i;\n" 1912 "};", 1913 getLLVMStyleWithColumns(32)); 1914 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1915 " aaaaaaaaaaaaaaaa> {};"); 1916 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1917 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1918 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1919 verifyFormat("template <class R, class C>\n" 1920 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1921 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1922 verifyFormat("class ::A::B {};"); 1923 } 1924 1925 TEST_F(FormatTest, BreakInheritanceStyle) { 1926 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1927 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1928 FormatStyle::BILS_BeforeComma; 1929 verifyFormat("class MyClass : public X {};", 1930 StyleWithInheritanceBreakBeforeComma); 1931 verifyFormat("class MyClass\n" 1932 " : public X\n" 1933 " , public Y {};", 1934 StyleWithInheritanceBreakBeforeComma); 1935 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1936 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1937 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1938 StyleWithInheritanceBreakBeforeComma); 1939 verifyFormat("struct aaaaaaaaaaaaa\n" 1940 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1941 " aaaaaaaaaaaaaaaa> {};", 1942 StyleWithInheritanceBreakBeforeComma); 1943 1944 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1945 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1946 FormatStyle::BILS_AfterColon; 1947 verifyFormat("class MyClass : public X {};", 1948 StyleWithInheritanceBreakAfterColon); 1949 verifyFormat("class MyClass : public X, public Y {};", 1950 StyleWithInheritanceBreakAfterColon); 1951 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1952 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1953 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1954 StyleWithInheritanceBreakAfterColon); 1955 verifyFormat("struct aaaaaaaaaaaaa :\n" 1956 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1957 " aaaaaaaaaaaaaaaa> {};", 1958 StyleWithInheritanceBreakAfterColon); 1959 } 1960 1961 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1962 verifyFormat("class A {\n} a, b;"); 1963 verifyFormat("struct A {\n} a, b;"); 1964 verifyFormat("union A {\n} a;"); 1965 } 1966 1967 TEST_F(FormatTest, FormatsEnum) { 1968 verifyFormat("enum {\n" 1969 " Zero,\n" 1970 " One = 1,\n" 1971 " Two = One + 1,\n" 1972 " Three = (One + Two),\n" 1973 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1974 " Five = (One, Two, Three, Four, 5)\n" 1975 "};"); 1976 verifyGoogleFormat("enum {\n" 1977 " Zero,\n" 1978 " One = 1,\n" 1979 " Two = One + 1,\n" 1980 " Three = (One + Two),\n" 1981 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1982 " Five = (One, Two, Three, Four, 5)\n" 1983 "};"); 1984 verifyFormat("enum Enum {};"); 1985 verifyFormat("enum {};"); 1986 verifyFormat("enum X E {} d;"); 1987 verifyFormat("enum __attribute__((...)) E {} d;"); 1988 verifyFormat("enum __declspec__((...)) E {} d;"); 1989 verifyFormat("enum {\n" 1990 " Bar = Foo<int, int>::value\n" 1991 "};", 1992 getLLVMStyleWithColumns(30)); 1993 1994 verifyFormat("enum ShortEnum { A, B, C };"); 1995 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1996 1997 EXPECT_EQ("enum KeepEmptyLines {\n" 1998 " ONE,\n" 1999 "\n" 2000 " TWO,\n" 2001 "\n" 2002 " THREE\n" 2003 "}", 2004 format("enum KeepEmptyLines {\n" 2005 " ONE,\n" 2006 "\n" 2007 " TWO,\n" 2008 "\n" 2009 "\n" 2010 " THREE\n" 2011 "}")); 2012 verifyFormat("enum E { // comment\n" 2013 " ONE,\n" 2014 " TWO\n" 2015 "};\n" 2016 "int i;"); 2017 2018 FormatStyle EightIndent = getLLVMStyle(); 2019 EightIndent.IndentWidth = 8; 2020 verifyFormat("enum {\n" 2021 " VOID,\n" 2022 " CHAR,\n" 2023 " SHORT,\n" 2024 " INT,\n" 2025 " LONG,\n" 2026 " SIGNED,\n" 2027 " UNSIGNED,\n" 2028 " BOOL,\n" 2029 " FLOAT,\n" 2030 " DOUBLE,\n" 2031 " COMPLEX\n" 2032 "};", 2033 EightIndent); 2034 2035 // Not enums. 2036 verifyFormat("enum X f() {\n" 2037 " a();\n" 2038 " return 42;\n" 2039 "}"); 2040 verifyFormat("enum X Type::f() {\n" 2041 " a();\n" 2042 " return 42;\n" 2043 "}"); 2044 verifyFormat("enum ::X f() {\n" 2045 " a();\n" 2046 " return 42;\n" 2047 "}"); 2048 verifyFormat("enum ns::X f() {\n" 2049 " a();\n" 2050 " return 42;\n" 2051 "}"); 2052 } 2053 2054 TEST_F(FormatTest, FormatsEnumsWithErrors) { 2055 verifyFormat("enum Type {\n" 2056 " One = 0; // These semicolons should be commas.\n" 2057 " Two = 1;\n" 2058 "};"); 2059 verifyFormat("namespace n {\n" 2060 "enum Type {\n" 2061 " One,\n" 2062 " Two, // missing };\n" 2063 " int i;\n" 2064 "}\n" 2065 "void g() {}"); 2066 } 2067 2068 TEST_F(FormatTest, FormatsEnumStruct) { 2069 verifyFormat("enum struct {\n" 2070 " Zero,\n" 2071 " One = 1,\n" 2072 " Two = One + 1,\n" 2073 " Three = (One + Two),\n" 2074 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2075 " Five = (One, Two, Three, Four, 5)\n" 2076 "};"); 2077 verifyFormat("enum struct Enum {};"); 2078 verifyFormat("enum struct {};"); 2079 verifyFormat("enum struct X E {} d;"); 2080 verifyFormat("enum struct __attribute__((...)) E {} d;"); 2081 verifyFormat("enum struct __declspec__((...)) E {} d;"); 2082 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 2083 } 2084 2085 TEST_F(FormatTest, FormatsEnumClass) { 2086 verifyFormat("enum class {\n" 2087 " Zero,\n" 2088 " One = 1,\n" 2089 " Two = One + 1,\n" 2090 " Three = (One + Two),\n" 2091 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2092 " Five = (One, Two, Three, Four, 5)\n" 2093 "};"); 2094 verifyFormat("enum class Enum {};"); 2095 verifyFormat("enum class {};"); 2096 verifyFormat("enum class X E {} d;"); 2097 verifyFormat("enum class __attribute__((...)) E {} d;"); 2098 verifyFormat("enum class __declspec__((...)) E {} d;"); 2099 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 2100 } 2101 2102 TEST_F(FormatTest, FormatsEnumTypes) { 2103 verifyFormat("enum X : int {\n" 2104 " A, // Force multiple lines.\n" 2105 " B\n" 2106 "};"); 2107 verifyFormat("enum X : int { A, B };"); 2108 verifyFormat("enum X : std::uint32_t { A, B };"); 2109 } 2110 2111 TEST_F(FormatTest, FormatsTypedefEnum) { 2112 FormatStyle Style = getLLVMStyle(); 2113 Style.ColumnLimit = 40; 2114 verifyFormat("typedef enum {} EmptyEnum;"); 2115 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2116 verifyFormat("typedef enum {\n" 2117 " ZERO = 0,\n" 2118 " ONE = 1,\n" 2119 " TWO = 2,\n" 2120 " THREE = 3\n" 2121 "} LongEnum;", 2122 Style); 2123 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2124 Style.BraceWrapping.AfterEnum = true; 2125 verifyFormat("typedef enum {} EmptyEnum;"); 2126 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2127 verifyFormat("typedef enum\n" 2128 "{\n" 2129 " ZERO = 0,\n" 2130 " ONE = 1,\n" 2131 " TWO = 2,\n" 2132 " THREE = 3\n" 2133 "} LongEnum;", 2134 Style); 2135 } 2136 2137 TEST_F(FormatTest, FormatsNSEnums) { 2138 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2139 verifyGoogleFormat( 2140 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2141 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 2142 " // Information about someDecentlyLongValue.\n" 2143 " someDecentlyLongValue,\n" 2144 " // Information about anotherDecentlyLongValue.\n" 2145 " anotherDecentlyLongValue,\n" 2146 " // Information about aThirdDecentlyLongValue.\n" 2147 " aThirdDecentlyLongValue\n" 2148 "};"); 2149 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 2150 " // Information about someDecentlyLongValue.\n" 2151 " someDecentlyLongValue,\n" 2152 " // Information about anotherDecentlyLongValue.\n" 2153 " anotherDecentlyLongValue,\n" 2154 " // Information about aThirdDecentlyLongValue.\n" 2155 " aThirdDecentlyLongValue\n" 2156 "};"); 2157 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 2158 " a = 1,\n" 2159 " b = 2,\n" 2160 " c = 3,\n" 2161 "};"); 2162 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 2163 " a = 1,\n" 2164 " b = 2,\n" 2165 " c = 3,\n" 2166 "};"); 2167 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 2168 " a = 1,\n" 2169 " b = 2,\n" 2170 " c = 3,\n" 2171 "};"); 2172 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 2173 " a = 1,\n" 2174 " b = 2,\n" 2175 " c = 3,\n" 2176 "};"); 2177 } 2178 2179 TEST_F(FormatTest, FormatsBitfields) { 2180 verifyFormat("struct Bitfields {\n" 2181 " unsigned sClass : 8;\n" 2182 " unsigned ValueKind : 2;\n" 2183 "};"); 2184 verifyFormat("struct A {\n" 2185 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 2186 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 2187 "};"); 2188 verifyFormat("struct MyStruct {\n" 2189 " uchar data;\n" 2190 " uchar : 8;\n" 2191 " uchar : 8;\n" 2192 " uchar other;\n" 2193 "};"); 2194 FormatStyle Style = getLLVMStyle(); 2195 Style.BitFieldColonSpacing = FormatStyle::BFCS_None; 2196 verifyFormat("struct Bitfields {\n" 2197 " unsigned sClass:8;\n" 2198 " unsigned ValueKind:2;\n" 2199 " uchar other;\n" 2200 "};", 2201 Style); 2202 verifyFormat("struct A {\n" 2203 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:1,\n" 2204 " bbbbbbbbbbbbbbbbbbbbbbbbb:2;\n" 2205 "};", 2206 Style); 2207 Style.BitFieldColonSpacing = FormatStyle::BFCS_Before; 2208 verifyFormat("struct Bitfields {\n" 2209 " unsigned sClass :8;\n" 2210 " unsigned ValueKind :2;\n" 2211 " uchar other;\n" 2212 "};", 2213 Style); 2214 Style.BitFieldColonSpacing = FormatStyle::BFCS_After; 2215 verifyFormat("struct Bitfields {\n" 2216 " unsigned sClass: 8;\n" 2217 " unsigned ValueKind: 2;\n" 2218 " uchar other;\n" 2219 "};", 2220 Style); 2221 } 2222 2223 TEST_F(FormatTest, FormatsNamespaces) { 2224 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 2225 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 2226 2227 verifyFormat("namespace some_namespace {\n" 2228 "class A {};\n" 2229 "void f() { f(); }\n" 2230 "}", 2231 LLVMWithNoNamespaceFix); 2232 verifyFormat("namespace N::inline D {\n" 2233 "class A {};\n" 2234 "void f() { f(); }\n" 2235 "}", 2236 LLVMWithNoNamespaceFix); 2237 verifyFormat("namespace N::inline D::E {\n" 2238 "class A {};\n" 2239 "void f() { f(); }\n" 2240 "}", 2241 LLVMWithNoNamespaceFix); 2242 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 2243 "class A {};\n" 2244 "void f() { f(); }\n" 2245 "}", 2246 LLVMWithNoNamespaceFix); 2247 verifyFormat("/* something */ namespace some_namespace {\n" 2248 "class A {};\n" 2249 "void f() { f(); }\n" 2250 "}", 2251 LLVMWithNoNamespaceFix); 2252 verifyFormat("namespace {\n" 2253 "class A {};\n" 2254 "void f() { f(); }\n" 2255 "}", 2256 LLVMWithNoNamespaceFix); 2257 verifyFormat("/* something */ namespace {\n" 2258 "class A {};\n" 2259 "void f() { f(); }\n" 2260 "}", 2261 LLVMWithNoNamespaceFix); 2262 verifyFormat("inline namespace X {\n" 2263 "class A {};\n" 2264 "void f() { f(); }\n" 2265 "}", 2266 LLVMWithNoNamespaceFix); 2267 verifyFormat("/* something */ inline namespace X {\n" 2268 "class A {};\n" 2269 "void f() { f(); }\n" 2270 "}", 2271 LLVMWithNoNamespaceFix); 2272 verifyFormat("export namespace X {\n" 2273 "class A {};\n" 2274 "void f() { f(); }\n" 2275 "}", 2276 LLVMWithNoNamespaceFix); 2277 verifyFormat("using namespace some_namespace;\n" 2278 "class A {};\n" 2279 "void f() { f(); }", 2280 LLVMWithNoNamespaceFix); 2281 2282 // This code is more common than we thought; if we 2283 // layout this correctly the semicolon will go into 2284 // its own line, which is undesirable. 2285 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 2286 verifyFormat("namespace {\n" 2287 "class A {};\n" 2288 "};", 2289 LLVMWithNoNamespaceFix); 2290 2291 verifyFormat("namespace {\n" 2292 "int SomeVariable = 0; // comment\n" 2293 "} // namespace", 2294 LLVMWithNoNamespaceFix); 2295 EXPECT_EQ("#ifndef HEADER_GUARD\n" 2296 "#define HEADER_GUARD\n" 2297 "namespace my_namespace {\n" 2298 "int i;\n" 2299 "} // my_namespace\n" 2300 "#endif // HEADER_GUARD", 2301 format("#ifndef HEADER_GUARD\n" 2302 " #define HEADER_GUARD\n" 2303 " namespace my_namespace {\n" 2304 "int i;\n" 2305 "} // my_namespace\n" 2306 "#endif // HEADER_GUARD", 2307 LLVMWithNoNamespaceFix)); 2308 2309 EXPECT_EQ("namespace A::B {\n" 2310 "class C {};\n" 2311 "}", 2312 format("namespace A::B {\n" 2313 "class C {};\n" 2314 "}", 2315 LLVMWithNoNamespaceFix)); 2316 2317 FormatStyle Style = getLLVMStyle(); 2318 Style.NamespaceIndentation = FormatStyle::NI_All; 2319 EXPECT_EQ("namespace out {\n" 2320 " int i;\n" 2321 " namespace in {\n" 2322 " int i;\n" 2323 " } // namespace in\n" 2324 "} // namespace out", 2325 format("namespace out {\n" 2326 "int i;\n" 2327 "namespace in {\n" 2328 "int i;\n" 2329 "} // namespace in\n" 2330 "} // namespace out", 2331 Style)); 2332 2333 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2334 EXPECT_EQ("namespace out {\n" 2335 "int i;\n" 2336 "namespace in {\n" 2337 " int i;\n" 2338 "} // namespace in\n" 2339 "} // namespace out", 2340 format("namespace out {\n" 2341 "int i;\n" 2342 "namespace in {\n" 2343 "int i;\n" 2344 "} // namespace in\n" 2345 "} // namespace out", 2346 Style)); 2347 } 2348 2349 TEST_F(FormatTest, NamespaceMacros) { 2350 FormatStyle Style = getLLVMStyle(); 2351 Style.NamespaceMacros.push_back("TESTSUITE"); 2352 2353 verifyFormat("TESTSUITE(A) {\n" 2354 "int foo();\n" 2355 "} // TESTSUITE(A)", 2356 Style); 2357 2358 verifyFormat("TESTSUITE(A, B) {\n" 2359 "int foo();\n" 2360 "} // TESTSUITE(A)", 2361 Style); 2362 2363 // Properly indent according to NamespaceIndentation style 2364 Style.NamespaceIndentation = FormatStyle::NI_All; 2365 verifyFormat("TESTSUITE(A) {\n" 2366 " int foo();\n" 2367 "} // TESTSUITE(A)", 2368 Style); 2369 verifyFormat("TESTSUITE(A) {\n" 2370 " namespace B {\n" 2371 " int foo();\n" 2372 " } // namespace B\n" 2373 "} // TESTSUITE(A)", 2374 Style); 2375 verifyFormat("namespace A {\n" 2376 " TESTSUITE(B) {\n" 2377 " int foo();\n" 2378 " } // TESTSUITE(B)\n" 2379 "} // namespace A", 2380 Style); 2381 2382 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2383 verifyFormat("TESTSUITE(A) {\n" 2384 "TESTSUITE(B) {\n" 2385 " int foo();\n" 2386 "} // TESTSUITE(B)\n" 2387 "} // TESTSUITE(A)", 2388 Style); 2389 verifyFormat("TESTSUITE(A) {\n" 2390 "namespace B {\n" 2391 " int foo();\n" 2392 "} // namespace B\n" 2393 "} // TESTSUITE(A)", 2394 Style); 2395 verifyFormat("namespace A {\n" 2396 "TESTSUITE(B) {\n" 2397 " int foo();\n" 2398 "} // TESTSUITE(B)\n" 2399 "} // namespace A", 2400 Style); 2401 2402 // Properly merge namespace-macros blocks in CompactNamespaces mode 2403 Style.NamespaceIndentation = FormatStyle::NI_None; 2404 Style.CompactNamespaces = true; 2405 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2406 "}} // TESTSUITE(A::B)", 2407 Style); 2408 2409 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2410 "}} // TESTSUITE(out::in)", 2411 format("TESTSUITE(out) {\n" 2412 "TESTSUITE(in) {\n" 2413 "} // TESTSUITE(in)\n" 2414 "} // TESTSUITE(out)", 2415 Style)); 2416 2417 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2418 "}} // TESTSUITE(out::in)", 2419 format("TESTSUITE(out) {\n" 2420 "TESTSUITE(in) {\n" 2421 "} // TESTSUITE(in)\n" 2422 "} // TESTSUITE(out)", 2423 Style)); 2424 2425 // Do not merge different namespaces/macros 2426 EXPECT_EQ("namespace out {\n" 2427 "TESTSUITE(in) {\n" 2428 "} // TESTSUITE(in)\n" 2429 "} // namespace out", 2430 format("namespace out {\n" 2431 "TESTSUITE(in) {\n" 2432 "} // TESTSUITE(in)\n" 2433 "} // namespace out", 2434 Style)); 2435 EXPECT_EQ("TESTSUITE(out) {\n" 2436 "namespace in {\n" 2437 "} // namespace in\n" 2438 "} // TESTSUITE(out)", 2439 format("TESTSUITE(out) {\n" 2440 "namespace in {\n" 2441 "} // namespace in\n" 2442 "} // TESTSUITE(out)", 2443 Style)); 2444 Style.NamespaceMacros.push_back("FOOBAR"); 2445 EXPECT_EQ("TESTSUITE(out) {\n" 2446 "FOOBAR(in) {\n" 2447 "} // FOOBAR(in)\n" 2448 "} // TESTSUITE(out)", 2449 format("TESTSUITE(out) {\n" 2450 "FOOBAR(in) {\n" 2451 "} // FOOBAR(in)\n" 2452 "} // TESTSUITE(out)", 2453 Style)); 2454 } 2455 2456 TEST_F(FormatTest, FormatsCompactNamespaces) { 2457 FormatStyle Style = getLLVMStyle(); 2458 Style.CompactNamespaces = true; 2459 Style.NamespaceMacros.push_back("TESTSUITE"); 2460 2461 verifyFormat("namespace A { namespace B {\n" 2462 "}} // namespace A::B", 2463 Style); 2464 2465 EXPECT_EQ("namespace out { namespace in {\n" 2466 "}} // namespace out::in", 2467 format("namespace out {\n" 2468 "namespace in {\n" 2469 "} // namespace in\n" 2470 "} // namespace out", 2471 Style)); 2472 2473 // Only namespaces which have both consecutive opening and end get compacted 2474 EXPECT_EQ("namespace out {\n" 2475 "namespace in1 {\n" 2476 "} // namespace in1\n" 2477 "namespace in2 {\n" 2478 "} // namespace in2\n" 2479 "} // namespace out", 2480 format("namespace out {\n" 2481 "namespace in1 {\n" 2482 "} // namespace in1\n" 2483 "namespace in2 {\n" 2484 "} // namespace in2\n" 2485 "} // namespace out", 2486 Style)); 2487 2488 EXPECT_EQ("namespace out {\n" 2489 "int i;\n" 2490 "namespace in {\n" 2491 "int j;\n" 2492 "} // namespace in\n" 2493 "int k;\n" 2494 "} // namespace out", 2495 format("namespace out { int i;\n" 2496 "namespace in { int j; } // namespace in\n" 2497 "int k; } // namespace out", 2498 Style)); 2499 2500 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2501 "}}} // namespace A::B::C\n", 2502 format("namespace A { namespace B {\n" 2503 "namespace C {\n" 2504 "}} // namespace B::C\n" 2505 "} // namespace A\n", 2506 Style)); 2507 2508 Style.ColumnLimit = 40; 2509 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2510 "namespace bbbbbbbbbb {\n" 2511 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2512 format("namespace aaaaaaaaaa {\n" 2513 "namespace bbbbbbbbbb {\n" 2514 "} // namespace bbbbbbbbbb\n" 2515 "} // namespace aaaaaaaaaa", 2516 Style)); 2517 2518 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2519 "namespace cccccc {\n" 2520 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2521 format("namespace aaaaaa {\n" 2522 "namespace bbbbbb {\n" 2523 "namespace cccccc {\n" 2524 "} // namespace cccccc\n" 2525 "} // namespace bbbbbb\n" 2526 "} // namespace aaaaaa", 2527 Style)); 2528 Style.ColumnLimit = 80; 2529 2530 // Extra semicolon after 'inner' closing brace prevents merging 2531 EXPECT_EQ("namespace out { namespace in {\n" 2532 "}; } // namespace out::in", 2533 format("namespace out {\n" 2534 "namespace in {\n" 2535 "}; // namespace in\n" 2536 "} // namespace out", 2537 Style)); 2538 2539 // Extra semicolon after 'outer' closing brace is conserved 2540 EXPECT_EQ("namespace out { namespace in {\n" 2541 "}}; // namespace out::in", 2542 format("namespace out {\n" 2543 "namespace in {\n" 2544 "} // namespace in\n" 2545 "}; // namespace out", 2546 Style)); 2547 2548 Style.NamespaceIndentation = FormatStyle::NI_All; 2549 EXPECT_EQ("namespace out { namespace in {\n" 2550 " int i;\n" 2551 "}} // namespace out::in", 2552 format("namespace out {\n" 2553 "namespace in {\n" 2554 "int i;\n" 2555 "} // namespace in\n" 2556 "} // namespace out", 2557 Style)); 2558 EXPECT_EQ("namespace out { namespace mid {\n" 2559 " namespace in {\n" 2560 " int j;\n" 2561 " } // namespace in\n" 2562 " int k;\n" 2563 "}} // namespace out::mid", 2564 format("namespace out { namespace mid {\n" 2565 "namespace in { int j; } // namespace in\n" 2566 "int k; }} // namespace out::mid", 2567 Style)); 2568 2569 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2570 EXPECT_EQ("namespace out { namespace in {\n" 2571 " int i;\n" 2572 "}} // namespace out::in", 2573 format("namespace out {\n" 2574 "namespace in {\n" 2575 "int i;\n" 2576 "} // namespace in\n" 2577 "} // namespace out", 2578 Style)); 2579 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2580 " int i;\n" 2581 "}}} // namespace out::mid::in", 2582 format("namespace out {\n" 2583 "namespace mid {\n" 2584 "namespace in {\n" 2585 "int i;\n" 2586 "} // namespace in\n" 2587 "} // namespace mid\n" 2588 "} // namespace out", 2589 Style)); 2590 } 2591 2592 TEST_F(FormatTest, FormatsExternC) { 2593 verifyFormat("extern \"C\" {\nint a;"); 2594 verifyFormat("extern \"C\" {}"); 2595 verifyFormat("extern \"C\" {\n" 2596 "int foo();\n" 2597 "}"); 2598 verifyFormat("extern \"C\" int foo() {}"); 2599 verifyFormat("extern \"C\" int foo();"); 2600 verifyFormat("extern \"C\" int foo() {\n" 2601 " int i = 42;\n" 2602 " return i;\n" 2603 "}"); 2604 2605 FormatStyle Style = getLLVMStyle(); 2606 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2607 Style.BraceWrapping.AfterFunction = true; 2608 verifyFormat("extern \"C\" int foo() {}", Style); 2609 verifyFormat("extern \"C\" int foo();", Style); 2610 verifyFormat("extern \"C\" int foo()\n" 2611 "{\n" 2612 " int i = 42;\n" 2613 " return i;\n" 2614 "}", 2615 Style); 2616 2617 Style.BraceWrapping.AfterExternBlock = true; 2618 Style.BraceWrapping.SplitEmptyRecord = false; 2619 verifyFormat("extern \"C\"\n" 2620 "{}", 2621 Style); 2622 verifyFormat("extern \"C\"\n" 2623 "{\n" 2624 " int foo();\n" 2625 "}", 2626 Style); 2627 } 2628 2629 TEST_F(FormatTest, IndentExternBlockStyle) { 2630 FormatStyle Style = getLLVMStyle(); 2631 Style.IndentWidth = 2; 2632 2633 Style.IndentExternBlock = FormatStyle::IEBS_Indent; 2634 verifyFormat("extern \"C\" { /*9*/\n}", Style); 2635 verifyFormat("extern \"C\" {\n" 2636 " int foo10();\n" 2637 "}", 2638 Style); 2639 2640 Style.IndentExternBlock = FormatStyle::IEBS_NoIndent; 2641 verifyFormat("extern \"C\" { /*11*/\n}", Style); 2642 verifyFormat("extern \"C\" {\n" 2643 "int foo12();\n" 2644 "}", 2645 Style); 2646 2647 Style.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock; 2648 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2649 Style.BraceWrapping.AfterExternBlock = true; 2650 verifyFormat("extern \"C\"\n{ /*13*/\n}", Style); 2651 verifyFormat("extern \"C\"\n{\n" 2652 " int foo14();\n" 2653 "}", 2654 Style); 2655 2656 Style.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock; 2657 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2658 Style.BraceWrapping.AfterExternBlock = false; 2659 verifyFormat("extern \"C\" { /*15*/\n}", Style); 2660 verifyFormat("extern \"C\" {\n" 2661 "int foo16();\n" 2662 "}", 2663 Style); 2664 } 2665 2666 TEST_F(FormatTest, FormatsInlineASM) { 2667 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2668 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2669 verifyFormat( 2670 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2671 " \"cpuid\\n\\t\"\n" 2672 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2673 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2674 " : \"a\"(value));"); 2675 EXPECT_EQ( 2676 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2677 " __asm {\n" 2678 " mov edx,[that] // vtable in edx\n" 2679 " mov eax,methodIndex\n" 2680 " call [edx][eax*4] // stdcall\n" 2681 " }\n" 2682 "}", 2683 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2684 " __asm {\n" 2685 " mov edx,[that] // vtable in edx\n" 2686 " mov eax,methodIndex\n" 2687 " call [edx][eax*4] // stdcall\n" 2688 " }\n" 2689 "}")); 2690 EXPECT_EQ("_asm {\n" 2691 " xor eax, eax;\n" 2692 " cpuid;\n" 2693 "}", 2694 format("_asm {\n" 2695 " xor eax, eax;\n" 2696 " cpuid;\n" 2697 "}")); 2698 verifyFormat("void function() {\n" 2699 " // comment\n" 2700 " asm(\"\");\n" 2701 "}"); 2702 EXPECT_EQ("__asm {\n" 2703 "}\n" 2704 "int i;", 2705 format("__asm {\n" 2706 "}\n" 2707 "int i;")); 2708 } 2709 2710 TEST_F(FormatTest, FormatTryCatch) { 2711 verifyFormat("try {\n" 2712 " throw a * b;\n" 2713 "} catch (int a) {\n" 2714 " // Do nothing.\n" 2715 "} catch (...) {\n" 2716 " exit(42);\n" 2717 "}"); 2718 2719 // Function-level try statements. 2720 verifyFormat("int f() try { return 4; } catch (...) {\n" 2721 " return 5;\n" 2722 "}"); 2723 verifyFormat("class A {\n" 2724 " int a;\n" 2725 " A() try : a(0) {\n" 2726 " } catch (...) {\n" 2727 " throw;\n" 2728 " }\n" 2729 "};\n"); 2730 verifyFormat("class A {\n" 2731 " int a;\n" 2732 " A() try : a(0), b{1} {\n" 2733 " } catch (...) {\n" 2734 " throw;\n" 2735 " }\n" 2736 "};\n"); 2737 verifyFormat("class A {\n" 2738 " int a;\n" 2739 " A() try : a(0), b{1}, c{2} {\n" 2740 " } catch (...) {\n" 2741 " throw;\n" 2742 " }\n" 2743 "};\n"); 2744 verifyFormat("class A {\n" 2745 " int a;\n" 2746 " A() try : a(0), b{1}, c{2} {\n" 2747 " { // New scope.\n" 2748 " }\n" 2749 " } catch (...) {\n" 2750 " throw;\n" 2751 " }\n" 2752 "};\n"); 2753 2754 // Incomplete try-catch blocks. 2755 verifyIncompleteFormat("try {} catch ("); 2756 } 2757 2758 TEST_F(FormatTest, FormatTryAsAVariable) { 2759 verifyFormat("int try;"); 2760 verifyFormat("int try, size;"); 2761 verifyFormat("try = foo();"); 2762 verifyFormat("if (try < size) {\n return true;\n}"); 2763 2764 verifyFormat("int catch;"); 2765 verifyFormat("int catch, size;"); 2766 verifyFormat("catch = foo();"); 2767 verifyFormat("if (catch < size) {\n return true;\n}"); 2768 2769 FormatStyle Style = getLLVMStyle(); 2770 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2771 Style.BraceWrapping.AfterFunction = true; 2772 Style.BraceWrapping.BeforeCatch = true; 2773 verifyFormat("try {\n" 2774 " int bar = 1;\n" 2775 "}\n" 2776 "catch (...) {\n" 2777 " int bar = 1;\n" 2778 "}", 2779 Style); 2780 verifyFormat("#if NO_EX\n" 2781 "try\n" 2782 "#endif\n" 2783 "{\n" 2784 "}\n" 2785 "#if NO_EX\n" 2786 "catch (...) {\n" 2787 "}", 2788 Style); 2789 verifyFormat("try /* abc */ {\n" 2790 " int bar = 1;\n" 2791 "}\n" 2792 "catch (...) {\n" 2793 " int bar = 1;\n" 2794 "}", 2795 Style); 2796 verifyFormat("try\n" 2797 "// abc\n" 2798 "{\n" 2799 " int bar = 1;\n" 2800 "}\n" 2801 "catch (...) {\n" 2802 " int bar = 1;\n" 2803 "}", 2804 Style); 2805 } 2806 2807 TEST_F(FormatTest, FormatSEHTryCatch) { 2808 verifyFormat("__try {\n" 2809 " int a = b * c;\n" 2810 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2811 " // Do nothing.\n" 2812 "}"); 2813 2814 verifyFormat("__try {\n" 2815 " int a = b * c;\n" 2816 "} __finally {\n" 2817 " // Do nothing.\n" 2818 "}"); 2819 2820 verifyFormat("DEBUG({\n" 2821 " __try {\n" 2822 " } __finally {\n" 2823 " }\n" 2824 "});\n"); 2825 } 2826 2827 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2828 verifyFormat("try {\n" 2829 " f();\n" 2830 "} catch {\n" 2831 " g();\n" 2832 "}"); 2833 verifyFormat("try {\n" 2834 " f();\n" 2835 "} catch (A a) MACRO(x) {\n" 2836 " g();\n" 2837 "} catch (B b) MACRO(x) {\n" 2838 " g();\n" 2839 "}"); 2840 } 2841 2842 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2843 FormatStyle Style = getLLVMStyle(); 2844 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2845 FormatStyle::BS_WebKit}) { 2846 Style.BreakBeforeBraces = BraceStyle; 2847 verifyFormat("try {\n" 2848 " // something\n" 2849 "} catch (...) {\n" 2850 " // something\n" 2851 "}", 2852 Style); 2853 } 2854 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2855 verifyFormat("try {\n" 2856 " // something\n" 2857 "}\n" 2858 "catch (...) {\n" 2859 " // something\n" 2860 "}", 2861 Style); 2862 verifyFormat("__try {\n" 2863 " // something\n" 2864 "}\n" 2865 "__finally {\n" 2866 " // something\n" 2867 "}", 2868 Style); 2869 verifyFormat("@try {\n" 2870 " // something\n" 2871 "}\n" 2872 "@finally {\n" 2873 " // something\n" 2874 "}", 2875 Style); 2876 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2877 verifyFormat("try\n" 2878 "{\n" 2879 " // something\n" 2880 "}\n" 2881 "catch (...)\n" 2882 "{\n" 2883 " // something\n" 2884 "}", 2885 Style); 2886 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2887 verifyFormat("try\n" 2888 " {\n" 2889 " // something white\n" 2890 " }\n" 2891 "catch (...)\n" 2892 " {\n" 2893 " // something white\n" 2894 " }", 2895 Style); 2896 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2897 verifyFormat("try\n" 2898 " {\n" 2899 " // something\n" 2900 " }\n" 2901 "catch (...)\n" 2902 " {\n" 2903 " // something\n" 2904 " }", 2905 Style); 2906 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2907 Style.BraceWrapping.BeforeCatch = true; 2908 verifyFormat("try {\n" 2909 " // something\n" 2910 "}\n" 2911 "catch (...) {\n" 2912 " // something\n" 2913 "}", 2914 Style); 2915 } 2916 2917 TEST_F(FormatTest, StaticInitializers) { 2918 verifyFormat("static SomeClass SC = {1, 'a'};"); 2919 2920 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2921 " 100000000, " 2922 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2923 2924 // Here, everything other than the "}" would fit on a line. 2925 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2926 " 10000000000000000000000000};"); 2927 EXPECT_EQ("S s = {a,\n" 2928 "\n" 2929 " b};", 2930 format("S s = {\n" 2931 " a,\n" 2932 "\n" 2933 " b\n" 2934 "};")); 2935 2936 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2937 // line. However, the formatting looks a bit off and this probably doesn't 2938 // happen often in practice. 2939 verifyFormat("static int Variable[1] = {\n" 2940 " {1000000000000000000000000000000000000}};", 2941 getLLVMStyleWithColumns(40)); 2942 } 2943 2944 TEST_F(FormatTest, DesignatedInitializers) { 2945 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2946 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2947 " .bbbbbbbbbb = 2,\n" 2948 " .cccccccccc = 3,\n" 2949 " .dddddddddd = 4,\n" 2950 " .eeeeeeeeee = 5};"); 2951 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2952 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2953 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2954 " .ccccccccccccccccccccccccccc = 3,\n" 2955 " .ddddddddddddddddddddddddddd = 4,\n" 2956 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2957 2958 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2959 2960 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2961 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2962 " [2] = bbbbbbbbbb,\n" 2963 " [3] = cccccccccc,\n" 2964 " [4] = dddddddddd,\n" 2965 " [5] = eeeeeeeeee};"); 2966 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2967 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2968 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2969 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2970 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2971 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2972 } 2973 2974 TEST_F(FormatTest, NestedStaticInitializers) { 2975 verifyFormat("static A x = {{{}}};\n"); 2976 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2977 " {init1, init2, init3, init4}}};", 2978 getLLVMStyleWithColumns(50)); 2979 2980 verifyFormat("somes Status::global_reps[3] = {\n" 2981 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2982 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2983 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2984 getLLVMStyleWithColumns(60)); 2985 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2986 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2987 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2988 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2989 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2990 " {rect.fRight - rect.fLeft, rect.fBottom - " 2991 "rect.fTop}};"); 2992 2993 verifyFormat( 2994 "SomeArrayOfSomeType a = {\n" 2995 " {{1, 2, 3},\n" 2996 " {1, 2, 3},\n" 2997 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2998 " 333333333333333333333333333333},\n" 2999 " {1, 2, 3},\n" 3000 " {1, 2, 3}}};"); 3001 verifyFormat( 3002 "SomeArrayOfSomeType a = {\n" 3003 " {{1, 2, 3}},\n" 3004 " {{1, 2, 3}},\n" 3005 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 3006 " 333333333333333333333333333333}},\n" 3007 " {{1, 2, 3}},\n" 3008 " {{1, 2, 3}}};"); 3009 3010 verifyFormat("struct {\n" 3011 " unsigned bit;\n" 3012 " const char *const name;\n" 3013 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 3014 " {kOsWin, \"Windows\"},\n" 3015 " {kOsLinux, \"Linux\"},\n" 3016 " {kOsCrOS, \"Chrome OS\"}};"); 3017 verifyFormat("struct {\n" 3018 " unsigned bit;\n" 3019 " const char *const name;\n" 3020 "} kBitsToOs[] = {\n" 3021 " {kOsMac, \"Mac\"},\n" 3022 " {kOsWin, \"Windows\"},\n" 3023 " {kOsLinux, \"Linux\"},\n" 3024 " {kOsCrOS, \"Chrome OS\"},\n" 3025 "};"); 3026 } 3027 3028 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 3029 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3030 " \\\n" 3031 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 3032 } 3033 3034 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 3035 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 3036 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 3037 3038 // Do break defaulted and deleted functions. 3039 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 3040 " default;", 3041 getLLVMStyleWithColumns(40)); 3042 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 3043 " delete;", 3044 getLLVMStyleWithColumns(40)); 3045 } 3046 3047 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 3048 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 3049 getLLVMStyleWithColumns(40)); 3050 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 3051 getLLVMStyleWithColumns(40)); 3052 EXPECT_EQ("#define Q \\\n" 3053 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 3054 " \"aaaaaaaa.cpp\"", 3055 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 3056 getLLVMStyleWithColumns(40))); 3057 } 3058 3059 TEST_F(FormatTest, UnderstandsLinePPDirective) { 3060 EXPECT_EQ("# 123 \"A string literal\"", 3061 format(" # 123 \"A string literal\"")); 3062 } 3063 3064 TEST_F(FormatTest, LayoutUnknownPPDirective) { 3065 EXPECT_EQ("#;", format("#;")); 3066 verifyFormat("#\n;\n;\n;"); 3067 } 3068 3069 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 3070 EXPECT_EQ("#line 42 \"test\"\n", 3071 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 3072 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 3073 getLLVMStyleWithColumns(12))); 3074 } 3075 3076 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 3077 EXPECT_EQ("#line 42 \"test\"", 3078 format("# \\\n line \\\n 42 \\\n \"test\"")); 3079 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 3080 } 3081 3082 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 3083 verifyFormat("#define A \\x20"); 3084 verifyFormat("#define A \\ x20"); 3085 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 3086 verifyFormat("#define A ''"); 3087 verifyFormat("#define A ''qqq"); 3088 verifyFormat("#define A `qqq"); 3089 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 3090 EXPECT_EQ("const char *c = STRINGIFY(\n" 3091 "\\na : b);", 3092 format("const char * c = STRINGIFY(\n" 3093 "\\na : b);")); 3094 3095 verifyFormat("a\r\\"); 3096 verifyFormat("a\v\\"); 3097 verifyFormat("a\f\\"); 3098 } 3099 3100 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 3101 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 3102 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 3103 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 3104 // FIXME: We never break before the macro name. 3105 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 3106 3107 verifyFormat("#define A A\n#define A A"); 3108 verifyFormat("#define A(X) A\n#define A A"); 3109 3110 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 3111 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 3112 } 3113 3114 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 3115 EXPECT_EQ("// somecomment\n" 3116 "#include \"a.h\"\n" 3117 "#define A( \\\n" 3118 " A, B)\n" 3119 "#include \"b.h\"\n" 3120 "// somecomment\n", 3121 format(" // somecomment\n" 3122 " #include \"a.h\"\n" 3123 "#define A(A,\\\n" 3124 " B)\n" 3125 " #include \"b.h\"\n" 3126 " // somecomment\n", 3127 getLLVMStyleWithColumns(13))); 3128 } 3129 3130 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 3131 3132 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 3133 EXPECT_EQ("#define A \\\n" 3134 " c; \\\n" 3135 " e;\n" 3136 "f;", 3137 format("#define A c; e;\n" 3138 "f;", 3139 getLLVMStyleWithColumns(14))); 3140 } 3141 3142 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 3143 3144 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 3145 EXPECT_EQ("int x,\n" 3146 "#define A\n" 3147 " y;", 3148 format("int x,\n#define A\ny;")); 3149 } 3150 3151 TEST_F(FormatTest, HashInMacroDefinition) { 3152 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 3153 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 3154 verifyFormat("#define A \\\n" 3155 " { \\\n" 3156 " f(#c); \\\n" 3157 " }", 3158 getLLVMStyleWithColumns(11)); 3159 3160 verifyFormat("#define A(X) \\\n" 3161 " void function##X()", 3162 getLLVMStyleWithColumns(22)); 3163 3164 verifyFormat("#define A(a, b, c) \\\n" 3165 " void a##b##c()", 3166 getLLVMStyleWithColumns(22)); 3167 3168 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 3169 } 3170 3171 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 3172 EXPECT_EQ("#define A (x)", format("#define A (x)")); 3173 EXPECT_EQ("#define A(x)", format("#define A(x)")); 3174 3175 FormatStyle Style = getLLVMStyle(); 3176 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 3177 verifyFormat("#define true ((foo)1)", Style); 3178 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 3179 verifyFormat("#define false((foo)0)", Style); 3180 } 3181 3182 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 3183 EXPECT_EQ("#define A b;", format("#define A \\\n" 3184 " \\\n" 3185 " b;", 3186 getLLVMStyleWithColumns(25))); 3187 EXPECT_EQ("#define A \\\n" 3188 " \\\n" 3189 " a; \\\n" 3190 " b;", 3191 format("#define A \\\n" 3192 " \\\n" 3193 " a; \\\n" 3194 " b;", 3195 getLLVMStyleWithColumns(11))); 3196 EXPECT_EQ("#define A \\\n" 3197 " a; \\\n" 3198 " \\\n" 3199 " b;", 3200 format("#define A \\\n" 3201 " a; \\\n" 3202 " \\\n" 3203 " b;", 3204 getLLVMStyleWithColumns(11))); 3205 } 3206 3207 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 3208 verifyIncompleteFormat("#define A :"); 3209 verifyFormat("#define SOMECASES \\\n" 3210 " case 1: \\\n" 3211 " case 2\n", 3212 getLLVMStyleWithColumns(20)); 3213 verifyFormat("#define MACRO(a) \\\n" 3214 " if (a) \\\n" 3215 " f(); \\\n" 3216 " else \\\n" 3217 " g()", 3218 getLLVMStyleWithColumns(18)); 3219 verifyFormat("#define A template <typename T>"); 3220 verifyIncompleteFormat("#define STR(x) #x\n" 3221 "f(STR(this_is_a_string_literal{));"); 3222 verifyFormat("#pragma omp threadprivate( \\\n" 3223 " y)), // expected-warning", 3224 getLLVMStyleWithColumns(28)); 3225 verifyFormat("#d, = };"); 3226 verifyFormat("#if \"a"); 3227 verifyIncompleteFormat("({\n" 3228 "#define b \\\n" 3229 " } \\\n" 3230 " a\n" 3231 "a", 3232 getLLVMStyleWithColumns(15)); 3233 verifyFormat("#define A \\\n" 3234 " { \\\n" 3235 " {\n" 3236 "#define B \\\n" 3237 " } \\\n" 3238 " }", 3239 getLLVMStyleWithColumns(15)); 3240 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 3241 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 3242 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 3243 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 3244 } 3245 3246 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 3247 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 3248 EXPECT_EQ("class A : public QObject {\n" 3249 " Q_OBJECT\n" 3250 "\n" 3251 " A() {}\n" 3252 "};", 3253 format("class A : public QObject {\n" 3254 " Q_OBJECT\n" 3255 "\n" 3256 " A() {\n}\n" 3257 "} ;")); 3258 EXPECT_EQ("MACRO\n" 3259 "/*static*/ int i;", 3260 format("MACRO\n" 3261 " /*static*/ int i;")); 3262 EXPECT_EQ("SOME_MACRO\n" 3263 "namespace {\n" 3264 "void f();\n" 3265 "} // namespace", 3266 format("SOME_MACRO\n" 3267 " namespace {\n" 3268 "void f( );\n" 3269 "} // namespace")); 3270 // Only if the identifier contains at least 5 characters. 3271 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 3272 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 3273 // Only if everything is upper case. 3274 EXPECT_EQ("class A : public QObject {\n" 3275 " Q_Object A() {}\n" 3276 "};", 3277 format("class A : public QObject {\n" 3278 " Q_Object\n" 3279 " A() {\n}\n" 3280 "} ;")); 3281 3282 // Only if the next line can actually start an unwrapped line. 3283 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 3284 format("SOME_WEIRD_LOG_MACRO\n" 3285 "<< SomeThing;")); 3286 3287 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 3288 "(n, buffers))\n", 3289 getChromiumStyle(FormatStyle::LK_Cpp)); 3290 3291 // See PR41483 3292 EXPECT_EQ("/**/ FOO(a)\n" 3293 "FOO(b)", 3294 format("/**/ FOO(a)\n" 3295 "FOO(b)")); 3296 } 3297 3298 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 3299 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3300 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3301 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3302 "class X {};\n" 3303 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3304 "int *createScopDetectionPass() { return 0; }", 3305 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3306 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3307 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3308 " class X {};\n" 3309 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3310 " int *createScopDetectionPass() { return 0; }")); 3311 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 3312 // braces, so that inner block is indented one level more. 3313 EXPECT_EQ("int q() {\n" 3314 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3315 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3316 " IPC_END_MESSAGE_MAP()\n" 3317 "}", 3318 format("int q() {\n" 3319 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3320 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3321 " IPC_END_MESSAGE_MAP()\n" 3322 "}")); 3323 3324 // Same inside macros. 3325 EXPECT_EQ("#define LIST(L) \\\n" 3326 " L(A) \\\n" 3327 " L(B) \\\n" 3328 " L(C)", 3329 format("#define LIST(L) \\\n" 3330 " L(A) \\\n" 3331 " L(B) \\\n" 3332 " L(C)", 3333 getGoogleStyle())); 3334 3335 // These must not be recognized as macros. 3336 EXPECT_EQ("int q() {\n" 3337 " f(x);\n" 3338 " f(x) {}\n" 3339 " f(x)->g();\n" 3340 " f(x)->*g();\n" 3341 " f(x).g();\n" 3342 " f(x) = x;\n" 3343 " f(x) += x;\n" 3344 " f(x) -= x;\n" 3345 " f(x) *= x;\n" 3346 " f(x) /= x;\n" 3347 " f(x) %= x;\n" 3348 " f(x) &= x;\n" 3349 " f(x) |= x;\n" 3350 " f(x) ^= x;\n" 3351 " f(x) >>= x;\n" 3352 " f(x) <<= x;\n" 3353 " f(x)[y].z();\n" 3354 " LOG(INFO) << x;\n" 3355 " ifstream(x) >> x;\n" 3356 "}\n", 3357 format("int q() {\n" 3358 " f(x)\n;\n" 3359 " f(x)\n {}\n" 3360 " f(x)\n->g();\n" 3361 " f(x)\n->*g();\n" 3362 " f(x)\n.g();\n" 3363 " f(x)\n = x;\n" 3364 " f(x)\n += x;\n" 3365 " f(x)\n -= x;\n" 3366 " f(x)\n *= x;\n" 3367 " f(x)\n /= x;\n" 3368 " f(x)\n %= x;\n" 3369 " f(x)\n &= x;\n" 3370 " f(x)\n |= x;\n" 3371 " f(x)\n ^= x;\n" 3372 " f(x)\n >>= x;\n" 3373 " f(x)\n <<= x;\n" 3374 " f(x)\n[y].z();\n" 3375 " LOG(INFO)\n << x;\n" 3376 " ifstream(x)\n >> x;\n" 3377 "}\n")); 3378 EXPECT_EQ("int q() {\n" 3379 " F(x)\n" 3380 " if (1) {\n" 3381 " }\n" 3382 " F(x)\n" 3383 " while (1) {\n" 3384 " }\n" 3385 " F(x)\n" 3386 " G(x);\n" 3387 " F(x)\n" 3388 " try {\n" 3389 " Q();\n" 3390 " } catch (...) {\n" 3391 " }\n" 3392 "}\n", 3393 format("int q() {\n" 3394 "F(x)\n" 3395 "if (1) {}\n" 3396 "F(x)\n" 3397 "while (1) {}\n" 3398 "F(x)\n" 3399 "G(x);\n" 3400 "F(x)\n" 3401 "try { Q(); } catch (...) {}\n" 3402 "}\n")); 3403 EXPECT_EQ("class A {\n" 3404 " A() : t(0) {}\n" 3405 " A(int i) noexcept() : {}\n" 3406 " A(X x)\n" // FIXME: function-level try blocks are broken. 3407 " try : t(0) {\n" 3408 " } catch (...) {\n" 3409 " }\n" 3410 "};", 3411 format("class A {\n" 3412 " A()\n : t(0) {}\n" 3413 " A(int i)\n noexcept() : {}\n" 3414 " A(X x)\n" 3415 " try : t(0) {} catch (...) {}\n" 3416 "};")); 3417 FormatStyle Style = getLLVMStyle(); 3418 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3419 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3420 Style.BraceWrapping.AfterFunction = true; 3421 EXPECT_EQ("void f()\n" 3422 "try\n" 3423 "{\n" 3424 "}", 3425 format("void f() try {\n" 3426 "}", 3427 Style)); 3428 EXPECT_EQ("class SomeClass {\n" 3429 "public:\n" 3430 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3431 "};", 3432 format("class SomeClass {\n" 3433 "public:\n" 3434 " SomeClass()\n" 3435 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3436 "};")); 3437 EXPECT_EQ("class SomeClass {\n" 3438 "public:\n" 3439 " SomeClass()\n" 3440 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3441 "};", 3442 format("class SomeClass {\n" 3443 "public:\n" 3444 " SomeClass()\n" 3445 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3446 "};", 3447 getLLVMStyleWithColumns(40))); 3448 3449 verifyFormat("MACRO(>)"); 3450 3451 // Some macros contain an implicit semicolon. 3452 Style = getLLVMStyle(); 3453 Style.StatementMacros.push_back("FOO"); 3454 verifyFormat("FOO(a) int b = 0;"); 3455 verifyFormat("FOO(a)\n" 3456 "int b = 0;", 3457 Style); 3458 verifyFormat("FOO(a);\n" 3459 "int b = 0;", 3460 Style); 3461 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3462 "int b = 0;", 3463 Style); 3464 verifyFormat("FOO()\n" 3465 "int b = 0;", 3466 Style); 3467 verifyFormat("FOO\n" 3468 "int b = 0;", 3469 Style); 3470 verifyFormat("void f() {\n" 3471 " FOO(a)\n" 3472 " return a;\n" 3473 "}", 3474 Style); 3475 verifyFormat("FOO(a)\n" 3476 "FOO(b)", 3477 Style); 3478 verifyFormat("int a = 0;\n" 3479 "FOO(b)\n" 3480 "int c = 0;", 3481 Style); 3482 verifyFormat("int a = 0;\n" 3483 "int x = FOO(a)\n" 3484 "int b = 0;", 3485 Style); 3486 verifyFormat("void foo(int a) { FOO(a) }\n" 3487 "uint32_t bar() {}", 3488 Style); 3489 } 3490 3491 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3492 verifyFormat("#define A \\\n" 3493 " f({ \\\n" 3494 " g(); \\\n" 3495 " });", 3496 getLLVMStyleWithColumns(11)); 3497 } 3498 3499 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3500 FormatStyle Style = getLLVMStyle(); 3501 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3502 Style.ColumnLimit = 40; 3503 verifyFormat("#ifdef _WIN32\n" 3504 "#define A 0\n" 3505 "#ifdef VAR2\n" 3506 "#define B 1\n" 3507 "#include <someheader.h>\n" 3508 "#define MACRO \\\n" 3509 " some_very_long_func_aaaaaaaaaa();\n" 3510 "#endif\n" 3511 "#else\n" 3512 "#define A 1\n" 3513 "#endif", 3514 Style); 3515 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3516 verifyFormat("#ifdef _WIN32\n" 3517 "# define A 0\n" 3518 "# ifdef VAR2\n" 3519 "# define B 1\n" 3520 "# include <someheader.h>\n" 3521 "# define MACRO \\\n" 3522 " some_very_long_func_aaaaaaaaaa();\n" 3523 "# endif\n" 3524 "#else\n" 3525 "# define A 1\n" 3526 "#endif", 3527 Style); 3528 verifyFormat("#if A\n" 3529 "# define MACRO \\\n" 3530 " void a(int x) { \\\n" 3531 " b(); \\\n" 3532 " c(); \\\n" 3533 " d(); \\\n" 3534 " e(); \\\n" 3535 " f(); \\\n" 3536 " }\n" 3537 "#endif", 3538 Style); 3539 // Comments before include guard. 3540 verifyFormat("// file comment\n" 3541 "// file comment\n" 3542 "#ifndef HEADER_H\n" 3543 "#define HEADER_H\n" 3544 "code();\n" 3545 "#endif", 3546 Style); 3547 // Test with include guards. 3548 verifyFormat("#ifndef HEADER_H\n" 3549 "#define HEADER_H\n" 3550 "code();\n" 3551 "#endif", 3552 Style); 3553 // Include guards must have a #define with the same variable immediately 3554 // after #ifndef. 3555 verifyFormat("#ifndef NOT_GUARD\n" 3556 "# define FOO\n" 3557 "code();\n" 3558 "#endif", 3559 Style); 3560 3561 // Include guards must cover the entire file. 3562 verifyFormat("code();\n" 3563 "code();\n" 3564 "#ifndef NOT_GUARD\n" 3565 "# define NOT_GUARD\n" 3566 "code();\n" 3567 "#endif", 3568 Style); 3569 verifyFormat("#ifndef NOT_GUARD\n" 3570 "# define NOT_GUARD\n" 3571 "code();\n" 3572 "#endif\n" 3573 "code();", 3574 Style); 3575 // Test with trailing blank lines. 3576 verifyFormat("#ifndef HEADER_H\n" 3577 "#define HEADER_H\n" 3578 "code();\n" 3579 "#endif\n", 3580 Style); 3581 // Include guards don't have #else. 3582 verifyFormat("#ifndef NOT_GUARD\n" 3583 "# define NOT_GUARD\n" 3584 "code();\n" 3585 "#else\n" 3586 "#endif", 3587 Style); 3588 verifyFormat("#ifndef NOT_GUARD\n" 3589 "# define NOT_GUARD\n" 3590 "code();\n" 3591 "#elif FOO\n" 3592 "#endif", 3593 Style); 3594 // Non-identifier #define after potential include guard. 3595 verifyFormat("#ifndef FOO\n" 3596 "# define 1\n" 3597 "#endif\n", 3598 Style); 3599 // #if closes past last non-preprocessor line. 3600 verifyFormat("#ifndef FOO\n" 3601 "#define FOO\n" 3602 "#if 1\n" 3603 "int i;\n" 3604 "# define A 0\n" 3605 "#endif\n" 3606 "#endif\n", 3607 Style); 3608 // Don't crash if there is an #elif directive without a condition. 3609 verifyFormat("#if 1\n" 3610 "int x;\n" 3611 "#elif\n" 3612 "int y;\n" 3613 "#else\n" 3614 "int z;\n" 3615 "#endif", 3616 Style); 3617 // FIXME: This doesn't handle the case where there's code between the 3618 // #ifndef and #define but all other conditions hold. This is because when 3619 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3620 // previous code line yet, so we can't detect it. 3621 EXPECT_EQ("#ifndef NOT_GUARD\n" 3622 "code();\n" 3623 "#define NOT_GUARD\n" 3624 "code();\n" 3625 "#endif", 3626 format("#ifndef NOT_GUARD\n" 3627 "code();\n" 3628 "# define NOT_GUARD\n" 3629 "code();\n" 3630 "#endif", 3631 Style)); 3632 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3633 // be outside an include guard. Examples are #pragma once and 3634 // #pragma GCC diagnostic, or anything else that does not change the meaning 3635 // of the file if it's included multiple times. 3636 EXPECT_EQ("#ifdef WIN32\n" 3637 "# pragma once\n" 3638 "#endif\n" 3639 "#ifndef HEADER_H\n" 3640 "# define HEADER_H\n" 3641 "code();\n" 3642 "#endif", 3643 format("#ifdef WIN32\n" 3644 "# pragma once\n" 3645 "#endif\n" 3646 "#ifndef HEADER_H\n" 3647 "#define HEADER_H\n" 3648 "code();\n" 3649 "#endif", 3650 Style)); 3651 // FIXME: This does not detect when there is a single non-preprocessor line 3652 // in front of an include-guard-like structure where other conditions hold 3653 // because ScopedLineState hides the line. 3654 EXPECT_EQ("code();\n" 3655 "#ifndef HEADER_H\n" 3656 "#define HEADER_H\n" 3657 "code();\n" 3658 "#endif", 3659 format("code();\n" 3660 "#ifndef HEADER_H\n" 3661 "# define HEADER_H\n" 3662 "code();\n" 3663 "#endif", 3664 Style)); 3665 // Keep comments aligned with #, otherwise indent comments normally. These 3666 // tests cannot use verifyFormat because messUp manipulates leading 3667 // whitespace. 3668 { 3669 const char *Expected = "" 3670 "void f() {\n" 3671 "#if 1\n" 3672 "// Preprocessor aligned.\n" 3673 "# define A 0\n" 3674 " // Code. Separated by blank line.\n" 3675 "\n" 3676 "# define B 0\n" 3677 " // Code. Not aligned with #\n" 3678 "# define C 0\n" 3679 "#endif"; 3680 const char *ToFormat = "" 3681 "void f() {\n" 3682 "#if 1\n" 3683 "// Preprocessor aligned.\n" 3684 "# define A 0\n" 3685 "// Code. Separated by blank line.\n" 3686 "\n" 3687 "# define B 0\n" 3688 " // Code. Not aligned with #\n" 3689 "# define C 0\n" 3690 "#endif"; 3691 EXPECT_EQ(Expected, format(ToFormat, Style)); 3692 EXPECT_EQ(Expected, format(Expected, Style)); 3693 } 3694 // Keep block quotes aligned. 3695 { 3696 const char *Expected = "" 3697 "void f() {\n" 3698 "#if 1\n" 3699 "/* Preprocessor aligned. */\n" 3700 "# define A 0\n" 3701 " /* Code. Separated by blank line. */\n" 3702 "\n" 3703 "# define B 0\n" 3704 " /* Code. Not aligned with # */\n" 3705 "# define C 0\n" 3706 "#endif"; 3707 const char *ToFormat = "" 3708 "void f() {\n" 3709 "#if 1\n" 3710 "/* Preprocessor aligned. */\n" 3711 "# define A 0\n" 3712 "/* Code. Separated by blank line. */\n" 3713 "\n" 3714 "# define B 0\n" 3715 " /* Code. Not aligned with # */\n" 3716 "# define C 0\n" 3717 "#endif"; 3718 EXPECT_EQ(Expected, format(ToFormat, Style)); 3719 EXPECT_EQ(Expected, format(Expected, Style)); 3720 } 3721 // Keep comments aligned with un-indented directives. 3722 { 3723 const char *Expected = "" 3724 "void f() {\n" 3725 "// Preprocessor aligned.\n" 3726 "#define A 0\n" 3727 " // Code. Separated by blank line.\n" 3728 "\n" 3729 "#define B 0\n" 3730 " // Code. Not aligned with #\n" 3731 "#define C 0\n"; 3732 const char *ToFormat = "" 3733 "void f() {\n" 3734 "// Preprocessor aligned.\n" 3735 "#define A 0\n" 3736 "// Code. Separated by blank line.\n" 3737 "\n" 3738 "#define B 0\n" 3739 " // Code. Not aligned with #\n" 3740 "#define C 0\n"; 3741 EXPECT_EQ(Expected, format(ToFormat, Style)); 3742 EXPECT_EQ(Expected, format(Expected, Style)); 3743 } 3744 // Test AfterHash with tabs. 3745 { 3746 FormatStyle Tabbed = Style; 3747 Tabbed.UseTab = FormatStyle::UT_Always; 3748 Tabbed.IndentWidth = 8; 3749 Tabbed.TabWidth = 8; 3750 verifyFormat("#ifdef _WIN32\n" 3751 "#\tdefine A 0\n" 3752 "#\tifdef VAR2\n" 3753 "#\t\tdefine B 1\n" 3754 "#\t\tinclude <someheader.h>\n" 3755 "#\t\tdefine MACRO \\\n" 3756 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3757 "#\tendif\n" 3758 "#else\n" 3759 "#\tdefine A 1\n" 3760 "#endif", 3761 Tabbed); 3762 } 3763 3764 // Regression test: Multiline-macro inside include guards. 3765 verifyFormat("#ifndef HEADER_H\n" 3766 "#define HEADER_H\n" 3767 "#define A() \\\n" 3768 " int i; \\\n" 3769 " int j;\n" 3770 "#endif // HEADER_H", 3771 getLLVMStyleWithColumns(20)); 3772 3773 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3774 // Basic before hash indent tests 3775 verifyFormat("#ifdef _WIN32\n" 3776 " #define A 0\n" 3777 " #ifdef VAR2\n" 3778 " #define B 1\n" 3779 " #include <someheader.h>\n" 3780 " #define MACRO \\\n" 3781 " some_very_long_func_aaaaaaaaaa();\n" 3782 " #endif\n" 3783 "#else\n" 3784 " #define A 1\n" 3785 "#endif", 3786 Style); 3787 verifyFormat("#if A\n" 3788 " #define MACRO \\\n" 3789 " void a(int x) { \\\n" 3790 " b(); \\\n" 3791 " c(); \\\n" 3792 " d(); \\\n" 3793 " e(); \\\n" 3794 " f(); \\\n" 3795 " }\n" 3796 "#endif", 3797 Style); 3798 // Keep comments aligned with indented directives. These 3799 // tests cannot use verifyFormat because messUp manipulates leading 3800 // whitespace. 3801 { 3802 const char *Expected = "void f() {\n" 3803 "// Aligned to preprocessor.\n" 3804 "#if 1\n" 3805 " // Aligned to code.\n" 3806 " int a;\n" 3807 " #if 1\n" 3808 " // Aligned to preprocessor.\n" 3809 " #define A 0\n" 3810 " // Aligned to code.\n" 3811 " int b;\n" 3812 " #endif\n" 3813 "#endif\n" 3814 "}"; 3815 const char *ToFormat = "void f() {\n" 3816 "// Aligned to preprocessor.\n" 3817 "#if 1\n" 3818 "// Aligned to code.\n" 3819 "int a;\n" 3820 "#if 1\n" 3821 "// Aligned to preprocessor.\n" 3822 "#define A 0\n" 3823 "// Aligned to code.\n" 3824 "int b;\n" 3825 "#endif\n" 3826 "#endif\n" 3827 "}"; 3828 EXPECT_EQ(Expected, format(ToFormat, Style)); 3829 EXPECT_EQ(Expected, format(Expected, Style)); 3830 } 3831 { 3832 const char *Expected = "void f() {\n" 3833 "/* Aligned to preprocessor. */\n" 3834 "#if 1\n" 3835 " /* Aligned to code. */\n" 3836 " int a;\n" 3837 " #if 1\n" 3838 " /* Aligned to preprocessor. */\n" 3839 " #define A 0\n" 3840 " /* Aligned to code. */\n" 3841 " int b;\n" 3842 " #endif\n" 3843 "#endif\n" 3844 "}"; 3845 const char *ToFormat = "void f() {\n" 3846 "/* Aligned to preprocessor. */\n" 3847 "#if 1\n" 3848 "/* Aligned to code. */\n" 3849 "int a;\n" 3850 "#if 1\n" 3851 "/* Aligned to preprocessor. */\n" 3852 "#define A 0\n" 3853 "/* Aligned to code. */\n" 3854 "int b;\n" 3855 "#endif\n" 3856 "#endif\n" 3857 "}"; 3858 EXPECT_EQ(Expected, format(ToFormat, Style)); 3859 EXPECT_EQ(Expected, format(Expected, Style)); 3860 } 3861 3862 // Test single comment before preprocessor 3863 verifyFormat("// Comment\n" 3864 "\n" 3865 "#if 1\n" 3866 "#endif", 3867 Style); 3868 } 3869 3870 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3871 verifyFormat("{\n { a #c; }\n}"); 3872 } 3873 3874 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3875 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3876 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3877 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3878 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3879 } 3880 3881 TEST_F(FormatTest, EscapedNewlines) { 3882 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3883 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3884 format("#define A \\\nint i;\\\n int j;", Narrow)); 3885 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3886 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3887 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3888 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3889 3890 FormatStyle AlignLeft = getLLVMStyle(); 3891 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3892 EXPECT_EQ("#define MACRO(x) \\\n" 3893 "private: \\\n" 3894 " int x(int a);\n", 3895 format("#define MACRO(x) \\\n" 3896 "private: \\\n" 3897 " int x(int a);\n", 3898 AlignLeft)); 3899 3900 // CRLF line endings 3901 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3902 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3903 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3904 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3905 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3906 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3907 EXPECT_EQ("#define MACRO(x) \\\r\n" 3908 "private: \\\r\n" 3909 " int x(int a);\r\n", 3910 format("#define MACRO(x) \\\r\n" 3911 "private: \\\r\n" 3912 " int x(int a);\r\n", 3913 AlignLeft)); 3914 3915 FormatStyle DontAlign = getLLVMStyle(); 3916 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3917 DontAlign.MaxEmptyLinesToKeep = 3; 3918 // FIXME: can't use verifyFormat here because the newline before 3919 // "public:" is not inserted the first time it's reformatted 3920 EXPECT_EQ("#define A \\\n" 3921 " class Foo { \\\n" 3922 " void bar(); \\\n" 3923 "\\\n" 3924 "\\\n" 3925 "\\\n" 3926 " public: \\\n" 3927 " void baz(); \\\n" 3928 " };", 3929 format("#define A \\\n" 3930 " class Foo { \\\n" 3931 " void bar(); \\\n" 3932 "\\\n" 3933 "\\\n" 3934 "\\\n" 3935 " public: \\\n" 3936 " void baz(); \\\n" 3937 " };", 3938 DontAlign)); 3939 } 3940 3941 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3942 verifyFormat("#define A \\\n" 3943 " int v( \\\n" 3944 " a); \\\n" 3945 " int i;", 3946 getLLVMStyleWithColumns(11)); 3947 } 3948 3949 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3950 EXPECT_EQ( 3951 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3952 " \\\n" 3953 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3954 "\n" 3955 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3956 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3957 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3958 "\\\n" 3959 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3960 " \n" 3961 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3962 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3963 } 3964 3965 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3966 EXPECT_EQ("int\n" 3967 "#define A\n" 3968 " a;", 3969 format("int\n#define A\na;")); 3970 verifyFormat("functionCallTo(\n" 3971 " someOtherFunction(\n" 3972 " withSomeParameters, whichInSequence,\n" 3973 " areLongerThanALine(andAnotherCall,\n" 3974 "#define A B\n" 3975 " withMoreParamters,\n" 3976 " whichStronglyInfluenceTheLayout),\n" 3977 " andMoreParameters),\n" 3978 " trailing);", 3979 getLLVMStyleWithColumns(69)); 3980 verifyFormat("Foo::Foo()\n" 3981 "#ifdef BAR\n" 3982 " : baz(0)\n" 3983 "#endif\n" 3984 "{\n" 3985 "}"); 3986 verifyFormat("void f() {\n" 3987 " if (true)\n" 3988 "#ifdef A\n" 3989 " f(42);\n" 3990 " x();\n" 3991 "#else\n" 3992 " g();\n" 3993 " x();\n" 3994 "#endif\n" 3995 "}"); 3996 verifyFormat("void f(param1, param2,\n" 3997 " param3,\n" 3998 "#ifdef A\n" 3999 " param4(param5,\n" 4000 "#ifdef A1\n" 4001 " param6,\n" 4002 "#ifdef A2\n" 4003 " param7),\n" 4004 "#else\n" 4005 " param8),\n" 4006 " param9,\n" 4007 "#endif\n" 4008 " param10,\n" 4009 "#endif\n" 4010 " param11)\n" 4011 "#else\n" 4012 " param12)\n" 4013 "#endif\n" 4014 "{\n" 4015 " x();\n" 4016 "}", 4017 getLLVMStyleWithColumns(28)); 4018 verifyFormat("#if 1\n" 4019 "int i;"); 4020 verifyFormat("#if 1\n" 4021 "#endif\n" 4022 "#if 1\n" 4023 "#else\n" 4024 "#endif\n"); 4025 verifyFormat("DEBUG({\n" 4026 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 4028 "});\n" 4029 "#if a\n" 4030 "#else\n" 4031 "#endif"); 4032 4033 verifyIncompleteFormat("void f(\n" 4034 "#if A\n" 4035 ");\n" 4036 "#else\n" 4037 "#endif"); 4038 } 4039 4040 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 4041 verifyFormat("#endif\n" 4042 "#if B"); 4043 } 4044 4045 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 4046 FormatStyle SingleLine = getLLVMStyle(); 4047 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 4048 verifyFormat("#if 0\n" 4049 "#elif 1\n" 4050 "#endif\n" 4051 "void foo() {\n" 4052 " if (test) foo2();\n" 4053 "}", 4054 SingleLine); 4055 } 4056 4057 TEST_F(FormatTest, LayoutBlockInsideParens) { 4058 verifyFormat("functionCall({ int i; });"); 4059 verifyFormat("functionCall({\n" 4060 " int i;\n" 4061 " int j;\n" 4062 "});"); 4063 verifyFormat("functionCall(\n" 4064 " {\n" 4065 " int i;\n" 4066 " int j;\n" 4067 " },\n" 4068 " aaaa, bbbb, cccc);"); 4069 verifyFormat("functionA(functionB({\n" 4070 " int i;\n" 4071 " int j;\n" 4072 " }),\n" 4073 " aaaa, bbbb, cccc);"); 4074 verifyFormat("functionCall(\n" 4075 " {\n" 4076 " int i;\n" 4077 " int j;\n" 4078 " },\n" 4079 " aaaa, bbbb, // comment\n" 4080 " cccc);"); 4081 verifyFormat("functionA(functionB({\n" 4082 " int i;\n" 4083 " int j;\n" 4084 " }),\n" 4085 " aaaa, bbbb, // comment\n" 4086 " cccc);"); 4087 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 4088 verifyFormat("functionCall(aaaa, bbbb, {\n" 4089 " int i;\n" 4090 " int j;\n" 4091 "});"); 4092 verifyFormat( 4093 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 4094 " {\n" 4095 " int i; // break\n" 4096 " },\n" 4097 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 4098 " ccccccccccccccccc));"); 4099 verifyFormat("DEBUG({\n" 4100 " if (a)\n" 4101 " f();\n" 4102 "});"); 4103 } 4104 4105 TEST_F(FormatTest, LayoutBlockInsideStatement) { 4106 EXPECT_EQ("SOME_MACRO { int i; }\n" 4107 "int i;", 4108 format(" SOME_MACRO {int i;} int i;")); 4109 } 4110 4111 TEST_F(FormatTest, LayoutNestedBlocks) { 4112 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 4113 " struct s {\n" 4114 " int i;\n" 4115 " };\n" 4116 " s kBitsToOs[] = {{10}};\n" 4117 " for (int i = 0; i < 10; ++i)\n" 4118 " return;\n" 4119 "}"); 4120 verifyFormat("call(parameter, {\n" 4121 " something();\n" 4122 " // Comment using all columns.\n" 4123 " somethingelse();\n" 4124 "});", 4125 getLLVMStyleWithColumns(40)); 4126 verifyFormat("DEBUG( //\n" 4127 " { f(); }, a);"); 4128 verifyFormat("DEBUG( //\n" 4129 " {\n" 4130 " f(); //\n" 4131 " },\n" 4132 " a);"); 4133 4134 EXPECT_EQ("call(parameter, {\n" 4135 " something();\n" 4136 " // Comment too\n" 4137 " // looooooooooong.\n" 4138 " somethingElse();\n" 4139 "});", 4140 format("call(parameter, {\n" 4141 " something();\n" 4142 " // Comment too looooooooooong.\n" 4143 " somethingElse();\n" 4144 "});", 4145 getLLVMStyleWithColumns(29))); 4146 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 4147 EXPECT_EQ("DEBUG({ // comment\n" 4148 " int i;\n" 4149 "});", 4150 format("DEBUG({ // comment\n" 4151 "int i;\n" 4152 "});")); 4153 EXPECT_EQ("DEBUG({\n" 4154 " int i;\n" 4155 "\n" 4156 " // comment\n" 4157 " int j;\n" 4158 "});", 4159 format("DEBUG({\n" 4160 " int i;\n" 4161 "\n" 4162 " // comment\n" 4163 " int j;\n" 4164 "});")); 4165 4166 verifyFormat("DEBUG({\n" 4167 " if (a)\n" 4168 " return;\n" 4169 "});"); 4170 verifyGoogleFormat("DEBUG({\n" 4171 " if (a) return;\n" 4172 "});"); 4173 FormatStyle Style = getGoogleStyle(); 4174 Style.ColumnLimit = 45; 4175 verifyFormat("Debug(\n" 4176 " aaaaa,\n" 4177 " {\n" 4178 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 4179 " },\n" 4180 " a);", 4181 Style); 4182 4183 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 4184 4185 verifyNoCrash("^{v^{a}}"); 4186 } 4187 4188 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 4189 EXPECT_EQ("#define MACRO() \\\n" 4190 " Debug(aaa, /* force line break */ \\\n" 4191 " { \\\n" 4192 " int i; \\\n" 4193 " int j; \\\n" 4194 " })", 4195 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 4196 " { int i; int j; })", 4197 getGoogleStyle())); 4198 4199 EXPECT_EQ("#define A \\\n" 4200 " [] { \\\n" 4201 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4202 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 4203 " }", 4204 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4205 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 4206 getGoogleStyle())); 4207 } 4208 4209 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 4210 EXPECT_EQ("{}", format("{}")); 4211 verifyFormat("enum E {};"); 4212 verifyFormat("enum E {}"); 4213 FormatStyle Style = getLLVMStyle(); 4214 Style.SpaceInEmptyBlock = true; 4215 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 4216 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 4217 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 4218 } 4219 4220 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 4221 FormatStyle Style = getLLVMStyle(); 4222 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 4223 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 4224 verifyFormat("FOO_BEGIN\n" 4225 " FOO_ENTRY\n" 4226 "FOO_END", 4227 Style); 4228 verifyFormat("FOO_BEGIN\n" 4229 " NESTED_FOO_BEGIN\n" 4230 " NESTED_FOO_ENTRY\n" 4231 " NESTED_FOO_END\n" 4232 "FOO_END", 4233 Style); 4234 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 4235 " int x;\n" 4236 " x = 1;\n" 4237 "FOO_END(Baz)", 4238 Style); 4239 } 4240 4241 //===----------------------------------------------------------------------===// 4242 // Line break tests. 4243 //===----------------------------------------------------------------------===// 4244 4245 TEST_F(FormatTest, PreventConfusingIndents) { 4246 verifyFormat( 4247 "void f() {\n" 4248 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 4249 " parameter, parameter, parameter)),\n" 4250 " SecondLongCall(parameter));\n" 4251 "}"); 4252 verifyFormat( 4253 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4254 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4256 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 4257 verifyFormat( 4258 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4259 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 4260 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 4261 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 4262 verifyFormat( 4263 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 4264 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 4265 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 4266 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 4267 verifyFormat("int a = bbbb && ccc &&\n" 4268 " fffff(\n" 4269 "#define A Just forcing a new line\n" 4270 " ddd);"); 4271 } 4272 4273 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 4274 verifyFormat( 4275 "bool aaaaaaa =\n" 4276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 4277 " bbbbbbbb();"); 4278 verifyFormat( 4279 "bool aaaaaaa =\n" 4280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 4281 " bbbbbbbb();"); 4282 4283 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 4285 " ccccccccc == ddddddddddd;"); 4286 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 4288 " ccccccccc == ddddddddddd;"); 4289 verifyFormat( 4290 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 4291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 4292 " ccccccccc == ddddddddddd;"); 4293 4294 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4295 " aaaaaa) &&\n" 4296 " bbbbbb && cccccc;"); 4297 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4298 " aaaaaa) >>\n" 4299 " bbbbbb;"); 4300 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 4301 " SourceMgr.getSpellingColumnNumber(\n" 4302 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 4303 " 1);"); 4304 4305 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4306 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 4307 " cccccc) {\n}"); 4308 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4309 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4310 " cccccc) {\n}"); 4311 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4312 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4313 " cccccc) {\n}"); 4314 verifyFormat("b = a &&\n" 4315 " // Comment\n" 4316 " b.c && d;"); 4317 4318 // If the LHS of a comparison is not a binary expression itself, the 4319 // additional linebreak confuses many people. 4320 verifyFormat( 4321 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 4323 "}"); 4324 verifyFormat( 4325 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4327 "}"); 4328 verifyFormat( 4329 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 4330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4331 "}"); 4332 verifyFormat( 4333 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 4335 "}"); 4336 // Even explicit parentheses stress the precedence enough to make the 4337 // additional break unnecessary. 4338 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4340 "}"); 4341 // This cases is borderline, but with the indentation it is still readable. 4342 verifyFormat( 4343 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4344 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4346 "}", 4347 getLLVMStyleWithColumns(75)); 4348 4349 // If the LHS is a binary expression, we should still use the additional break 4350 // as otherwise the formatting hides the operator precedence. 4351 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4353 " 5) {\n" 4354 "}"); 4355 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4357 " 5) {\n" 4358 "}"); 4359 4360 FormatStyle OnePerLine = getLLVMStyle(); 4361 OnePerLine.BinPackParameters = false; 4362 verifyFormat( 4363 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4366 OnePerLine); 4367 4368 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4369 " .aaa(aaaaaaaaaaaaa) *\n" 4370 " aaaaaaa +\n" 4371 " aaaaaaa;", 4372 getLLVMStyleWithColumns(40)); 4373 } 4374 4375 TEST_F(FormatTest, ExpressionIndentation) { 4376 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4378 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4379 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4380 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4381 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4382 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4384 " ccccccccccccccccccccccccccccccccccccccccc;"); 4385 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4388 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4389 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4391 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4392 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4393 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4396 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4397 verifyFormat("if () {\n" 4398 "} else if (aaaaa && bbbbb > // break\n" 4399 " ccccc) {\n" 4400 "}"); 4401 verifyFormat("if () {\n" 4402 "} else if constexpr (aaaaa && bbbbb > // break\n" 4403 " ccccc) {\n" 4404 "}"); 4405 verifyFormat("if () {\n" 4406 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4407 " ccccc) {\n" 4408 "}"); 4409 verifyFormat("if () {\n" 4410 "} else if (aaaaa &&\n" 4411 " bbbbb > // break\n" 4412 " ccccc &&\n" 4413 " ddddd) {\n" 4414 "}"); 4415 4416 // Presence of a trailing comment used to change indentation of b. 4417 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4418 " b;\n" 4419 "return aaaaaaaaaaaaaaaaaaa +\n" 4420 " b; //", 4421 getLLVMStyleWithColumns(30)); 4422 } 4423 4424 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4425 // Not sure what the best system is here. Like this, the LHS can be found 4426 // immediately above an operator (everything with the same or a higher 4427 // indent). The RHS is aligned right of the operator and so compasses 4428 // everything until something with the same indent as the operator is found. 4429 // FIXME: Is this a good system? 4430 FormatStyle Style = getLLVMStyle(); 4431 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4432 verifyFormat( 4433 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4434 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4435 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4436 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4437 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4438 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4439 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4440 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4441 " > ccccccccccccccccccccccccccccccccccccccccc;", 4442 Style); 4443 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4444 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4445 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4446 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4447 Style); 4448 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4449 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4450 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4451 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4452 Style); 4453 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4454 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4455 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4456 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4457 Style); 4458 verifyFormat("if () {\n" 4459 "} else if (aaaaa\n" 4460 " && bbbbb // break\n" 4461 " > ccccc) {\n" 4462 "}", 4463 Style); 4464 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4465 " && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4466 Style); 4467 verifyFormat("return (a)\n" 4468 " // comment\n" 4469 " + b;", 4470 Style); 4471 verifyFormat( 4472 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4473 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4474 " + cc;", 4475 Style); 4476 4477 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4478 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4479 Style); 4480 4481 // Forced by comments. 4482 verifyFormat( 4483 "unsigned ContentSize =\n" 4484 " sizeof(int16_t) // DWARF ARange version number\n" 4485 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4486 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4487 " + sizeof(int8_t); // Segment Size (in bytes)"); 4488 4489 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4490 " == boost::fusion::at_c<1>(iiii).second;", 4491 Style); 4492 4493 Style.ColumnLimit = 60; 4494 verifyFormat("zzzzzzzzzz\n" 4495 " = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4496 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4497 Style); 4498 4499 Style.ColumnLimit = 80; 4500 Style.IndentWidth = 4; 4501 Style.TabWidth = 4; 4502 Style.UseTab = FormatStyle::UT_Always; 4503 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4504 Style.AlignOperands = FormatStyle::OAS_DontAlign; 4505 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4506 "\t&& (someOtherLongishConditionPart1\n" 4507 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4508 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4509 "(someOtherLongishConditionPart1 || " 4510 "someOtherEvenLongerNestedConditionPart2);", 4511 Style)); 4512 } 4513 4514 TEST_F(FormatTest, ExpressionIndentationStrictAlign) { 4515 FormatStyle Style = getLLVMStyle(); 4516 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4517 Style.AlignOperands = FormatStyle::OAS_AlignAfterOperator; 4518 4519 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4520 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4521 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4522 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4523 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4524 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4525 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4526 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4527 " > ccccccccccccccccccccccccccccccccccccccccc;", 4528 Style); 4529 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4530 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4531 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4532 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4533 Style); 4534 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4535 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4536 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4537 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4538 Style); 4539 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4540 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4541 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4542 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4543 Style); 4544 verifyFormat("if () {\n" 4545 "} else if (aaaaa\n" 4546 " && bbbbb // break\n" 4547 " > ccccc) {\n" 4548 "}", 4549 Style); 4550 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4551 " && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4552 Style); 4553 verifyFormat("return (a)\n" 4554 " // comment\n" 4555 " + b;", 4556 Style); 4557 verifyFormat( 4558 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4559 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4560 " + cc;", 4561 Style); 4562 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 4563 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 4564 " : 3333333333333333;", 4565 Style); 4566 verifyFormat( 4567 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 4568 " : ccccccccccccccc ? dddddddddddddddddd\n" 4569 " : eeeeeeeeeeeeeeeeee)\n" 4570 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 4571 " : 3333333333333333;", 4572 Style); 4573 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4574 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4575 Style); 4576 4577 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4578 " == boost::fusion::at_c<1>(iiii).second;", 4579 Style); 4580 4581 Style.ColumnLimit = 60; 4582 verifyFormat("zzzzzzzzzzzzz\n" 4583 " = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4584 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4585 Style); 4586 4587 // Forced by comments. 4588 Style.ColumnLimit = 80; 4589 verifyFormat( 4590 "unsigned ContentSize\n" 4591 " = sizeof(int16_t) // DWARF ARange version number\n" 4592 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4593 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4594 " + sizeof(int8_t); // Segment Size (in bytes)", 4595 Style); 4596 4597 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4598 verifyFormat( 4599 "unsigned ContentSize =\n" 4600 " sizeof(int16_t) // DWARF ARange version number\n" 4601 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4602 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4603 " + sizeof(int8_t); // Segment Size (in bytes)", 4604 Style); 4605 4606 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4607 verifyFormat( 4608 "unsigned ContentSize =\n" 4609 " sizeof(int16_t) // DWARF ARange version number\n" 4610 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4611 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4612 " + sizeof(int8_t); // Segment Size (in bytes)", 4613 Style); 4614 } 4615 4616 TEST_F(FormatTest, EnforcedOperatorWraps) { 4617 // Here we'd like to wrap after the || operators, but a comment is forcing an 4618 // earlier wrap. 4619 verifyFormat("bool x = aaaaa //\n" 4620 " || bbbbb\n" 4621 " //\n" 4622 " || cccc;"); 4623 } 4624 4625 TEST_F(FormatTest, NoOperandAlignment) { 4626 FormatStyle Style = getLLVMStyle(); 4627 Style.AlignOperands = FormatStyle::OAS_DontAlign; 4628 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4629 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4630 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4631 Style); 4632 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4633 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4634 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4635 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4636 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4637 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4638 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4639 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4640 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4641 " > ccccccccccccccccccccccccccccccccccccccccc;", 4642 Style); 4643 4644 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4645 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4646 " + cc;", 4647 Style); 4648 verifyFormat("int a = aa\n" 4649 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4650 " * cccccccccccccccccccccccccccccccccccc;\n", 4651 Style); 4652 4653 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4654 verifyFormat("return (a > b\n" 4655 " // comment1\n" 4656 " // comment2\n" 4657 " || c);", 4658 Style); 4659 } 4660 4661 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4662 FormatStyle Style = getLLVMStyle(); 4663 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4664 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4665 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4666 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4667 Style); 4668 } 4669 4670 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4671 FormatStyle Style = getLLVMStyle(); 4672 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4673 Style.BinPackArguments = false; 4674 Style.ColumnLimit = 40; 4675 verifyFormat("void test() {\n" 4676 " someFunction(\n" 4677 " this + argument + is + quite\n" 4678 " + long + so + it + gets + wrapped\n" 4679 " + but + remains + bin - packed);\n" 4680 "}", 4681 Style); 4682 verifyFormat("void test() {\n" 4683 " someFunction(arg1,\n" 4684 " this + argument + is\n" 4685 " + quite + long + so\n" 4686 " + it + gets + wrapped\n" 4687 " + but + remains + bin\n" 4688 " - packed,\n" 4689 " arg3);\n" 4690 "}", 4691 Style); 4692 verifyFormat("void test() {\n" 4693 " someFunction(\n" 4694 " arg1,\n" 4695 " this + argument + has\n" 4696 " + anotherFunc(nested,\n" 4697 " calls + whose\n" 4698 " + arguments\n" 4699 " + are + also\n" 4700 " + wrapped,\n" 4701 " in + addition)\n" 4702 " + to + being + bin - packed,\n" 4703 " arg3);\n" 4704 "}", 4705 Style); 4706 4707 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4708 verifyFormat("void test() {\n" 4709 " someFunction(\n" 4710 " arg1,\n" 4711 " this + argument + has +\n" 4712 " anotherFunc(nested,\n" 4713 " calls + whose +\n" 4714 " arguments +\n" 4715 " are + also +\n" 4716 " wrapped,\n" 4717 " in + addition) +\n" 4718 " to + being + bin - packed,\n" 4719 " arg3);\n" 4720 "}", 4721 Style); 4722 } 4723 4724 TEST_F(FormatTest, ConstructorInitializers) { 4725 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4726 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4727 getLLVMStyleWithColumns(45)); 4728 verifyFormat("Constructor()\n" 4729 " : Inttializer(FitsOnTheLine) {}", 4730 getLLVMStyleWithColumns(44)); 4731 verifyFormat("Constructor()\n" 4732 " : Inttializer(FitsOnTheLine) {}", 4733 getLLVMStyleWithColumns(43)); 4734 4735 verifyFormat("template <typename T>\n" 4736 "Constructor() : Initializer(FitsOnTheLine) {}", 4737 getLLVMStyleWithColumns(45)); 4738 4739 verifyFormat( 4740 "SomeClass::Constructor()\n" 4741 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4742 4743 verifyFormat( 4744 "SomeClass::Constructor()\n" 4745 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4746 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4747 verifyFormat( 4748 "SomeClass::Constructor()\n" 4749 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4750 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4751 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4752 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4753 " : aaaaaaaaaa(aaaaaa) {}"); 4754 4755 verifyFormat("Constructor()\n" 4756 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4757 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4758 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4759 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4760 4761 verifyFormat("Constructor()\n" 4762 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4764 4765 verifyFormat("Constructor(int Parameter = 0)\n" 4766 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4767 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4768 verifyFormat("Constructor()\n" 4769 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4770 "}", 4771 getLLVMStyleWithColumns(60)); 4772 verifyFormat("Constructor()\n" 4773 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4774 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4775 4776 // Here a line could be saved by splitting the second initializer onto two 4777 // lines, but that is not desirable. 4778 verifyFormat("Constructor()\n" 4779 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4780 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4781 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4782 4783 FormatStyle OnePerLine = getLLVMStyle(); 4784 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4785 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4786 verifyFormat("SomeClass::Constructor()\n" 4787 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4788 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4789 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4790 OnePerLine); 4791 verifyFormat("SomeClass::Constructor()\n" 4792 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4793 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4794 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4795 OnePerLine); 4796 verifyFormat("MyClass::MyClass(int var)\n" 4797 " : some_var_(var), // 4 space indent\n" 4798 " some_other_var_(var + 1) { // lined up\n" 4799 "}", 4800 OnePerLine); 4801 verifyFormat("Constructor()\n" 4802 " : aaaaa(aaaaaa),\n" 4803 " aaaaa(aaaaaa),\n" 4804 " aaaaa(aaaaaa),\n" 4805 " aaaaa(aaaaaa),\n" 4806 " aaaaa(aaaaaa) {}", 4807 OnePerLine); 4808 verifyFormat("Constructor()\n" 4809 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4810 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4811 OnePerLine); 4812 OnePerLine.BinPackParameters = false; 4813 verifyFormat( 4814 "Constructor()\n" 4815 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4816 " aaaaaaaaaaa().aaa(),\n" 4817 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4818 OnePerLine); 4819 OnePerLine.ColumnLimit = 60; 4820 verifyFormat("Constructor()\n" 4821 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4822 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4823 OnePerLine); 4824 4825 EXPECT_EQ("Constructor()\n" 4826 " : // Comment forcing unwanted break.\n" 4827 " aaaa(aaaa) {}", 4828 format("Constructor() :\n" 4829 " // Comment forcing unwanted break.\n" 4830 " aaaa(aaaa) {}")); 4831 } 4832 4833 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4834 FormatStyle Style = getLLVMStyle(); 4835 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4836 Style.ColumnLimit = 60; 4837 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4838 Style.AllowAllConstructorInitializersOnNextLine = true; 4839 Style.BinPackParameters = false; 4840 4841 for (int i = 0; i < 4; ++i) { 4842 // Test all combinations of parameters that should not have an effect. 4843 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4844 Style.AllowAllArgumentsOnNextLine = i & 2; 4845 4846 Style.AllowAllConstructorInitializersOnNextLine = true; 4847 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4848 verifyFormat("Constructor()\n" 4849 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4850 Style); 4851 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4852 4853 Style.AllowAllConstructorInitializersOnNextLine = false; 4854 verifyFormat("Constructor()\n" 4855 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4856 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4857 Style); 4858 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4859 4860 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4861 Style.AllowAllConstructorInitializersOnNextLine = true; 4862 verifyFormat("Constructor()\n" 4863 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4864 Style); 4865 4866 Style.AllowAllConstructorInitializersOnNextLine = false; 4867 verifyFormat("Constructor()\n" 4868 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4869 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4870 Style); 4871 4872 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4873 Style.AllowAllConstructorInitializersOnNextLine = true; 4874 verifyFormat("Constructor() :\n" 4875 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4876 Style); 4877 4878 Style.AllowAllConstructorInitializersOnNextLine = false; 4879 verifyFormat("Constructor() :\n" 4880 " aaaaaaaaaaaaaaaaaa(a),\n" 4881 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4882 Style); 4883 } 4884 4885 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4886 // AllowAllConstructorInitializersOnNextLine in all 4887 // BreakConstructorInitializers modes 4888 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4889 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4890 Style.AllowAllConstructorInitializersOnNextLine = false; 4891 verifyFormat("SomeClassWithALongName::Constructor(\n" 4892 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4893 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4894 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4895 Style); 4896 4897 Style.AllowAllConstructorInitializersOnNextLine = true; 4898 verifyFormat("SomeClassWithALongName::Constructor(\n" 4899 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4900 " int bbbbbbbbbbbbb,\n" 4901 " int cccccccccccccccc)\n" 4902 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4903 Style); 4904 4905 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4906 Style.AllowAllConstructorInitializersOnNextLine = false; 4907 verifyFormat("SomeClassWithALongName::Constructor(\n" 4908 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4909 " int bbbbbbbbbbbbb)\n" 4910 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4911 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4912 Style); 4913 4914 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4915 4916 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4917 verifyFormat("SomeClassWithALongName::Constructor(\n" 4918 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4919 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4920 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4921 Style); 4922 4923 Style.AllowAllConstructorInitializersOnNextLine = true; 4924 verifyFormat("SomeClassWithALongName::Constructor(\n" 4925 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4926 " int bbbbbbbbbbbbb,\n" 4927 " int cccccccccccccccc)\n" 4928 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4929 Style); 4930 4931 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4932 Style.AllowAllConstructorInitializersOnNextLine = false; 4933 verifyFormat("SomeClassWithALongName::Constructor(\n" 4934 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4935 " int bbbbbbbbbbbbb)\n" 4936 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4937 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4938 Style); 4939 4940 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4941 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4942 verifyFormat("SomeClassWithALongName::Constructor(\n" 4943 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4944 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4945 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4946 Style); 4947 4948 Style.AllowAllConstructorInitializersOnNextLine = true; 4949 verifyFormat("SomeClassWithALongName::Constructor(\n" 4950 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4951 " int bbbbbbbbbbbbb,\n" 4952 " int cccccccccccccccc) :\n" 4953 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4954 Style); 4955 4956 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4957 Style.AllowAllConstructorInitializersOnNextLine = false; 4958 verifyFormat("SomeClassWithALongName::Constructor(\n" 4959 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4960 " int bbbbbbbbbbbbb) :\n" 4961 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4962 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4963 Style); 4964 } 4965 4966 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4967 FormatStyle Style = getLLVMStyle(); 4968 Style.ColumnLimit = 60; 4969 Style.BinPackArguments = false; 4970 for (int i = 0; i < 4; ++i) { 4971 // Test all combinations of parameters that should not have an effect. 4972 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4973 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4974 4975 Style.AllowAllArgumentsOnNextLine = true; 4976 verifyFormat("void foo() {\n" 4977 " FunctionCallWithReallyLongName(\n" 4978 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4979 "}", 4980 Style); 4981 Style.AllowAllArgumentsOnNextLine = false; 4982 verifyFormat("void foo() {\n" 4983 " FunctionCallWithReallyLongName(\n" 4984 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4985 " bbbbbbbbbbbb);\n" 4986 "}", 4987 Style); 4988 4989 Style.AllowAllArgumentsOnNextLine = true; 4990 verifyFormat("void foo() {\n" 4991 " auto VariableWithReallyLongName = {\n" 4992 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4993 "}", 4994 Style); 4995 Style.AllowAllArgumentsOnNextLine = false; 4996 verifyFormat("void foo() {\n" 4997 " auto VariableWithReallyLongName = {\n" 4998 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4999 " bbbbbbbbbbbb};\n" 5000 "}", 5001 Style); 5002 } 5003 5004 // This parameter should not affect declarations. 5005 Style.BinPackParameters = false; 5006 Style.AllowAllArgumentsOnNextLine = false; 5007 Style.AllowAllParametersOfDeclarationOnNextLine = true; 5008 verifyFormat("void FunctionCallWithReallyLongName(\n" 5009 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 5010 Style); 5011 Style.AllowAllParametersOfDeclarationOnNextLine = false; 5012 verifyFormat("void FunctionCallWithReallyLongName(\n" 5013 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 5014 " int bbbbbbbbbbbb);", 5015 Style); 5016 } 5017 5018 TEST_F(FormatTest, AllowAllArgumentsOnNextLineDontAlign) { 5019 // Check that AllowAllArgumentsOnNextLine is respected for both BAS_DontAlign 5020 // and BAS_Align. 5021 auto Style = getLLVMStyle(); 5022 Style.ColumnLimit = 35; 5023 StringRef Input = "functionCall(paramA, paramB, paramC);\n" 5024 "void functionDecl(int A, int B, int C);"; 5025 Style.AllowAllArgumentsOnNextLine = false; 5026 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5027 EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n" 5028 " paramC);\n" 5029 "void functionDecl(int A, int B,\n" 5030 " int C);"), 5031 format(Input, Style)); 5032 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5033 EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n" 5034 " paramC);\n" 5035 "void functionDecl(int A, int B,\n" 5036 " int C);"), 5037 format(Input, Style)); 5038 // However, BAS_AlwaysBreak should take precedence over 5039 // AllowAllArgumentsOnNextLine. 5040 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5041 EXPECT_EQ(StringRef("functionCall(\n" 5042 " paramA, paramB, paramC);\n" 5043 "void functionDecl(\n" 5044 " int A, int B, int C);"), 5045 format(Input, Style)); 5046 5047 // When AllowAllArgumentsOnNextLine is set, we prefer breaking before the 5048 // first argument. 5049 Style.AllowAllArgumentsOnNextLine = true; 5050 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5051 EXPECT_EQ(StringRef("functionCall(\n" 5052 " paramA, paramB, paramC);\n" 5053 "void functionDecl(\n" 5054 " int A, int B, int C);"), 5055 format(Input, Style)); 5056 // It wouldn't fit on one line with aligned parameters so this setting 5057 // doesn't change anything for BAS_Align. 5058 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5059 EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n" 5060 " paramC);\n" 5061 "void functionDecl(int A, int B,\n" 5062 " int C);"), 5063 format(Input, Style)); 5064 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5065 EXPECT_EQ(StringRef("functionCall(\n" 5066 " paramA, paramB, paramC);\n" 5067 "void functionDecl(\n" 5068 " int A, int B, int C);"), 5069 format(Input, Style)); 5070 } 5071 5072 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 5073 FormatStyle Style = getLLVMStyle(); 5074 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 5075 5076 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 5077 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 5078 getStyleWithColumns(Style, 45)); 5079 verifyFormat("Constructor() :\n" 5080 " Initializer(FitsOnTheLine) {}", 5081 getStyleWithColumns(Style, 44)); 5082 verifyFormat("Constructor() :\n" 5083 " Initializer(FitsOnTheLine) {}", 5084 getStyleWithColumns(Style, 43)); 5085 5086 verifyFormat("template <typename T>\n" 5087 "Constructor() : Initializer(FitsOnTheLine) {}", 5088 getStyleWithColumns(Style, 50)); 5089 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5090 verifyFormat( 5091 "SomeClass::Constructor() :\n" 5092 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5093 Style); 5094 5095 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 5096 verifyFormat( 5097 "SomeClass::Constructor() :\n" 5098 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5099 Style); 5100 5101 verifyFormat( 5102 "SomeClass::Constructor() :\n" 5103 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5104 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5105 Style); 5106 verifyFormat( 5107 "SomeClass::Constructor() :\n" 5108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5109 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5110 Style); 5111 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5112 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5113 " aaaaaaaaaa(aaaaaa) {}", 5114 Style); 5115 5116 verifyFormat("Constructor() :\n" 5117 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5118 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5119 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5120 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 5121 Style); 5122 5123 verifyFormat("Constructor() :\n" 5124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5126 Style); 5127 5128 verifyFormat("Constructor(int Parameter = 0) :\n" 5129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 5130 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 5131 Style); 5132 verifyFormat("Constructor() :\n" 5133 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 5134 "}", 5135 getStyleWithColumns(Style, 60)); 5136 verifyFormat("Constructor() :\n" 5137 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5138 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 5139 Style); 5140 5141 // Here a line could be saved by splitting the second initializer onto two 5142 // lines, but that is not desirable. 5143 verifyFormat("Constructor() :\n" 5144 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 5145 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 5146 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5147 Style); 5148 5149 FormatStyle OnePerLine = Style; 5150 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5151 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 5152 verifyFormat("SomeClass::Constructor() :\n" 5153 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5154 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5155 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5156 OnePerLine); 5157 verifyFormat("SomeClass::Constructor() :\n" 5158 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 5159 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5160 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5161 OnePerLine); 5162 verifyFormat("MyClass::MyClass(int var) :\n" 5163 " some_var_(var), // 4 space indent\n" 5164 " some_other_var_(var + 1) { // lined up\n" 5165 "}", 5166 OnePerLine); 5167 verifyFormat("Constructor() :\n" 5168 " aaaaa(aaaaaa),\n" 5169 " aaaaa(aaaaaa),\n" 5170 " aaaaa(aaaaaa),\n" 5171 " aaaaa(aaaaaa),\n" 5172 " aaaaa(aaaaaa) {}", 5173 OnePerLine); 5174 verifyFormat("Constructor() :\n" 5175 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 5176 " aaaaaaaaaaaaaaaaaaaaaa) {}", 5177 OnePerLine); 5178 OnePerLine.BinPackParameters = false; 5179 verifyFormat("Constructor() :\n" 5180 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5181 " aaaaaaaaaaa().aaa(),\n" 5182 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5183 OnePerLine); 5184 OnePerLine.ColumnLimit = 60; 5185 verifyFormat("Constructor() :\n" 5186 " aaaaaaaaaaaaaaaaaaaa(a),\n" 5187 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 5188 OnePerLine); 5189 5190 EXPECT_EQ("Constructor() :\n" 5191 " // Comment forcing unwanted break.\n" 5192 " aaaa(aaaa) {}", 5193 format("Constructor() :\n" 5194 " // Comment forcing unwanted break.\n" 5195 " aaaa(aaaa) {}", 5196 Style)); 5197 5198 Style.ColumnLimit = 0; 5199 verifyFormat("SomeClass::Constructor() :\n" 5200 " a(a) {}", 5201 Style); 5202 verifyFormat("SomeClass::Constructor() noexcept :\n" 5203 " a(a) {}", 5204 Style); 5205 verifyFormat("SomeClass::Constructor() :\n" 5206 " a(a), b(b), c(c) {}", 5207 Style); 5208 verifyFormat("SomeClass::Constructor() :\n" 5209 " a(a) {\n" 5210 " foo();\n" 5211 " bar();\n" 5212 "}", 5213 Style); 5214 5215 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 5216 verifyFormat("SomeClass::Constructor() :\n" 5217 " a(a), b(b), c(c) {\n" 5218 "}", 5219 Style); 5220 verifyFormat("SomeClass::Constructor() :\n" 5221 " a(a) {\n" 5222 "}", 5223 Style); 5224 5225 Style.ColumnLimit = 80; 5226 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 5227 Style.ConstructorInitializerIndentWidth = 2; 5228 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 5229 verifyFormat("SomeClass::Constructor() :\n" 5230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5231 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 5232 Style); 5233 5234 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 5235 // well 5236 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 5237 verifyFormat( 5238 "class SomeClass\n" 5239 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5240 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5241 Style); 5242 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 5243 verifyFormat( 5244 "class SomeClass\n" 5245 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5246 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5247 Style); 5248 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 5249 verifyFormat( 5250 "class SomeClass :\n" 5251 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5252 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5253 Style); 5254 } 5255 5256 #ifndef EXPENSIVE_CHECKS 5257 // Expensive checks enables libstdc++ checking which includes validating the 5258 // state of ranges used in std::priority_queue - this blows out the 5259 // runtime/scalability of the function and makes this test unacceptably slow. 5260 TEST_F(FormatTest, MemoizationTests) { 5261 // This breaks if the memoization lookup does not take \c Indent and 5262 // \c LastSpace into account. 5263 verifyFormat( 5264 "extern CFRunLoopTimerRef\n" 5265 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 5266 " CFTimeInterval interval, CFOptionFlags flags,\n" 5267 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 5268 " CFRunLoopTimerContext *context) {}"); 5269 5270 // Deep nesting somewhat works around our memoization. 5271 verifyFormat( 5272 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5273 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5274 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5275 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5276 " aaaaa())))))))))))))))))))))))))))))))))))))));", 5277 getLLVMStyleWithColumns(65)); 5278 verifyFormat( 5279 "aaaaa(\n" 5280 " aaaaa,\n" 5281 " aaaaa(\n" 5282 " aaaaa,\n" 5283 " aaaaa(\n" 5284 " aaaaa,\n" 5285 " aaaaa(\n" 5286 " aaaaa,\n" 5287 " aaaaa(\n" 5288 " aaaaa,\n" 5289 " aaaaa(\n" 5290 " aaaaa,\n" 5291 " aaaaa(\n" 5292 " aaaaa,\n" 5293 " aaaaa(\n" 5294 " aaaaa,\n" 5295 " aaaaa(\n" 5296 " aaaaa,\n" 5297 " aaaaa(\n" 5298 " aaaaa,\n" 5299 " aaaaa(\n" 5300 " aaaaa,\n" 5301 " aaaaa(\n" 5302 " aaaaa,\n" 5303 " aaaaa))))))))))));", 5304 getLLVMStyleWithColumns(65)); 5305 verifyFormat( 5306 "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" 5307 " a),\n" 5308 " a),\n" 5309 " a),\n" 5310 " a),\n" 5311 " a),\n" 5312 " a),\n" 5313 " a),\n" 5314 " a),\n" 5315 " a),\n" 5316 " a),\n" 5317 " a),\n" 5318 " a),\n" 5319 " a),\n" 5320 " a),\n" 5321 " a),\n" 5322 " a),\n" 5323 " a)", 5324 getLLVMStyleWithColumns(65)); 5325 5326 // This test takes VERY long when memoization is broken. 5327 FormatStyle OnePerLine = getLLVMStyle(); 5328 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5329 OnePerLine.BinPackParameters = false; 5330 std::string input = "Constructor()\n" 5331 " : aaaa(a,\n"; 5332 for (unsigned i = 0, e = 80; i != e; ++i) { 5333 input += " a,\n"; 5334 } 5335 input += " a) {}"; 5336 verifyFormat(input, OnePerLine); 5337 } 5338 #endif 5339 5340 TEST_F(FormatTest, BreaksAsHighAsPossible) { 5341 verifyFormat( 5342 "void f() {\n" 5343 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 5344 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 5345 " f();\n" 5346 "}"); 5347 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 5348 " Intervals[i - 1].getRange().getLast()) {\n}"); 5349 } 5350 5351 TEST_F(FormatTest, BreaksFunctionDeclarations) { 5352 // Principially, we break function declarations in a certain order: 5353 // 1) break amongst arguments. 5354 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 5355 " Cccccccccccccc cccccccccccccc);"); 5356 verifyFormat("template <class TemplateIt>\n" 5357 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 5358 " TemplateIt *stop) {}"); 5359 5360 // 2) break after return type. 5361 verifyFormat( 5362 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5363 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 5364 getGoogleStyle()); 5365 5366 // 3) break after (. 5367 verifyFormat( 5368 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 5369 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 5370 getGoogleStyle()); 5371 5372 // 4) break before after nested name specifiers. 5373 verifyFormat( 5374 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5375 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 5376 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 5377 getGoogleStyle()); 5378 5379 // However, there are exceptions, if a sufficient amount of lines can be 5380 // saved. 5381 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 5382 // more adjusting. 5383 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5384 " Cccccccccccccc cccccccccc,\n" 5385 " Cccccccccccccc cccccccccc,\n" 5386 " Cccccccccccccc cccccccccc,\n" 5387 " Cccccccccccccc cccccccccc);"); 5388 verifyFormat( 5389 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5390 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5391 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5392 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 5393 getGoogleStyle()); 5394 verifyFormat( 5395 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5396 " Cccccccccccccc cccccccccc,\n" 5397 " Cccccccccccccc cccccccccc,\n" 5398 " Cccccccccccccc cccccccccc,\n" 5399 " Cccccccccccccc cccccccccc,\n" 5400 " Cccccccccccccc cccccccccc,\n" 5401 " Cccccccccccccc cccccccccc);"); 5402 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5403 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5404 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5405 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5406 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 5407 5408 // Break after multi-line parameters. 5409 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5412 " bbbb bbbb);"); 5413 verifyFormat("void SomeLoooooooooooongFunction(\n" 5414 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5415 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5416 " int bbbbbbbbbbbbb);"); 5417 5418 // Treat overloaded operators like other functions. 5419 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5420 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 5421 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5422 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 5423 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5424 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 5425 verifyGoogleFormat( 5426 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 5427 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5428 verifyGoogleFormat( 5429 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 5430 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5431 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5432 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5433 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 5434 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5435 verifyGoogleFormat( 5436 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 5437 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5438 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 5439 verifyGoogleFormat("template <typename T>\n" 5440 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5441 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 5442 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 5443 5444 FormatStyle Style = getLLVMStyle(); 5445 Style.PointerAlignment = FormatStyle::PAS_Left; 5446 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5447 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 5448 Style); 5449 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 5450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5451 Style); 5452 } 5453 5454 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 5455 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 5456 // Prefer keeping `::` followed by `operator` together. 5457 EXPECT_EQ("const aaaa::bbbbbbb &\n" 5458 "ccccccccc::operator++() {\n" 5459 " stuff();\n" 5460 "}", 5461 format("const aaaa::bbbbbbb\n" 5462 "&ccccccccc::operator++() { stuff(); }", 5463 getLLVMStyleWithColumns(40))); 5464 } 5465 5466 TEST_F(FormatTest, TrailingReturnType) { 5467 verifyFormat("auto foo() -> int;\n"); 5468 // correct trailing return type spacing 5469 verifyFormat("auto operator->() -> int;\n"); 5470 verifyFormat("auto operator++(int) -> int;\n"); 5471 5472 verifyFormat("struct S {\n" 5473 " auto bar() const -> int;\n" 5474 "};"); 5475 verifyFormat("template <size_t Order, typename T>\n" 5476 "auto load_img(const std::string &filename)\n" 5477 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5478 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5479 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5480 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5481 verifyFormat("template <typename T>\n" 5482 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5483 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5484 5485 // Not trailing return types. 5486 verifyFormat("void f() { auto a = b->c(); }"); 5487 } 5488 5489 TEST_F(FormatTest, DeductionGuides) { 5490 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5491 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5492 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5493 verifyFormat( 5494 "template <class... T>\n" 5495 "array(T &&...t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5496 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5497 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5498 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5499 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5500 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5501 verifyFormat("template <class T> x() -> x<1>;"); 5502 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5503 5504 // Ensure not deduction guides. 5505 verifyFormat("c()->f<int>();"); 5506 verifyFormat("x()->foo<1>;"); 5507 verifyFormat("x = p->foo<3>();"); 5508 verifyFormat("x()->x<1>();"); 5509 verifyFormat("x()->x<1>;"); 5510 } 5511 5512 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5513 // Avoid breaking before trailing 'const' or other trailing annotations, if 5514 // they are not function-like. 5515 FormatStyle Style = getGoogleStyle(); 5516 Style.ColumnLimit = 47; 5517 verifyFormat("void someLongFunction(\n" 5518 " int someLoooooooooooooongParameter) const {\n}", 5519 getLLVMStyleWithColumns(47)); 5520 verifyFormat("LoooooongReturnType\n" 5521 "someLoooooooongFunction() const {}", 5522 getLLVMStyleWithColumns(47)); 5523 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5524 " const {}", 5525 Style); 5526 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5527 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5528 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5529 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5530 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5531 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5532 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5533 " aaaaaaaaaaa aaaaa) const override;"); 5534 verifyGoogleFormat( 5535 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5536 " const override;"); 5537 5538 // Even if the first parameter has to be wrapped. 5539 verifyFormat("void someLongFunction(\n" 5540 " int someLongParameter) const {}", 5541 getLLVMStyleWithColumns(46)); 5542 verifyFormat("void someLongFunction(\n" 5543 " int someLongParameter) const {}", 5544 Style); 5545 verifyFormat("void someLongFunction(\n" 5546 " int someLongParameter) override {}", 5547 Style); 5548 verifyFormat("void someLongFunction(\n" 5549 " int someLongParameter) OVERRIDE {}", 5550 Style); 5551 verifyFormat("void someLongFunction(\n" 5552 " int someLongParameter) final {}", 5553 Style); 5554 verifyFormat("void someLongFunction(\n" 5555 " int someLongParameter) FINAL {}", 5556 Style); 5557 verifyFormat("void someLongFunction(\n" 5558 " int parameter) const override {}", 5559 Style); 5560 5561 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5562 verifyFormat("void someLongFunction(\n" 5563 " int someLongParameter) const\n" 5564 "{\n" 5565 "}", 5566 Style); 5567 5568 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5569 verifyFormat("void someLongFunction(\n" 5570 " int someLongParameter) const\n" 5571 " {\n" 5572 " }", 5573 Style); 5574 5575 // Unless these are unknown annotations. 5576 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5577 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5578 " LONG_AND_UGLY_ANNOTATION;"); 5579 5580 // Breaking before function-like trailing annotations is fine to keep them 5581 // close to their arguments. 5582 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5583 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5584 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5585 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5586 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5587 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5588 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5589 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5590 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5591 5592 verifyFormat( 5593 "void aaaaaaaaaaaaaaaaaa()\n" 5594 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5595 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5596 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5597 " __attribute__((unused));"); 5598 verifyGoogleFormat( 5599 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5600 " GUARDED_BY(aaaaaaaaaaaa);"); 5601 verifyGoogleFormat( 5602 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5603 " GUARDED_BY(aaaaaaaaaaaa);"); 5604 verifyGoogleFormat( 5605 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5606 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5607 verifyGoogleFormat( 5608 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5609 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5610 } 5611 5612 TEST_F(FormatTest, FunctionAnnotations) { 5613 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5614 "int OldFunction(const string ¶meter) {}"); 5615 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5616 "string OldFunction(const string ¶meter) {}"); 5617 verifyFormat("template <typename T>\n" 5618 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5619 "string OldFunction(const string ¶meter) {}"); 5620 5621 // Not function annotations. 5622 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5623 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5624 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5625 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5626 verifyFormat("MACRO(abc).function() // wrap\n" 5627 " << abc;"); 5628 verifyFormat("MACRO(abc)->function() // wrap\n" 5629 " << abc;"); 5630 verifyFormat("MACRO(abc)::function() // wrap\n" 5631 " << abc;"); 5632 } 5633 5634 TEST_F(FormatTest, BreaksDesireably) { 5635 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5636 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5637 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5638 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5640 "}"); 5641 5642 verifyFormat( 5643 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5645 5646 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5648 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5649 5650 verifyFormat( 5651 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5652 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5654 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5656 5657 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5658 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5659 5660 verifyFormat( 5661 "void f() {\n" 5662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5663 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5664 "}"); 5665 verifyFormat( 5666 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5668 verifyFormat( 5669 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5671 verifyFormat( 5672 "aaaaaa(aaa,\n" 5673 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5674 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5675 " aaaa);"); 5676 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5677 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5678 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5679 5680 // Indent consistently independent of call expression and unary operator. 5681 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5682 " dddddddddddddddddddddddddddddd));"); 5683 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5684 " dddddddddddddddddddddddddddddd));"); 5685 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5686 " dddddddddddddddddddddddddddddd));"); 5687 5688 // This test case breaks on an incorrect memoization, i.e. an optimization not 5689 // taking into account the StopAt value. 5690 verifyFormat( 5691 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5692 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5693 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5694 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5695 5696 verifyFormat("{\n {\n {\n" 5697 " Annotation.SpaceRequiredBefore =\n" 5698 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5699 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5700 " }\n }\n}"); 5701 5702 // Break on an outer level if there was a break on an inner level. 5703 EXPECT_EQ("f(g(h(a, // comment\n" 5704 " b, c),\n" 5705 " d, e),\n" 5706 " x, y);", 5707 format("f(g(h(a, // comment\n" 5708 " b, c), d, e), x, y);")); 5709 5710 // Prefer breaking similar line breaks. 5711 verifyFormat( 5712 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5713 " NSTrackingMouseEnteredAndExited |\n" 5714 " NSTrackingActiveAlways;"); 5715 } 5716 5717 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5718 FormatStyle NoBinPacking = getGoogleStyle(); 5719 NoBinPacking.BinPackParameters = false; 5720 NoBinPacking.BinPackArguments = true; 5721 verifyFormat("void f() {\n" 5722 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5724 "}", 5725 NoBinPacking); 5726 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5727 " int aaaaaaaaaaaaaaaaaaaa,\n" 5728 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5729 NoBinPacking); 5730 5731 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5732 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5733 " vector<int> bbbbbbbbbbbbbbb);", 5734 NoBinPacking); 5735 // FIXME: This behavior difference is probably not wanted. However, currently 5736 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5737 // template arguments from BreakBeforeParameter being set because of the 5738 // one-per-line formatting. 5739 verifyFormat( 5740 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5741 " aaaaaaaaaa> aaaaaaaaaa);", 5742 NoBinPacking); 5743 verifyFormat( 5744 "void fffffffffff(\n" 5745 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5746 " aaaaaaaaaa);"); 5747 } 5748 5749 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5750 FormatStyle NoBinPacking = getGoogleStyle(); 5751 NoBinPacking.BinPackParameters = false; 5752 NoBinPacking.BinPackArguments = false; 5753 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5754 " aaaaaaaaaaaaaaaaaaaa,\n" 5755 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5756 NoBinPacking); 5757 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5758 " aaaaaaaaaaaaa,\n" 5759 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5760 NoBinPacking); 5761 verifyFormat( 5762 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5763 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5765 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5767 NoBinPacking); 5768 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5769 " .aaaaaaaaaaaaaaaaaa();", 5770 NoBinPacking); 5771 verifyFormat("void f() {\n" 5772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5773 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5774 "}", 5775 NoBinPacking); 5776 5777 verifyFormat( 5778 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5779 " aaaaaaaaaaaa,\n" 5780 " aaaaaaaaaaaa);", 5781 NoBinPacking); 5782 verifyFormat( 5783 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5784 " ddddddddddddddddddddddddddddd),\n" 5785 " test);", 5786 NoBinPacking); 5787 5788 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5789 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5790 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5791 " aaaaaaaaaaaaaaaaaa;", 5792 NoBinPacking); 5793 verifyFormat("a(\"a\"\n" 5794 " \"a\",\n" 5795 " a);"); 5796 5797 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5798 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5799 " aaaaaaaaa,\n" 5800 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5801 NoBinPacking); 5802 verifyFormat( 5803 "void f() {\n" 5804 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5805 " .aaaaaaa();\n" 5806 "}", 5807 NoBinPacking); 5808 verifyFormat( 5809 "template <class SomeType, class SomeOtherType>\n" 5810 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5811 NoBinPacking); 5812 } 5813 5814 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5815 FormatStyle Style = getLLVMStyleWithColumns(15); 5816 Style.ExperimentalAutoDetectBinPacking = true; 5817 EXPECT_EQ("aaa(aaaa,\n" 5818 " aaaa,\n" 5819 " aaaa);\n" 5820 "aaa(aaaa,\n" 5821 " aaaa,\n" 5822 " aaaa);", 5823 format("aaa(aaaa,\n" // one-per-line 5824 " aaaa,\n" 5825 " aaaa );\n" 5826 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5827 Style)); 5828 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5829 " aaaa);\n" 5830 "aaa(aaaa, aaaa,\n" 5831 " aaaa);", 5832 format("aaa(aaaa, aaaa,\n" // bin-packed 5833 " aaaa );\n" 5834 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5835 Style)); 5836 } 5837 5838 TEST_F(FormatTest, FormatsBuilderPattern) { 5839 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5840 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5841 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5842 " .StartsWith(\".init\", ORDER_INIT)\n" 5843 " .StartsWith(\".fini\", ORDER_FINI)\n" 5844 " .StartsWith(\".hash\", ORDER_HASH)\n" 5845 " .Default(ORDER_TEXT);\n"); 5846 5847 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5848 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5849 verifyFormat("aaaaaaa->aaaaaaa\n" 5850 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5852 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5853 verifyFormat( 5854 "aaaaaaa->aaaaaaa\n" 5855 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5856 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5857 verifyFormat( 5858 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5859 " aaaaaaaaaaaaaa);"); 5860 verifyFormat( 5861 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5862 " aaaaaa->aaaaaaaaaaaa()\n" 5863 " ->aaaaaaaaaaaaaaaa(\n" 5864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5865 " ->aaaaaaaaaaaaaaaaa();"); 5866 verifyGoogleFormat( 5867 "void f() {\n" 5868 " someo->Add((new util::filetools::Handler(dir))\n" 5869 " ->OnEvent1(NewPermanentCallback(\n" 5870 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5871 " ->OnEvent2(NewPermanentCallback(\n" 5872 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5873 " ->OnEvent3(NewPermanentCallback(\n" 5874 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5875 " ->OnEvent5(NewPermanentCallback(\n" 5876 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5877 " ->OnEvent6(NewPermanentCallback(\n" 5878 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5879 "}"); 5880 5881 verifyFormat( 5882 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5883 verifyFormat("aaaaaaaaaaaaaaa()\n" 5884 " .aaaaaaaaaaaaaaa()\n" 5885 " .aaaaaaaaaaaaaaa()\n" 5886 " .aaaaaaaaaaaaaaa()\n" 5887 " .aaaaaaaaaaaaaaa();"); 5888 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5889 " .aaaaaaaaaaaaaaa()\n" 5890 " .aaaaaaaaaaaaaaa()\n" 5891 " .aaaaaaaaaaaaaaa();"); 5892 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5893 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5894 " .aaaaaaaaaaaaaaa();"); 5895 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5896 " ->aaaaaaaaaaaaaae(0)\n" 5897 " ->aaaaaaaaaaaaaaa();"); 5898 5899 // Don't linewrap after very short segments. 5900 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5901 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5902 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5903 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5904 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5905 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5906 verifyFormat("aaa()\n" 5907 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5908 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5909 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5910 5911 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5912 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5913 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5914 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5915 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5916 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5917 5918 // Prefer not to break after empty parentheses. 5919 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5920 " First->LastNewlineOffset);"); 5921 5922 // Prefer not to create "hanging" indents. 5923 verifyFormat( 5924 "return !soooooooooooooome_map\n" 5925 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5926 " .second;"); 5927 verifyFormat( 5928 "return aaaaaaaaaaaaaaaa\n" 5929 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5930 " .aaaa(aaaaaaaaaaaaaa);"); 5931 // No hanging indent here. 5932 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5934 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5935 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5936 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5937 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5938 getLLVMStyleWithColumns(60)); 5939 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5940 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5941 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5942 getLLVMStyleWithColumns(59)); 5943 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5945 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5946 5947 // Dont break if only closing statements before member call 5948 verifyFormat("test() {\n" 5949 " ([]() -> {\n" 5950 " int b = 32;\n" 5951 " return 3;\n" 5952 " }).foo();\n" 5953 "}"); 5954 verifyFormat("test() {\n" 5955 " (\n" 5956 " []() -> {\n" 5957 " int b = 32;\n" 5958 " return 3;\n" 5959 " },\n" 5960 " foo, bar)\n" 5961 " .foo();\n" 5962 "}"); 5963 verifyFormat("test() {\n" 5964 " ([]() -> {\n" 5965 " int b = 32;\n" 5966 " return 3;\n" 5967 " })\n" 5968 " .foo()\n" 5969 " .bar();\n" 5970 "}"); 5971 verifyFormat("test() {\n" 5972 " ([]() -> {\n" 5973 " int b = 32;\n" 5974 " return 3;\n" 5975 " })\n" 5976 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5977 " \"bbbb\");\n" 5978 "}", 5979 getLLVMStyleWithColumns(30)); 5980 } 5981 5982 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5983 verifyFormat( 5984 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5985 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5986 verifyFormat( 5987 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5988 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5989 5990 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5991 " ccccccccccccccccccccccccc) {\n}"); 5992 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5993 " ccccccccccccccccccccccccc) {\n}"); 5994 5995 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5996 " ccccccccccccccccccccccccc) {\n}"); 5997 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5998 " ccccccccccccccccccccccccc) {\n}"); 5999 6000 verifyFormat( 6001 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 6002 " ccccccccccccccccccccccccc) {\n}"); 6003 verifyFormat( 6004 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 6005 " ccccccccccccccccccccccccc) {\n}"); 6006 6007 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 6008 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 6009 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 6010 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 6011 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 6012 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 6013 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 6014 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 6015 6016 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 6017 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 6018 " aaaaaaaaaaaaaaa != aa) {\n}"); 6019 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 6020 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 6021 " aaaaaaaaaaaaaaa != aa) {\n}"); 6022 } 6023 6024 TEST_F(FormatTest, BreaksAfterAssignments) { 6025 verifyFormat( 6026 "unsigned Cost =\n" 6027 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 6028 " SI->getPointerAddressSpaceee());\n"); 6029 verifyFormat( 6030 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 6031 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 6032 6033 verifyFormat( 6034 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 6035 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 6036 verifyFormat("unsigned OriginalStartColumn =\n" 6037 " SourceMgr.getSpellingColumnNumber(\n" 6038 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 6039 " 1;"); 6040 } 6041 6042 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 6043 FormatStyle Style = getLLVMStyle(); 6044 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6045 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 6046 Style); 6047 6048 Style.PenaltyBreakAssignment = 20; 6049 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 6050 " cccccccccccccccccccccccccc;", 6051 Style); 6052 } 6053 6054 TEST_F(FormatTest, AlignsAfterAssignments) { 6055 verifyFormat( 6056 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6057 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6058 verifyFormat( 6059 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6060 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6061 verifyFormat( 6062 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6063 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6064 verifyFormat( 6065 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6066 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 6067 verifyFormat( 6068 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 6069 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 6070 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 6071 } 6072 6073 TEST_F(FormatTest, AlignsAfterReturn) { 6074 verifyFormat( 6075 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6076 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6077 verifyFormat( 6078 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6079 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 6080 verifyFormat( 6081 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 6082 " aaaaaaaaaaaaaaaaaaaaaa();"); 6083 verifyFormat( 6084 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 6085 " aaaaaaaaaaaaaaaaaaaaaa());"); 6086 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6088 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6089 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 6090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6091 verifyFormat("return\n" 6092 " // true if code is one of a or b.\n" 6093 " code == a || code == b;"); 6094 } 6095 6096 TEST_F(FormatTest, AlignsAfterOpenBracket) { 6097 verifyFormat( 6098 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 6099 " aaaaaaaaa aaaaaaa) {}"); 6100 verifyFormat( 6101 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 6102 " aaaaaaaaaaa aaaaaaaaa);"); 6103 verifyFormat( 6104 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 6105 " aaaaaaaaaaaaaaaaaaaaa));"); 6106 FormatStyle Style = getLLVMStyle(); 6107 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6108 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6109 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 6110 Style); 6111 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 6112 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 6113 Style); 6114 verifyFormat("SomeLongVariableName->someFunction(\n" 6115 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 6116 Style); 6117 verifyFormat( 6118 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 6119 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 6120 Style); 6121 verifyFormat( 6122 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 6123 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6124 Style); 6125 verifyFormat( 6126 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 6127 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 6128 Style); 6129 6130 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 6131 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 6132 " b));", 6133 Style); 6134 6135 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6136 Style.BinPackArguments = false; 6137 Style.BinPackParameters = false; 6138 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6139 " aaaaaaaaaaa aaaaaaaa,\n" 6140 " aaaaaaaaa aaaaaaa,\n" 6141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 6142 Style); 6143 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 6144 " aaaaaaaaaaa aaaaaaaaa,\n" 6145 " aaaaaaaaaaa aaaaaaaaa,\n" 6146 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6147 Style); 6148 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 6149 " aaaaaaaaaaaaaaa,\n" 6150 " aaaaaaaaaaaaaaaaaaaaa,\n" 6151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 6152 Style); 6153 verifyFormat( 6154 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 6155 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 6156 Style); 6157 verifyFormat( 6158 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 6159 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 6160 Style); 6161 verifyFormat( 6162 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 6163 " aaaaaaaaaaaaaaaaaaaaa(\n" 6164 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 6165 " aaaaaaaaaaaaaaaa);", 6166 Style); 6167 verifyFormat( 6168 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 6169 " aaaaaaaaaaaaaaaaaaaaa(\n" 6170 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 6171 " aaaaaaaaaaaaaaaa);", 6172 Style); 6173 } 6174 6175 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 6176 FormatStyle Style = getLLVMStyleWithColumns(40); 6177 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6178 " bbbbbbbbbbbbbbbbbbbbbb);", 6179 Style); 6180 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 6181 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6182 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6183 " bbbbbbbbbbbbbbbbbbbbbb);", 6184 Style); 6185 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6186 Style.AlignOperands = FormatStyle::OAS_Align; 6187 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6188 " bbbbbbbbbbbbbbbbbbbbbb);", 6189 Style); 6190 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6191 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6192 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6193 " bbbbbbbbbbbbbbbbbbbbbb);", 6194 Style); 6195 } 6196 6197 TEST_F(FormatTest, BreaksConditionalExpressions) { 6198 verifyFormat( 6199 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6200 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6201 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6202 verifyFormat( 6203 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6204 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6205 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6206 verifyFormat( 6207 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6208 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6209 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 6210 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6211 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6212 verifyFormat( 6213 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 6214 " : aaaaaaaaaaaaa);"); 6215 verifyFormat( 6216 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6217 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6218 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6219 " aaaaaaaaaaaaa);"); 6220 verifyFormat( 6221 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6222 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6223 " aaaaaaaaaaaaa);"); 6224 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6225 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6227 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6228 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6229 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6231 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6232 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6233 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6234 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6235 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6236 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6237 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6238 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6239 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6240 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6241 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6242 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6243 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6244 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6246 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6247 " : aaaaaaaaaaaaaaaa;"); 6248 verifyFormat( 6249 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6250 " ? aaaaaaaaaaaaaaa\n" 6251 " : aaaaaaaaaaaaaaa;"); 6252 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6253 " aaaaaaaaa\n" 6254 " ? b\n" 6255 " : c);"); 6256 verifyFormat("return aaaa == bbbb\n" 6257 " // comment\n" 6258 " ? aaaa\n" 6259 " : bbbb;"); 6260 verifyFormat("unsigned Indent =\n" 6261 " format(TheLine.First,\n" 6262 " IndentForLevel[TheLine.Level] >= 0\n" 6263 " ? IndentForLevel[TheLine.Level]\n" 6264 " : TheLine * 2,\n" 6265 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6266 getLLVMStyleWithColumns(60)); 6267 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6268 " ? aaaaaaaaaaaaaaa\n" 6269 " : bbbbbbbbbbbbbbb //\n" 6270 " ? ccccccccccccccc\n" 6271 " : ddddddddddddddd;"); 6272 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6273 " ? aaaaaaaaaaaaaaa\n" 6274 " : (bbbbbbbbbbbbbbb //\n" 6275 " ? ccccccccccccccc\n" 6276 " : ddddddddddddddd);"); 6277 verifyFormat( 6278 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6279 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6280 " aaaaaaaaaaaaaaaaaaaaa +\n" 6281 " aaaaaaaaaaaaaaaaaaaaa\n" 6282 " : aaaaaaaaaa;"); 6283 verifyFormat( 6284 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6285 " : aaaaaaaaaaaaaaaaaaaaaa\n" 6286 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6287 6288 FormatStyle NoBinPacking = getLLVMStyle(); 6289 NoBinPacking.BinPackArguments = false; 6290 verifyFormat( 6291 "void f() {\n" 6292 " g(aaa,\n" 6293 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6295 " ? aaaaaaaaaaaaaaa\n" 6296 " : aaaaaaaaaaaaaaa);\n" 6297 "}", 6298 NoBinPacking); 6299 verifyFormat( 6300 "void f() {\n" 6301 " g(aaa,\n" 6302 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6304 " ?: aaaaaaaaaaaaaaa);\n" 6305 "}", 6306 NoBinPacking); 6307 6308 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 6309 " // comment.\n" 6310 " ccccccccccccccccccccccccccccccccccccccc\n" 6311 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6312 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 6313 6314 // Assignments in conditional expressions. Apparently not uncommon :-(. 6315 verifyFormat("return a != b\n" 6316 " // comment\n" 6317 " ? a = b\n" 6318 " : a = b;"); 6319 verifyFormat("return a != b\n" 6320 " // comment\n" 6321 " ? a = a != b\n" 6322 " // comment\n" 6323 " ? a = b\n" 6324 " : a\n" 6325 " : a;\n"); 6326 verifyFormat("return a != b\n" 6327 " // comment\n" 6328 " ? a\n" 6329 " : a = a != b\n" 6330 " // comment\n" 6331 " ? a = b\n" 6332 " : a;"); 6333 6334 // Chained conditionals 6335 FormatStyle Style = getLLVMStyle(); 6336 Style.ColumnLimit = 70; 6337 Style.AlignOperands = FormatStyle::OAS_Align; 6338 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6339 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6340 " : 3333333333333333;", 6341 Style); 6342 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6343 " : bbbbbbbbbb ? 2222222222222222\n" 6344 " : 3333333333333333;", 6345 Style); 6346 verifyFormat("return aaaaaaaaaa ? 1111111111111111\n" 6347 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 6348 " : 3333333333333333;", 6349 Style); 6350 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6351 " : bbbbbbbbbbbbbb ? 222222\n" 6352 " : 333333;", 6353 Style); 6354 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6355 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6356 " : cccccccccccccc ? 3333333333333333\n" 6357 " : 4444444444444444;", 6358 Style); 6359 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n" 6360 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6361 " : 3333333333333333;", 6362 Style); 6363 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6364 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6365 " : (aaa ? bbb : ccc);", 6366 Style); 6367 verifyFormat( 6368 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6369 " : cccccccccccccccccc)\n" 6370 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6371 " : 3333333333333333;", 6372 Style); 6373 verifyFormat( 6374 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6375 " : cccccccccccccccccc)\n" 6376 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6377 " : 3333333333333333;", 6378 Style); 6379 verifyFormat( 6380 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6381 " : dddddddddddddddddd)\n" 6382 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6383 " : 3333333333333333;", 6384 Style); 6385 verifyFormat( 6386 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6387 " : dddddddddddddddddd)\n" 6388 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6389 " : 3333333333333333;", 6390 Style); 6391 verifyFormat( 6392 "return aaaaaaaaa ? 1111111111111111\n" 6393 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6394 " : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6395 " : dddddddddddddddddd)\n", 6396 Style); 6397 verifyFormat( 6398 "return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6399 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6400 " : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6401 " : cccccccccccccccccc);", 6402 Style); 6403 verifyFormat( 6404 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6405 " : ccccccccccccccc ? dddddddddddddddddd\n" 6406 " : eeeeeeeeeeeeeeeeee)\n" 6407 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6408 " : 3333333333333333;", 6409 Style); 6410 verifyFormat( 6411 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6412 " : ccccccccccccccc ? dddddddddddddddddd\n" 6413 " : eeeeeeeeeeeeeeeeee)\n" 6414 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6415 " : 3333333333333333;", 6416 Style); 6417 verifyFormat( 6418 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6419 " : cccccccccccc ? dddddddddddddddddd\n" 6420 " : eeeeeeeeeeeeeeeeee)\n" 6421 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6422 " : 3333333333333333;", 6423 Style); 6424 verifyFormat( 6425 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6426 " : cccccccccccccccccc\n" 6427 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6428 " : 3333333333333333;", 6429 Style); 6430 verifyFormat( 6431 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6432 " : cccccccccccccccc ? dddddddddddddddddd\n" 6433 " : eeeeeeeeeeeeeeeeee\n" 6434 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6435 " : 3333333333333333;", 6436 Style); 6437 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n" 6438 " ? (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6439 " : cccccccccccccccccc ? dddddddddddddddddd\n" 6440 " : eeeeeeeeeeeeeeeeee)\n" 6441 " : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6442 " : 3333333333333333;", 6443 Style); 6444 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n" 6445 " ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6446 " : cccccccccccccccc ? dddddddddddddddddd\n" 6447 " : eeeeeeeeeeeeeeeeee\n" 6448 " : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6449 " : 3333333333333333;", 6450 Style); 6451 6452 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6453 Style.BreakBeforeTernaryOperators = false; 6454 // FIXME: Aligning the question marks is weird given DontAlign. 6455 // Consider disabling this alignment in this case. Also check whether this 6456 // will render the adjustment from https://reviews.llvm.org/D82199 6457 // unnecessary. 6458 verifyFormat("int x = aaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa :\n" 6459 " bbbb ? cccccccccccccccccc :\n" 6460 " ddddd;\n", 6461 Style); 6462 } 6463 6464 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 6465 FormatStyle Style = getLLVMStyle(); 6466 Style.BreakBeforeTernaryOperators = false; 6467 Style.ColumnLimit = 70; 6468 verifyFormat( 6469 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6470 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6472 Style); 6473 verifyFormat( 6474 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6475 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6476 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6477 Style); 6478 verifyFormat( 6479 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6481 Style); 6482 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 6483 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6484 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6485 Style); 6486 verifyFormat( 6487 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 6488 " aaaaaaaaaaaaa);", 6489 Style); 6490 verifyFormat( 6491 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6492 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6493 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6494 " aaaaaaaaaaaaa);", 6495 Style); 6496 verifyFormat( 6497 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6498 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6499 " aaaaaaaaaaaaa);", 6500 Style); 6501 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6506 Style); 6507 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6509 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6510 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6511 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6513 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6514 Style); 6515 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6516 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 6517 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6519 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6520 Style); 6521 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6522 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6523 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6524 Style); 6525 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6528 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6529 Style); 6530 verifyFormat( 6531 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6532 " aaaaaaaaaaaaaaa :\n" 6533 " aaaaaaaaaaaaaaa;", 6534 Style); 6535 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6536 " aaaaaaaaa ?\n" 6537 " b :\n" 6538 " c);", 6539 Style); 6540 verifyFormat("unsigned Indent =\n" 6541 " format(TheLine.First,\n" 6542 " IndentForLevel[TheLine.Level] >= 0 ?\n" 6543 " IndentForLevel[TheLine.Level] :\n" 6544 " TheLine * 2,\n" 6545 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6546 Style); 6547 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6548 " aaaaaaaaaaaaaaa :\n" 6549 " bbbbbbbbbbbbbbb ? //\n" 6550 " ccccccccccccccc :\n" 6551 " ddddddddddddddd;", 6552 Style); 6553 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6554 " aaaaaaaaaaaaaaa :\n" 6555 " (bbbbbbbbbbbbbbb ? //\n" 6556 " ccccccccccccccc :\n" 6557 " ddddddddddddddd);", 6558 Style); 6559 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6560 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 6561 " ccccccccccccccccccccccccccc;", 6562 Style); 6563 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6564 " aaaaa :\n" 6565 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 6566 Style); 6567 6568 // Chained conditionals 6569 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6570 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6571 " 3333333333333333;", 6572 Style); 6573 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6574 " bbbbbbbbbb ? 2222222222222222 :\n" 6575 " 3333333333333333;", 6576 Style); 6577 verifyFormat("return aaaaaaaaaa ? 1111111111111111 :\n" 6578 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6579 " 3333333333333333;", 6580 Style); 6581 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6582 " bbbbbbbbbbbbbbbb ? 222222 :\n" 6583 " 333333;", 6584 Style); 6585 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6586 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6587 " cccccccccccccccc ? 3333333333333333 :\n" 6588 " 4444444444444444;", 6589 Style); 6590 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n" 6591 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6592 " 3333333333333333;", 6593 Style); 6594 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6595 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6596 " (aaa ? bbb : ccc);", 6597 Style); 6598 verifyFormat( 6599 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6600 " cccccccccccccccccc) :\n" 6601 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6602 " 3333333333333333;", 6603 Style); 6604 verifyFormat( 6605 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6606 " cccccccccccccccccc) :\n" 6607 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6608 " 3333333333333333;", 6609 Style); 6610 verifyFormat( 6611 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6612 " dddddddddddddddddd) :\n" 6613 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6614 " 3333333333333333;", 6615 Style); 6616 verifyFormat( 6617 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6618 " dddddddddddddddddd) :\n" 6619 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6620 " 3333333333333333;", 6621 Style); 6622 verifyFormat( 6623 "return aaaaaaaaa ? 1111111111111111 :\n" 6624 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6625 " a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6626 " dddddddddddddddddd)\n", 6627 Style); 6628 verifyFormat( 6629 "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6630 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6631 " (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6632 " cccccccccccccccccc);", 6633 Style); 6634 verifyFormat( 6635 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6636 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6637 " eeeeeeeeeeeeeeeeee) :\n" 6638 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6639 " 3333333333333333;", 6640 Style); 6641 verifyFormat( 6642 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6643 " ccccccccccccc ? dddddddddddddddddd :\n" 6644 " eeeeeeeeeeeeeeeeee) :\n" 6645 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6646 " 3333333333333333;", 6647 Style); 6648 verifyFormat( 6649 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6650 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6651 " eeeeeeeeeeeeeeeeee) :\n" 6652 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6653 " 3333333333333333;", 6654 Style); 6655 verifyFormat( 6656 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6657 " cccccccccccccccccc :\n" 6658 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6659 " 3333333333333333;", 6660 Style); 6661 verifyFormat( 6662 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6663 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6664 " eeeeeeeeeeeeeeeeee :\n" 6665 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6666 " 3333333333333333;", 6667 Style); 6668 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6669 " (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6670 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6671 " eeeeeeeeeeeeeeeeee) :\n" 6672 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6673 " 3333333333333333;", 6674 Style); 6675 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6676 " aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6677 " cccccccccccccccccccc ? dddddddddddddddddd :\n" 6678 " eeeeeeeeeeeeeeeeee :\n" 6679 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6680 " 3333333333333333;", 6681 Style); 6682 } 6683 6684 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 6685 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 6686 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 6687 verifyFormat("bool a = true, b = false;"); 6688 6689 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 6691 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 6692 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 6693 verifyFormat( 6694 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 6695 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 6696 " d = e && f;"); 6697 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 6698 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 6699 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6700 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 6701 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 6702 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 6703 6704 FormatStyle Style = getGoogleStyle(); 6705 Style.PointerAlignment = FormatStyle::PAS_Left; 6706 Style.DerivePointerAlignment = false; 6707 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6708 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 6709 " *b = bbbbbbbbbbbbbbbbbbb;", 6710 Style); 6711 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6712 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 6713 Style); 6714 verifyFormat("vector<int*> a, b;", Style); 6715 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 6716 } 6717 6718 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6719 verifyFormat("arr[foo ? bar : baz];"); 6720 verifyFormat("f()[foo ? bar : baz];"); 6721 verifyFormat("(a + b)[foo ? bar : baz];"); 6722 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6723 } 6724 6725 TEST_F(FormatTest, AlignsStringLiterals) { 6726 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6727 " \"short literal\");"); 6728 verifyFormat( 6729 "looooooooooooooooooooooooongFunction(\n" 6730 " \"short literal\"\n" 6731 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6732 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6733 " \" string literals\",\n" 6734 " and, other, parameters);"); 6735 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6736 " \"5678\";", 6737 format("fun + \"1243\" /* comment */\n" 6738 " \"5678\";", 6739 getLLVMStyleWithColumns(28))); 6740 EXPECT_EQ( 6741 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6742 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6743 " \"aaaaaaaaaaaaaaaa\";", 6744 format("aaaaaa =" 6745 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6746 "aaaaaaaaaaaaaaaaaaaaa\" " 6747 "\"aaaaaaaaaaaaaaaa\";")); 6748 verifyFormat("a = a + \"a\"\n" 6749 " \"a\"\n" 6750 " \"a\";"); 6751 verifyFormat("f(\"a\", \"b\"\n" 6752 " \"c\");"); 6753 6754 verifyFormat( 6755 "#define LL_FORMAT \"ll\"\n" 6756 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6757 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6758 6759 verifyFormat("#define A(X) \\\n" 6760 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6761 " \"ccccc\"", 6762 getLLVMStyleWithColumns(23)); 6763 verifyFormat("#define A \"def\"\n" 6764 "f(\"abc\" A \"ghi\"\n" 6765 " \"jkl\");"); 6766 6767 verifyFormat("f(L\"a\"\n" 6768 " L\"b\");"); 6769 verifyFormat("#define A(X) \\\n" 6770 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6771 " L\"ccccc\"", 6772 getLLVMStyleWithColumns(25)); 6773 6774 verifyFormat("f(@\"a\"\n" 6775 " @\"b\");"); 6776 verifyFormat("NSString s = @\"a\"\n" 6777 " @\"b\"\n" 6778 " @\"c\";"); 6779 verifyFormat("NSString s = @\"a\"\n" 6780 " \"b\"\n" 6781 " \"c\";"); 6782 } 6783 6784 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6785 FormatStyle Style = getLLVMStyle(); 6786 // No declarations or definitions should be moved to own line. 6787 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6788 verifyFormat("class A {\n" 6789 " int f() { return 1; }\n" 6790 " int g();\n" 6791 "};\n" 6792 "int f() { return 1; }\n" 6793 "int g();\n", 6794 Style); 6795 6796 // All declarations and definitions should have the return type moved to its 6797 // own line. 6798 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6799 Style.TypenameMacros = {"LIST"}; 6800 verifyFormat("SomeType\n" 6801 "funcdecl(LIST(uint64_t));", 6802 Style); 6803 verifyFormat("class E {\n" 6804 " int\n" 6805 " f() {\n" 6806 " return 1;\n" 6807 " }\n" 6808 " int\n" 6809 " g();\n" 6810 "};\n" 6811 "int\n" 6812 "f() {\n" 6813 " return 1;\n" 6814 "}\n" 6815 "int\n" 6816 "g();\n", 6817 Style); 6818 6819 // Top-level definitions, and no kinds of declarations should have the 6820 // return type moved to its own line. 6821 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6822 verifyFormat("class B {\n" 6823 " int f() { return 1; }\n" 6824 " int g();\n" 6825 "};\n" 6826 "int\n" 6827 "f() {\n" 6828 " return 1;\n" 6829 "}\n" 6830 "int g();\n", 6831 Style); 6832 6833 // Top-level definitions and declarations should have the return type moved 6834 // to its own line. 6835 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6836 verifyFormat("class C {\n" 6837 " int f() { return 1; }\n" 6838 " int g();\n" 6839 "};\n" 6840 "int\n" 6841 "f() {\n" 6842 " return 1;\n" 6843 "}\n" 6844 "int\n" 6845 "g();\n", 6846 Style); 6847 6848 // All definitions should have the return type moved to its own line, but no 6849 // kinds of declarations. 6850 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6851 verifyFormat("class D {\n" 6852 " int\n" 6853 " f() {\n" 6854 " return 1;\n" 6855 " }\n" 6856 " int g();\n" 6857 "};\n" 6858 "int\n" 6859 "f() {\n" 6860 " return 1;\n" 6861 "}\n" 6862 "int g();\n", 6863 Style); 6864 verifyFormat("const char *\n" 6865 "f(void) {\n" // Break here. 6866 " return \"\";\n" 6867 "}\n" 6868 "const char *bar(void);\n", // No break here. 6869 Style); 6870 verifyFormat("template <class T>\n" 6871 "T *\n" 6872 "f(T &c) {\n" // Break here. 6873 " return NULL;\n" 6874 "}\n" 6875 "template <class T> T *f(T &c);\n", // No break here. 6876 Style); 6877 verifyFormat("class C {\n" 6878 " int\n" 6879 " operator+() {\n" 6880 " return 1;\n" 6881 " }\n" 6882 " int\n" 6883 " operator()() {\n" 6884 " return 1;\n" 6885 " }\n" 6886 "};\n", 6887 Style); 6888 verifyFormat("void\n" 6889 "A::operator()() {}\n" 6890 "void\n" 6891 "A::operator>>() {}\n" 6892 "void\n" 6893 "A::operator+() {}\n" 6894 "void\n" 6895 "A::operator*() {}\n" 6896 "void\n" 6897 "A::operator->() {}\n" 6898 "void\n" 6899 "A::operator void *() {}\n" 6900 "void\n" 6901 "A::operator void &() {}\n" 6902 "void\n" 6903 "A::operator void &&() {}\n" 6904 "void\n" 6905 "A::operator char *() {}\n" 6906 "void\n" 6907 "A::operator[]() {}\n" 6908 "void\n" 6909 "A::operator!() {}\n" 6910 "void\n" 6911 "A::operator**() {}\n" 6912 "void\n" 6913 "A::operator<Foo> *() {}\n" 6914 "void\n" 6915 "A::operator<Foo> **() {}\n" 6916 "void\n" 6917 "A::operator<Foo> &() {}\n" 6918 "void\n" 6919 "A::operator void **() {}\n", 6920 Style); 6921 verifyFormat("constexpr auto\n" 6922 "operator()() const -> reference {}\n" 6923 "constexpr auto\n" 6924 "operator>>() const -> reference {}\n" 6925 "constexpr auto\n" 6926 "operator+() const -> reference {}\n" 6927 "constexpr auto\n" 6928 "operator*() const -> reference {}\n" 6929 "constexpr auto\n" 6930 "operator->() const -> reference {}\n" 6931 "constexpr auto\n" 6932 "operator++() const -> reference {}\n" 6933 "constexpr auto\n" 6934 "operator void *() const -> reference {}\n" 6935 "constexpr auto\n" 6936 "operator void **() const -> reference {}\n" 6937 "constexpr auto\n" 6938 "operator void *() const -> reference {}\n" 6939 "constexpr auto\n" 6940 "operator void &() const -> reference {}\n" 6941 "constexpr auto\n" 6942 "operator void &&() const -> reference {}\n" 6943 "constexpr auto\n" 6944 "operator char *() const -> reference {}\n" 6945 "constexpr auto\n" 6946 "operator!() const -> reference {}\n" 6947 "constexpr auto\n" 6948 "operator[]() const -> reference {}\n", 6949 Style); 6950 verifyFormat("void *operator new(std::size_t s);", // No break here. 6951 Style); 6952 verifyFormat("void *\n" 6953 "operator new(std::size_t s) {}", 6954 Style); 6955 verifyFormat("void *\n" 6956 "operator delete[](void *ptr) {}", 6957 Style); 6958 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6959 verifyFormat("const char *\n" 6960 "f(void)\n" // Break here. 6961 "{\n" 6962 " return \"\";\n" 6963 "}\n" 6964 "const char *bar(void);\n", // No break here. 6965 Style); 6966 verifyFormat("template <class T>\n" 6967 "T *\n" // Problem here: no line break 6968 "f(T &c)\n" // Break here. 6969 "{\n" 6970 " return NULL;\n" 6971 "}\n" 6972 "template <class T> T *f(T &c);\n", // No break here. 6973 Style); 6974 verifyFormat("int\n" 6975 "foo(A<bool> a)\n" 6976 "{\n" 6977 " return a;\n" 6978 "}\n", 6979 Style); 6980 verifyFormat("int\n" 6981 "foo(A<8> a)\n" 6982 "{\n" 6983 " return a;\n" 6984 "}\n", 6985 Style); 6986 verifyFormat("int\n" 6987 "foo(A<B<bool>, 8> a)\n" 6988 "{\n" 6989 " return a;\n" 6990 "}\n", 6991 Style); 6992 verifyFormat("int\n" 6993 "foo(A<B<8>, bool> a)\n" 6994 "{\n" 6995 " return a;\n" 6996 "}\n", 6997 Style); 6998 verifyFormat("int\n" 6999 "foo(A<B<bool>, bool> a)\n" 7000 "{\n" 7001 " return a;\n" 7002 "}\n", 7003 Style); 7004 verifyFormat("int\n" 7005 "foo(A<B<8>, 8> a)\n" 7006 "{\n" 7007 " return a;\n" 7008 "}\n", 7009 Style); 7010 7011 Style = getGNUStyle(); 7012 7013 // Test for comments at the end of function declarations. 7014 verifyFormat("void\n" 7015 "foo (int a, /*abc*/ int b) // def\n" 7016 "{\n" 7017 "}\n", 7018 Style); 7019 7020 verifyFormat("void\n" 7021 "foo (int a, /* abc */ int b) /* def */\n" 7022 "{\n" 7023 "}\n", 7024 Style); 7025 7026 // Definitions that should not break after return type 7027 verifyFormat("void foo (int a, int b); // def\n", Style); 7028 verifyFormat("void foo (int a, int b); /* def */\n", Style); 7029 verifyFormat("void foo (int a, int b);\n", Style); 7030 } 7031 7032 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 7033 FormatStyle NoBreak = getLLVMStyle(); 7034 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 7035 FormatStyle Break = getLLVMStyle(); 7036 Break.AlwaysBreakBeforeMultilineStrings = true; 7037 verifyFormat("aaaa = \"bbbb\"\n" 7038 " \"cccc\";", 7039 NoBreak); 7040 verifyFormat("aaaa =\n" 7041 " \"bbbb\"\n" 7042 " \"cccc\";", 7043 Break); 7044 verifyFormat("aaaa(\"bbbb\"\n" 7045 " \"cccc\");", 7046 NoBreak); 7047 verifyFormat("aaaa(\n" 7048 " \"bbbb\"\n" 7049 " \"cccc\");", 7050 Break); 7051 verifyFormat("aaaa(qqq, \"bbbb\"\n" 7052 " \"cccc\");", 7053 NoBreak); 7054 verifyFormat("aaaa(qqq,\n" 7055 " \"bbbb\"\n" 7056 " \"cccc\");", 7057 Break); 7058 verifyFormat("aaaa(qqq,\n" 7059 " L\"bbbb\"\n" 7060 " L\"cccc\");", 7061 Break); 7062 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 7063 " \"bbbb\"));", 7064 Break); 7065 verifyFormat("string s = someFunction(\n" 7066 " \"abc\"\n" 7067 " \"abc\");", 7068 Break); 7069 7070 // As we break before unary operators, breaking right after them is bad. 7071 verifyFormat("string foo = abc ? \"x\"\n" 7072 " \"blah blah blah blah blah blah\"\n" 7073 " : \"y\";", 7074 Break); 7075 7076 // Don't break if there is no column gain. 7077 verifyFormat("f(\"aaaa\"\n" 7078 " \"bbbb\");", 7079 Break); 7080 7081 // Treat literals with escaped newlines like multi-line string literals. 7082 EXPECT_EQ("x = \"a\\\n" 7083 "b\\\n" 7084 "c\";", 7085 format("x = \"a\\\n" 7086 "b\\\n" 7087 "c\";", 7088 NoBreak)); 7089 EXPECT_EQ("xxxx =\n" 7090 " \"a\\\n" 7091 "b\\\n" 7092 "c\";", 7093 format("xxxx = \"a\\\n" 7094 "b\\\n" 7095 "c\";", 7096 Break)); 7097 7098 EXPECT_EQ("NSString *const kString =\n" 7099 " @\"aaaa\"\n" 7100 " @\"bbbb\";", 7101 format("NSString *const kString = @\"aaaa\"\n" 7102 "@\"bbbb\";", 7103 Break)); 7104 7105 Break.ColumnLimit = 0; 7106 verifyFormat("const char *hello = \"hello llvm\";", Break); 7107 } 7108 7109 TEST_F(FormatTest, AlignsPipes) { 7110 verifyFormat( 7111 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7112 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7113 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7114 verifyFormat( 7115 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 7116 " << aaaaaaaaaaaaaaaaaaaa;"); 7117 verifyFormat( 7118 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7119 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7120 verifyFormat( 7121 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 7122 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7123 verifyFormat( 7124 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 7125 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 7126 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 7127 verifyFormat( 7128 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7129 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7130 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7131 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7133 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7134 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7135 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 7136 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 7137 verifyFormat( 7138 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7139 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7140 verifyFormat( 7141 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 7142 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7143 7144 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 7145 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 7146 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7147 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7148 " aaaaaaaaaaaaaaaaaaaaa)\n" 7149 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7150 verifyFormat("LOG_IF(aaa == //\n" 7151 " bbb)\n" 7152 " << a << b;"); 7153 7154 // But sometimes, breaking before the first "<<" is desirable. 7155 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7156 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 7157 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 7158 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7159 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7160 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 7161 " << BEF << IsTemplate << Description << E->getType();"); 7162 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7163 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7165 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7166 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7167 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7168 " << aaa;"); 7169 7170 verifyFormat( 7171 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7172 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7173 7174 // Incomplete string literal. 7175 EXPECT_EQ("llvm::errs() << \"\n" 7176 " << a;", 7177 format("llvm::errs() << \"\n<<a;")); 7178 7179 verifyFormat("void f() {\n" 7180 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 7181 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 7182 "}"); 7183 7184 // Handle 'endl'. 7185 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 7186 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 7187 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 7188 7189 // Handle '\n'. 7190 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 7191 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 7192 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 7193 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 7194 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 7195 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 7196 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 7197 } 7198 7199 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 7200 verifyFormat("return out << \"somepacket = {\\n\"\n" 7201 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 7202 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 7203 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 7204 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 7205 " << \"}\";"); 7206 7207 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 7208 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 7209 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 7210 verifyFormat( 7211 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 7212 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 7213 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 7214 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 7215 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 7216 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 7217 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7218 verifyFormat( 7219 "void f() {\n" 7220 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 7221 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 7222 "}"); 7223 7224 // Breaking before the first "<<" is generally not desirable. 7225 verifyFormat( 7226 "llvm::errs()\n" 7227 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7228 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7229 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7230 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 7231 getLLVMStyleWithColumns(70)); 7232 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7233 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7234 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7235 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7236 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7237 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 7238 getLLVMStyleWithColumns(70)); 7239 7240 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 7241 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 7242 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 7243 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7244 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7245 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 7246 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 7247 " (aaaa + aaaa);", 7248 getLLVMStyleWithColumns(40)); 7249 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 7250 " (aaaaaaa + aaaaa));", 7251 getLLVMStyleWithColumns(40)); 7252 verifyFormat( 7253 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 7254 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 7255 " bbbbbbbbbbbbbbbbbbbbbbb);"); 7256 } 7257 7258 TEST_F(FormatTest, UnderstandsEquals) { 7259 verifyFormat( 7260 "aaaaaaaaaaaaaaaaa =\n" 7261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7262 verifyFormat( 7263 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7265 verifyFormat( 7266 "if (a) {\n" 7267 " f();\n" 7268 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 7270 "}"); 7271 7272 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7273 " 100000000 + 10000000) {\n}"); 7274 } 7275 7276 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 7277 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7278 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 7279 7280 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7281 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 7282 7283 verifyFormat( 7284 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 7285 " Parameter2);"); 7286 7287 verifyFormat( 7288 "ShortObject->shortFunction(\n" 7289 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 7290 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 7291 7292 verifyFormat("loooooooooooooongFunction(\n" 7293 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 7294 7295 verifyFormat( 7296 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 7297 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 7298 7299 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7300 " .WillRepeatedly(Return(SomeValue));"); 7301 verifyFormat("void f() {\n" 7302 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7303 " .Times(2)\n" 7304 " .WillRepeatedly(Return(SomeValue));\n" 7305 "}"); 7306 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 7307 " ccccccccccccccccccccccc);"); 7308 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7309 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7310 " .aaaaa(aaaaa),\n" 7311 " aaaaaaaaaaaaaaaaaaaaa);"); 7312 verifyFormat("void f() {\n" 7313 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7314 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 7315 "}"); 7316 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7317 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7318 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7319 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7320 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7321 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7322 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7323 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7324 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 7325 "}"); 7326 7327 // Here, it is not necessary to wrap at "." or "->". 7328 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 7329 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7330 verifyFormat( 7331 "aaaaaaaaaaa->aaaaaaaaa(\n" 7332 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7333 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 7334 7335 verifyFormat( 7336 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7337 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 7338 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 7339 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7340 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 7341 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7342 7343 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7345 " .a();"); 7346 7347 FormatStyle NoBinPacking = getLLVMStyle(); 7348 NoBinPacking.BinPackParameters = false; 7349 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7350 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7351 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 7352 " aaaaaaaaaaaaaaaaaaa,\n" 7353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 7354 NoBinPacking); 7355 7356 // If there is a subsequent call, change to hanging indentation. 7357 verifyFormat( 7358 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7359 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 7360 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7361 verifyFormat( 7362 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7363 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 7364 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7366 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7367 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7369 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7370 } 7371 7372 TEST_F(FormatTest, WrapsTemplateDeclarations) { 7373 verifyFormat("template <typename T>\n" 7374 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7375 verifyFormat("template <typename T>\n" 7376 "// T should be one of {A, B}.\n" 7377 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7378 verifyFormat( 7379 "template <typename T>\n" 7380 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 7381 verifyFormat("template <typename T>\n" 7382 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 7383 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 7384 verifyFormat( 7385 "template <typename T>\n" 7386 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 7387 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 7388 verifyFormat( 7389 "template <typename T>\n" 7390 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 7391 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 7392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7393 verifyFormat("template <typename T>\n" 7394 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7395 " int aaaaaaaaaaaaaaaaaaaaaa);"); 7396 verifyFormat( 7397 "template <typename T1, typename T2 = char, typename T3 = char,\n" 7398 " typename T4 = char>\n" 7399 "void f();"); 7400 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 7401 " template <typename> class cccccccccccccccccccccc,\n" 7402 " typename ddddddddddddd>\n" 7403 "class C {};"); 7404 verifyFormat( 7405 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 7406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7407 7408 verifyFormat("void f() {\n" 7409 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 7410 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 7411 "}"); 7412 7413 verifyFormat("template <typename T> class C {};"); 7414 verifyFormat("template <typename T> void f();"); 7415 verifyFormat("template <typename T> void f() {}"); 7416 verifyFormat( 7417 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7419 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 7420 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7421 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7422 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 7423 " bbbbbbbbbbbbbbbbbbbbbbbb);", 7424 getLLVMStyleWithColumns(72)); 7425 EXPECT_EQ("static_cast<A< //\n" 7426 " B> *>(\n" 7427 "\n" 7428 ");", 7429 format("static_cast<A<//\n" 7430 " B>*>(\n" 7431 "\n" 7432 " );")); 7433 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7434 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 7435 7436 FormatStyle AlwaysBreak = getLLVMStyle(); 7437 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7438 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 7439 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 7440 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 7441 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7442 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7443 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 7444 verifyFormat("template <template <typename> class Fooooooo,\n" 7445 " template <typename> class Baaaaaaar>\n" 7446 "struct C {};", 7447 AlwaysBreak); 7448 verifyFormat("template <typename T> // T can be A, B or C.\n" 7449 "struct C {};", 7450 AlwaysBreak); 7451 verifyFormat("template <enum E> class A {\n" 7452 "public:\n" 7453 " E *f();\n" 7454 "};"); 7455 7456 FormatStyle NeverBreak = getLLVMStyle(); 7457 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 7458 verifyFormat("template <typename T> class C {};", NeverBreak); 7459 verifyFormat("template <typename T> void f();", NeverBreak); 7460 verifyFormat("template <typename T> void f() {}", NeverBreak); 7461 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7462 "bbbbbbbbbbbbbbbbbbbb) {}", 7463 NeverBreak); 7464 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7465 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7466 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 7467 NeverBreak); 7468 verifyFormat("template <template <typename> class Fooooooo,\n" 7469 " template <typename> class Baaaaaaar>\n" 7470 "struct C {};", 7471 NeverBreak); 7472 verifyFormat("template <typename T> // T can be A, B or C.\n" 7473 "struct C {};", 7474 NeverBreak); 7475 verifyFormat("template <enum E> class A {\n" 7476 "public:\n" 7477 " E *f();\n" 7478 "};", 7479 NeverBreak); 7480 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 7481 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7482 "bbbbbbbbbbbbbbbbbbbb) {}", 7483 NeverBreak); 7484 } 7485 7486 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 7487 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7488 Style.ColumnLimit = 60; 7489 EXPECT_EQ("// Baseline - no comments.\n" 7490 "template <\n" 7491 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7492 "void f() {}", 7493 format("// Baseline - no comments.\n" 7494 "template <\n" 7495 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7496 "void f() {}", 7497 Style)); 7498 7499 EXPECT_EQ("template <\n" 7500 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7501 "void f() {}", 7502 format("template <\n" 7503 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7504 "void f() {}", 7505 Style)); 7506 7507 EXPECT_EQ( 7508 "template <\n" 7509 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7510 "void f() {}", 7511 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7512 "void f() {}", 7513 Style)); 7514 7515 EXPECT_EQ( 7516 "template <\n" 7517 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7518 " // multiline\n" 7519 "void f() {}", 7520 format("template <\n" 7521 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7522 " // multiline\n" 7523 "void f() {}", 7524 Style)); 7525 7526 EXPECT_EQ( 7527 "template <typename aaaaaaaaaa<\n" 7528 " bbbbbbbbbbbb>::value> // trailing loooong\n" 7529 "void f() {}", 7530 format( 7531 "template <\n" 7532 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 7533 "void f() {}", 7534 Style)); 7535 } 7536 7537 TEST_F(FormatTest, WrapsTemplateParameters) { 7538 FormatStyle Style = getLLVMStyle(); 7539 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7540 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7541 verifyFormat( 7542 "template <typename... a> struct q {};\n" 7543 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7544 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7545 " y;", 7546 Style); 7547 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7548 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7549 verifyFormat( 7550 "template <typename... a> struct r {};\n" 7551 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7552 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7553 " y;", 7554 Style); 7555 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7556 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7557 verifyFormat("template <typename... a> struct s {};\n" 7558 "extern s<\n" 7559 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7560 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7561 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7562 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7563 " y;", 7564 Style); 7565 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7566 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7567 verifyFormat("template <typename... a> struct t {};\n" 7568 "extern t<\n" 7569 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7570 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7571 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7572 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7573 " y;", 7574 Style); 7575 } 7576 7577 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 7578 verifyFormat( 7579 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7581 verifyFormat( 7582 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7585 7586 // FIXME: Should we have the extra indent after the second break? 7587 verifyFormat( 7588 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7590 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7591 7592 verifyFormat( 7593 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 7594 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 7595 7596 // Breaking at nested name specifiers is generally not desirable. 7597 verifyFormat( 7598 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7599 " aaaaaaaaaaaaaaaaaaaaaaa);"); 7600 7601 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 7602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7603 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7604 " aaaaaaaaaaaaaaaaaaaaa);", 7605 getLLVMStyleWithColumns(74)); 7606 7607 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7608 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7609 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7610 } 7611 7612 TEST_F(FormatTest, UnderstandsTemplateParameters) { 7613 verifyFormat("A<int> a;"); 7614 verifyFormat("A<A<A<int>>> a;"); 7615 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 7616 verifyFormat("bool x = a < 1 || 2 > a;"); 7617 verifyFormat("bool x = 5 < f<int>();"); 7618 verifyFormat("bool x = f<int>() > 5;"); 7619 verifyFormat("bool x = 5 < a<int>::x;"); 7620 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 7621 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 7622 7623 verifyGoogleFormat("A<A<int>> a;"); 7624 verifyGoogleFormat("A<A<A<int>>> a;"); 7625 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 7626 verifyGoogleFormat("A<A<int> > a;"); 7627 verifyGoogleFormat("A<A<A<int> > > a;"); 7628 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 7629 verifyGoogleFormat("A<::A<int>> a;"); 7630 verifyGoogleFormat("A<::A> a;"); 7631 verifyGoogleFormat("A< ::A> a;"); 7632 verifyGoogleFormat("A< ::A<int> > a;"); 7633 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 7634 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 7635 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 7636 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 7637 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 7638 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 7639 7640 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 7641 7642 // template closer followed by a token that starts with > or = 7643 verifyFormat("bool b = a<1> > 1;"); 7644 verifyFormat("bool b = a<1> >= 1;"); 7645 verifyFormat("int i = a<1> >> 1;"); 7646 FormatStyle Style = getLLVMStyle(); 7647 Style.SpaceBeforeAssignmentOperators = false; 7648 verifyFormat("bool b= a<1> == 1;", Style); 7649 verifyFormat("a<int> = 1;", Style); 7650 verifyFormat("a<int> >>= 1;", Style); 7651 7652 verifyFormat("test >> a >> b;"); 7653 verifyFormat("test << a >> b;"); 7654 7655 verifyFormat("f<int>();"); 7656 verifyFormat("template <typename T> void f() {}"); 7657 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 7658 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 7659 "sizeof(char)>::type>;"); 7660 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 7661 verifyFormat("f(a.operator()<A>());"); 7662 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7663 " .template operator()<A>());", 7664 getLLVMStyleWithColumns(35)); 7665 7666 // Not template parameters. 7667 verifyFormat("return a < b && c > d;"); 7668 verifyFormat("void f() {\n" 7669 " while (a < b && c > d) {\n" 7670 " }\n" 7671 "}"); 7672 verifyFormat("template <typename... Types>\n" 7673 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 7674 7675 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 7677 getLLVMStyleWithColumns(60)); 7678 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 7679 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 7680 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 7681 verifyFormat("some_templated_type<decltype([](int i) { return i; })>"); 7682 } 7683 7684 TEST_F(FormatTest, UnderstandsShiftOperators) { 7685 verifyFormat("if (i < x >> 1)"); 7686 verifyFormat("while (i < x >> 1)"); 7687 verifyFormat("for (unsigned i = 0; i < i; ++i, v = v >> 1)"); 7688 verifyFormat("for (unsigned i = 0; i < x >> 1; ++i, v = v >> 1)"); 7689 verifyFormat( 7690 "for (std::vector<int>::iterator i = 0; i < x >> 1; ++i, v = v >> 1)"); 7691 verifyFormat("Foo.call<Bar<Function>>()"); 7692 verifyFormat("if (Foo.call<Bar<Function>>() == 0)"); 7693 verifyFormat("for (std::vector<std::pair<int>>::iterator i = 0; i < x >> 1; " 7694 "++i, v = v >> 1)"); 7695 verifyFormat("if (w<u<v<x>>, 1>::t)"); 7696 } 7697 7698 TEST_F(FormatTest, BitshiftOperatorWidth) { 7699 EXPECT_EQ("int a = 1 << 2; /* foo\n" 7700 " bar */", 7701 format("int a=1<<2; /* foo\n" 7702 " bar */")); 7703 7704 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 7705 " bar */", 7706 format("int b =256>>1 ; /* foo\n" 7707 " bar */")); 7708 } 7709 7710 TEST_F(FormatTest, UnderstandsBinaryOperators) { 7711 verifyFormat("COMPARE(a, ==, b);"); 7712 verifyFormat("auto s = sizeof...(Ts) - 1;"); 7713 } 7714 7715 TEST_F(FormatTest, UnderstandsPointersToMembers) { 7716 verifyFormat("int A::*x;"); 7717 verifyFormat("int (S::*func)(void *);"); 7718 verifyFormat("void f() { int (S::*func)(void *); }"); 7719 verifyFormat("typedef bool *(Class::*Member)() const;"); 7720 verifyFormat("void f() {\n" 7721 " (a->*f)();\n" 7722 " a->*x;\n" 7723 " (a.*f)();\n" 7724 " ((*a).*f)();\n" 7725 " a.*x;\n" 7726 "}"); 7727 verifyFormat("void f() {\n" 7728 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7729 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 7730 "}"); 7731 verifyFormat( 7732 "(aaaaaaaaaa->*bbbbbbb)(\n" 7733 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7734 FormatStyle Style = getLLVMStyle(); 7735 Style.PointerAlignment = FormatStyle::PAS_Left; 7736 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 7737 } 7738 7739 TEST_F(FormatTest, UnderstandsUnaryOperators) { 7740 verifyFormat("int a = -2;"); 7741 verifyFormat("f(-1, -2, -3);"); 7742 verifyFormat("a[-1] = 5;"); 7743 verifyFormat("int a = 5 + -2;"); 7744 verifyFormat("if (i == -1) {\n}"); 7745 verifyFormat("if (i != -1) {\n}"); 7746 verifyFormat("if (i > -1) {\n}"); 7747 verifyFormat("if (i < -1) {\n}"); 7748 verifyFormat("++(a->f());"); 7749 verifyFormat("--(a->f());"); 7750 verifyFormat("(a->f())++;"); 7751 verifyFormat("a[42]++;"); 7752 verifyFormat("if (!(a->f())) {\n}"); 7753 verifyFormat("if (!+i) {\n}"); 7754 verifyFormat("~&a;"); 7755 7756 verifyFormat("a-- > b;"); 7757 verifyFormat("b ? -a : c;"); 7758 verifyFormat("n * sizeof char16;"); 7759 verifyFormat("n * alignof char16;", getGoogleStyle()); 7760 verifyFormat("sizeof(char);"); 7761 verifyFormat("alignof(char);", getGoogleStyle()); 7762 7763 verifyFormat("return -1;"); 7764 verifyFormat("throw -1;"); 7765 verifyFormat("switch (a) {\n" 7766 "case -1:\n" 7767 " break;\n" 7768 "}"); 7769 verifyFormat("#define X -1"); 7770 verifyFormat("#define X -kConstant"); 7771 7772 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7773 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7774 7775 verifyFormat("int a = /* confusing comment */ -1;"); 7776 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7777 verifyFormat("int a = i /* confusing comment */++;"); 7778 7779 verifyFormat("co_yield -1;"); 7780 verifyFormat("co_return -1;"); 7781 7782 // Check that * is not treated as a binary operator when we set 7783 // PointerAlignment as PAS_Left after a keyword and not a declaration. 7784 FormatStyle PASLeftStyle = getLLVMStyle(); 7785 PASLeftStyle.PointerAlignment = FormatStyle::PAS_Left; 7786 verifyFormat("co_return *a;", PASLeftStyle); 7787 verifyFormat("co_await *a;", PASLeftStyle); 7788 verifyFormat("co_yield *a", PASLeftStyle); 7789 verifyFormat("return *a;", PASLeftStyle); 7790 } 7791 7792 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7793 verifyFormat("if (!aaaaaaaaaa( // break\n" 7794 " aaaaa)) {\n" 7795 "}"); 7796 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7797 " aaaaa));"); 7798 verifyFormat("*aaa = aaaaaaa( // break\n" 7799 " bbbbbb);"); 7800 } 7801 7802 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7803 verifyFormat("bool operator<();"); 7804 verifyFormat("bool operator>();"); 7805 verifyFormat("bool operator=();"); 7806 verifyFormat("bool operator==();"); 7807 verifyFormat("bool operator!=();"); 7808 verifyFormat("int operator+();"); 7809 verifyFormat("int operator++();"); 7810 verifyFormat("int operator++(int) volatile noexcept;"); 7811 verifyFormat("bool operator,();"); 7812 verifyFormat("bool operator();"); 7813 verifyFormat("bool operator()();"); 7814 verifyFormat("bool operator[]();"); 7815 verifyFormat("operator bool();"); 7816 verifyFormat("operator int();"); 7817 verifyFormat("operator void *();"); 7818 verifyFormat("operator SomeType<int>();"); 7819 verifyFormat("operator SomeType<int, int>();"); 7820 verifyFormat("operator SomeType<SomeType<int>>();"); 7821 verifyFormat("void *operator new(std::size_t size);"); 7822 verifyFormat("void *operator new[](std::size_t size);"); 7823 verifyFormat("void operator delete(void *ptr);"); 7824 verifyFormat("void operator delete[](void *ptr);"); 7825 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7826 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7827 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7828 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7829 7830 verifyFormat( 7831 "ostream &operator<<(ostream &OutputStream,\n" 7832 " SomeReallyLongType WithSomeReallyLongValue);"); 7833 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7834 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7835 " return left.group < right.group;\n" 7836 "}"); 7837 verifyFormat("SomeType &operator=(const SomeType &S);"); 7838 verifyFormat("f.template operator()<int>();"); 7839 7840 verifyGoogleFormat("operator void*();"); 7841 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7842 verifyGoogleFormat("operator ::A();"); 7843 7844 verifyFormat("using A::operator+;"); 7845 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7846 "int i;"); 7847 } 7848 7849 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7850 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7851 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7852 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7853 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7854 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7855 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7856 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7857 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7858 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7859 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7860 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7861 verifyFormat("void Fn(T const &) const &;"); 7862 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7863 verifyFormat("template <typename T>\n" 7864 "void F(T) && = delete;", 7865 getGoogleStyle()); 7866 7867 FormatStyle AlignLeft = getLLVMStyle(); 7868 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7869 verifyFormat("void A::b() && {}", AlignLeft); 7870 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7871 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7872 AlignLeft); 7873 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7874 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7875 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7876 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7877 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7878 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7879 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7880 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7881 7882 FormatStyle Spaces = getLLVMStyle(); 7883 Spaces.SpacesInCStyleCastParentheses = true; 7884 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7885 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7886 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7887 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7888 7889 Spaces.SpacesInCStyleCastParentheses = false; 7890 Spaces.SpacesInParentheses = true; 7891 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7892 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7893 Spaces); 7894 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7895 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7896 7897 FormatStyle BreakTemplate = getLLVMStyle(); 7898 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7899 7900 verifyFormat("struct f {\n" 7901 " template <class T>\n" 7902 " int &foo(const std::string &str) &noexcept {}\n" 7903 "};", 7904 BreakTemplate); 7905 7906 verifyFormat("struct f {\n" 7907 " template <class T>\n" 7908 " int &foo(const std::string &str) &&noexcept {}\n" 7909 "};", 7910 BreakTemplate); 7911 7912 verifyFormat("struct f {\n" 7913 " template <class T>\n" 7914 " int &foo(const std::string &str) const &noexcept {}\n" 7915 "};", 7916 BreakTemplate); 7917 7918 verifyFormat("struct f {\n" 7919 " template <class T>\n" 7920 " int &foo(const std::string &str) const &noexcept {}\n" 7921 "};", 7922 BreakTemplate); 7923 7924 verifyFormat("struct f {\n" 7925 " template <class T>\n" 7926 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7927 "};", 7928 BreakTemplate); 7929 7930 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7931 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7932 FormatStyle::BTDS_Yes; 7933 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7934 7935 verifyFormat("struct f {\n" 7936 " template <class T>\n" 7937 " int& foo(const std::string& str) & noexcept {}\n" 7938 "};", 7939 AlignLeftBreakTemplate); 7940 7941 verifyFormat("struct f {\n" 7942 " template <class T>\n" 7943 " int& foo(const std::string& str) && noexcept {}\n" 7944 "};", 7945 AlignLeftBreakTemplate); 7946 7947 verifyFormat("struct f {\n" 7948 " template <class T>\n" 7949 " int& foo(const std::string& str) const& noexcept {}\n" 7950 "};", 7951 AlignLeftBreakTemplate); 7952 7953 verifyFormat("struct f {\n" 7954 " template <class T>\n" 7955 " int& foo(const std::string& str) const&& noexcept {}\n" 7956 "};", 7957 AlignLeftBreakTemplate); 7958 7959 verifyFormat("struct f {\n" 7960 " template <class T>\n" 7961 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7962 "};", 7963 AlignLeftBreakTemplate); 7964 7965 // The `&` in `Type&` should not be confused with a trailing `&` of 7966 // DEPRECATED(reason) member function. 7967 verifyFormat("struct f {\n" 7968 " template <class T>\n" 7969 " DEPRECATED(reason)\n" 7970 " Type &foo(arguments) {}\n" 7971 "};", 7972 BreakTemplate); 7973 7974 verifyFormat("struct f {\n" 7975 " template <class T>\n" 7976 " DEPRECATED(reason)\n" 7977 " Type& foo(arguments) {}\n" 7978 "};", 7979 AlignLeftBreakTemplate); 7980 7981 verifyFormat("void (*foopt)(int) = &func;"); 7982 } 7983 7984 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7985 verifyFormat("void f() {\n" 7986 " A *a = new A;\n" 7987 " A *a = new (placement) A;\n" 7988 " delete a;\n" 7989 " delete (A *)a;\n" 7990 "}"); 7991 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7992 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7993 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7994 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7995 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7996 verifyFormat("delete[] h->p;"); 7997 } 7998 7999 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 8000 verifyFormat("int *f(int *a) {}"); 8001 verifyFormat("int main(int argc, char **argv) {}"); 8002 verifyFormat("Test::Test(int b) : a(b * b) {}"); 8003 verifyIndependentOfContext("f(a, *a);"); 8004 verifyFormat("void g() { f(*a); }"); 8005 verifyIndependentOfContext("int a = b * 10;"); 8006 verifyIndependentOfContext("int a = 10 * b;"); 8007 verifyIndependentOfContext("int a = b * c;"); 8008 verifyIndependentOfContext("int a += b * c;"); 8009 verifyIndependentOfContext("int a -= b * c;"); 8010 verifyIndependentOfContext("int a *= b * c;"); 8011 verifyIndependentOfContext("int a /= b * c;"); 8012 verifyIndependentOfContext("int a = *b;"); 8013 verifyIndependentOfContext("int a = *b * c;"); 8014 verifyIndependentOfContext("int a = b * *c;"); 8015 verifyIndependentOfContext("int a = b * (10);"); 8016 verifyIndependentOfContext("S << b * (10);"); 8017 verifyIndependentOfContext("return 10 * b;"); 8018 verifyIndependentOfContext("return *b * *c;"); 8019 verifyIndependentOfContext("return a & ~b;"); 8020 verifyIndependentOfContext("f(b ? *c : *d);"); 8021 verifyIndependentOfContext("int a = b ? *c : *d;"); 8022 verifyIndependentOfContext("*b = a;"); 8023 verifyIndependentOfContext("a * ~b;"); 8024 verifyIndependentOfContext("a * !b;"); 8025 verifyIndependentOfContext("a * +b;"); 8026 verifyIndependentOfContext("a * -b;"); 8027 verifyIndependentOfContext("a * ++b;"); 8028 verifyIndependentOfContext("a * --b;"); 8029 verifyIndependentOfContext("a[4] * b;"); 8030 verifyIndependentOfContext("a[a * a] = 1;"); 8031 verifyIndependentOfContext("f() * b;"); 8032 verifyIndependentOfContext("a * [self dostuff];"); 8033 verifyIndependentOfContext("int x = a * (a + b);"); 8034 verifyIndependentOfContext("(a *)(a + b);"); 8035 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 8036 verifyIndependentOfContext("int *pa = (int *)&a;"); 8037 verifyIndependentOfContext("return sizeof(int **);"); 8038 verifyIndependentOfContext("return sizeof(int ******);"); 8039 verifyIndependentOfContext("return (int **&)a;"); 8040 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 8041 verifyFormat("void f(Type (*parameter)[10]) {}"); 8042 verifyFormat("void f(Type (¶meter)[10]) {}"); 8043 verifyGoogleFormat("return sizeof(int**);"); 8044 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 8045 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 8046 verifyFormat("auto a = [](int **&, int ***) {};"); 8047 verifyFormat("auto PointerBinding = [](const char *S) {};"); 8048 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 8049 verifyFormat("[](const decltype(*a) &value) {}"); 8050 verifyFormat("[](const typeof(*a) &value) {}"); 8051 verifyFormat("[](const _Atomic(a *) &value) {}"); 8052 verifyFormat("[](const __underlying_type(a) &value) {}"); 8053 verifyFormat("decltype(a * b) F();"); 8054 verifyFormat("typeof(a * b) F();"); 8055 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 8056 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 8057 verifyIndependentOfContext("typedef void (*f)(int *a);"); 8058 verifyIndependentOfContext("int i{a * b};"); 8059 verifyIndependentOfContext("aaa && aaa->f();"); 8060 verifyIndependentOfContext("int x = ~*p;"); 8061 verifyFormat("Constructor() : a(a), area(width * height) {}"); 8062 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 8063 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 8064 verifyFormat("void f() { f(a, c * d); }"); 8065 verifyFormat("void f() { f(new a(), c * d); }"); 8066 verifyFormat("void f(const MyOverride &override);"); 8067 verifyFormat("void f(const MyFinal &final);"); 8068 verifyIndependentOfContext("bool a = f() && override.f();"); 8069 verifyIndependentOfContext("bool a = f() && final.f();"); 8070 8071 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 8072 8073 verifyIndependentOfContext("A<int *> a;"); 8074 verifyIndependentOfContext("A<int **> a;"); 8075 verifyIndependentOfContext("A<int *, int *> a;"); 8076 verifyIndependentOfContext("A<int *[]> a;"); 8077 verifyIndependentOfContext( 8078 "const char *const p = reinterpret_cast<const char *const>(q);"); 8079 verifyIndependentOfContext("A<int **, int **> a;"); 8080 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 8081 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 8082 verifyFormat("for (; a && b;) {\n}"); 8083 verifyFormat("bool foo = true && [] { return false; }();"); 8084 8085 verifyFormat( 8086 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8088 8089 verifyGoogleFormat("int const* a = &b;"); 8090 verifyGoogleFormat("**outparam = 1;"); 8091 verifyGoogleFormat("*outparam = a * b;"); 8092 verifyGoogleFormat("int main(int argc, char** argv) {}"); 8093 verifyGoogleFormat("A<int*> a;"); 8094 verifyGoogleFormat("A<int**> a;"); 8095 verifyGoogleFormat("A<int*, int*> a;"); 8096 verifyGoogleFormat("A<int**, int**> a;"); 8097 verifyGoogleFormat("f(b ? *c : *d);"); 8098 verifyGoogleFormat("int a = b ? *c : *d;"); 8099 verifyGoogleFormat("Type* t = **x;"); 8100 verifyGoogleFormat("Type* t = *++*x;"); 8101 verifyGoogleFormat("*++*x;"); 8102 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 8103 verifyGoogleFormat("Type* t = x++ * y;"); 8104 verifyGoogleFormat( 8105 "const char* const p = reinterpret_cast<const char* const>(q);"); 8106 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 8107 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 8108 verifyGoogleFormat("template <typename T>\n" 8109 "void f(int i = 0, SomeType** temps = NULL);"); 8110 8111 FormatStyle Left = getLLVMStyle(); 8112 Left.PointerAlignment = FormatStyle::PAS_Left; 8113 verifyFormat("x = *a(x) = *a(y);", Left); 8114 verifyFormat("for (;; *a = b) {\n}", Left); 8115 verifyFormat("return *this += 1;", Left); 8116 verifyFormat("throw *x;", Left); 8117 verifyFormat("delete *x;", Left); 8118 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 8119 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 8120 verifyFormat("[](const typeof(*a)* ptr) {}", Left); 8121 verifyFormat("[](const _Atomic(a*)* ptr) {}", Left); 8122 verifyFormat("[](const __underlying_type(a)* ptr) {}", Left); 8123 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 8124 verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left); 8125 verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left); 8126 verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left); 8127 8128 verifyIndependentOfContext("a = *(x + y);"); 8129 verifyIndependentOfContext("a = &(x + y);"); 8130 verifyIndependentOfContext("*(x + y).call();"); 8131 verifyIndependentOfContext("&(x + y)->call();"); 8132 verifyFormat("void f() { &(*I).first; }"); 8133 8134 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 8135 verifyFormat( 8136 "int *MyValues = {\n" 8137 " *A, // Operator detection might be confused by the '{'\n" 8138 " *BB // Operator detection might be confused by previous comment\n" 8139 "};"); 8140 8141 verifyIndependentOfContext("if (int *a = &b)"); 8142 verifyIndependentOfContext("if (int &a = *b)"); 8143 verifyIndependentOfContext("if (a & b[i])"); 8144 verifyIndependentOfContext("if constexpr (a & b[i])"); 8145 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 8146 verifyIndependentOfContext("if (a * (b * c))"); 8147 verifyIndependentOfContext("if constexpr (a * (b * c))"); 8148 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 8149 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 8150 verifyIndependentOfContext("if (*b[i])"); 8151 verifyIndependentOfContext("if (int *a = (&b))"); 8152 verifyIndependentOfContext("while (int *a = &b)"); 8153 verifyIndependentOfContext("while (a * (b * c))"); 8154 verifyIndependentOfContext("size = sizeof *a;"); 8155 verifyIndependentOfContext("if (a && (b = c))"); 8156 verifyFormat("void f() {\n" 8157 " for (const int &v : Values) {\n" 8158 " }\n" 8159 "}"); 8160 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 8161 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 8162 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 8163 8164 verifyFormat("#define A (!a * b)"); 8165 verifyFormat("#define MACRO \\\n" 8166 " int *i = a * b; \\\n" 8167 " void f(a *b);", 8168 getLLVMStyleWithColumns(19)); 8169 8170 verifyIndependentOfContext("A = new SomeType *[Length];"); 8171 verifyIndependentOfContext("A = new SomeType *[Length]();"); 8172 verifyIndependentOfContext("T **t = new T *;"); 8173 verifyIndependentOfContext("T **t = new T *();"); 8174 verifyGoogleFormat("A = new SomeType*[Length]();"); 8175 verifyGoogleFormat("A = new SomeType*[Length];"); 8176 verifyGoogleFormat("T** t = new T*;"); 8177 verifyGoogleFormat("T** t = new T*();"); 8178 8179 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 8180 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 8181 verifyFormat("template <bool a, bool b> " 8182 "typename t::if<x && y>::type f() {}"); 8183 verifyFormat("template <int *y> f() {}"); 8184 verifyFormat("vector<int *> v;"); 8185 verifyFormat("vector<int *const> v;"); 8186 verifyFormat("vector<int *const **const *> v;"); 8187 verifyFormat("vector<int *volatile> v;"); 8188 verifyFormat("vector<a *_Nonnull> v;"); 8189 verifyFormat("vector<a *_Nullable> v;"); 8190 verifyFormat("vector<a *_Null_unspecified> v;"); 8191 verifyFormat("vector<a *__ptr32> v;"); 8192 verifyFormat("vector<a *__ptr64> v;"); 8193 verifyFormat("vector<a *__capability> v;"); 8194 FormatStyle TypeMacros = getLLVMStyle(); 8195 TypeMacros.TypenameMacros = {"LIST"}; 8196 verifyFormat("vector<LIST(uint64_t)> v;", TypeMacros); 8197 verifyFormat("vector<LIST(uint64_t) *> v;", TypeMacros); 8198 verifyFormat("vector<LIST(uint64_t) **> v;", TypeMacros); 8199 verifyFormat("vector<LIST(uint64_t) *attr> v;", TypeMacros); 8200 verifyFormat("vector<A(uint64_t) * attr> v;", TypeMacros); // multiplication 8201 8202 FormatStyle CustomQualifier = getLLVMStyle(); 8203 // Add indentifers that should not be parsed as a qualifier by default. 8204 CustomQualifier.AttributeMacros.push_back("__my_qualifier"); 8205 CustomQualifier.AttributeMacros.push_back("_My_qualifier"); 8206 CustomQualifier.AttributeMacros.push_back("my_other_qualifier"); 8207 verifyFormat("vector<a * __my_qualifier> parse_as_multiply;"); 8208 verifyFormat("vector<a *__my_qualifier> v;", CustomQualifier); 8209 verifyFormat("vector<a * _My_qualifier> parse_as_multiply;"); 8210 verifyFormat("vector<a *_My_qualifier> v;", CustomQualifier); 8211 verifyFormat("vector<a * my_other_qualifier> parse_as_multiply;"); 8212 verifyFormat("vector<a *my_other_qualifier> v;", CustomQualifier); 8213 verifyFormat("vector<a * _NotAQualifier> v;"); 8214 verifyFormat("vector<a * __not_a_qualifier> v;"); 8215 verifyFormat("vector<a * b> v;"); 8216 verifyFormat("foo<b && false>();"); 8217 verifyFormat("foo<b & 1>();"); 8218 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 8219 verifyFormat("typeof(*::std::declval<const T &>()) void F();"); 8220 verifyFormat("_Atomic(*::std::declval<const T &>()) void F();"); 8221 verifyFormat("__underlying_type(*::std::declval<const T &>()) void F();"); 8222 verifyFormat( 8223 "template <class T, class = typename std::enable_if<\n" 8224 " std::is_integral<T>::value &&\n" 8225 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 8226 "void F();", 8227 getLLVMStyleWithColumns(70)); 8228 verifyFormat("template <class T,\n" 8229 " class = typename std::enable_if<\n" 8230 " std::is_integral<T>::value &&\n" 8231 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 8232 " class U>\n" 8233 "void F();", 8234 getLLVMStyleWithColumns(70)); 8235 verifyFormat( 8236 "template <class T,\n" 8237 " class = typename ::std::enable_if<\n" 8238 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 8239 "void F();", 8240 getGoogleStyleWithColumns(68)); 8241 8242 verifyIndependentOfContext("MACRO(int *i);"); 8243 verifyIndependentOfContext("MACRO(auto *a);"); 8244 verifyIndependentOfContext("MACRO(const A *a);"); 8245 verifyIndependentOfContext("MACRO(_Atomic(A) *a);"); 8246 verifyIndependentOfContext("MACRO(decltype(A) *a);"); 8247 verifyIndependentOfContext("MACRO(typeof(A) *a);"); 8248 verifyIndependentOfContext("MACRO(__underlying_type(A) *a);"); 8249 verifyIndependentOfContext("MACRO(A *const a);"); 8250 verifyIndependentOfContext("MACRO(A *restrict a);"); 8251 verifyIndependentOfContext("MACRO(A *__restrict__ a);"); 8252 verifyIndependentOfContext("MACRO(A *__restrict a);"); 8253 verifyIndependentOfContext("MACRO(A *volatile a);"); 8254 verifyIndependentOfContext("MACRO(A *__volatile a);"); 8255 verifyIndependentOfContext("MACRO(A *__volatile__ a);"); 8256 verifyIndependentOfContext("MACRO(A *_Nonnull a);"); 8257 verifyIndependentOfContext("MACRO(A *_Nullable a);"); 8258 verifyIndependentOfContext("MACRO(A *_Null_unspecified a);"); 8259 verifyIndependentOfContext("MACRO(A *__attribute__((foo)) a);"); 8260 verifyIndependentOfContext("MACRO(A *__attribute((foo)) a);"); 8261 verifyIndependentOfContext("MACRO(A *[[clang::attr]] a);"); 8262 verifyIndependentOfContext("MACRO(A *[[clang::attr(\"foo\")]] a);"); 8263 verifyIndependentOfContext("MACRO(A *__ptr32 a);"); 8264 verifyIndependentOfContext("MACRO(A *__ptr64 a);"); 8265 verifyIndependentOfContext("MACRO(A *__capability);"); 8266 verifyIndependentOfContext("MACRO(A &__capability);"); 8267 verifyFormat("MACRO(A *__my_qualifier);"); // type declaration 8268 verifyFormat("void f() { MACRO(A * __my_qualifier); }"); // multiplication 8269 // If we add __my_qualifier to AttributeMacros it should always be parsed as 8270 // a type declaration: 8271 verifyFormat("MACRO(A *__my_qualifier);", CustomQualifier); 8272 verifyFormat("void f() { MACRO(A *__my_qualifier); }", CustomQualifier); 8273 // Also check that TypenameMacros prevents parsing it as multiplication: 8274 verifyIndependentOfContext("MACRO(LIST(uint64_t) * a);"); // multiplication 8275 verifyIndependentOfContext("MACRO(LIST(uint64_t) *a);", TypeMacros); // type 8276 8277 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 8278 verifyFormat("void f() { f(float{1}, a * a); }"); 8279 // FIXME: Is there a way to make this work? 8280 // verifyIndependentOfContext("MACRO(A *a);"); 8281 verifyFormat("MACRO(A &B);"); 8282 verifyFormat("MACRO(A *B);"); 8283 verifyFormat("void f() { MACRO(A * B); }"); 8284 verifyFormat("void f() { MACRO(A & B); }"); 8285 8286 // This lambda was mis-formatted after D88956 (treating it as a binop): 8287 verifyFormat("auto x = [](const decltype(x) &ptr) {};"); 8288 verifyFormat("auto x = [](const decltype(x) *ptr) {};"); 8289 verifyFormat("#define lambda [](const decltype(x) &ptr) {}"); 8290 verifyFormat("#define lambda [](const decltype(x) *ptr) {}"); 8291 8292 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 8293 verifyFormat("return options != nullptr && operator==(*options);"); 8294 8295 EXPECT_EQ("#define OP(x) \\\n" 8296 " ostream &operator<<(ostream &s, const A &a) { \\\n" 8297 " return s << a.DebugString(); \\\n" 8298 " }", 8299 format("#define OP(x) \\\n" 8300 " ostream &operator<<(ostream &s, const A &a) { \\\n" 8301 " return s << a.DebugString(); \\\n" 8302 " }", 8303 getLLVMStyleWithColumns(50))); 8304 8305 // FIXME: We cannot handle this case yet; we might be able to figure out that 8306 // foo<x> d > v; doesn't make sense. 8307 verifyFormat("foo<a<b && c> d> v;"); 8308 8309 FormatStyle PointerMiddle = getLLVMStyle(); 8310 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 8311 verifyFormat("delete *x;", PointerMiddle); 8312 verifyFormat("int * x;", PointerMiddle); 8313 verifyFormat("int *[] x;", PointerMiddle); 8314 verifyFormat("template <int * y> f() {}", PointerMiddle); 8315 verifyFormat("int * f(int * a) {}", PointerMiddle); 8316 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 8317 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 8318 verifyFormat("A<int *> a;", PointerMiddle); 8319 verifyFormat("A<int **> a;", PointerMiddle); 8320 verifyFormat("A<int *, int *> a;", PointerMiddle); 8321 verifyFormat("A<int *[]> a;", PointerMiddle); 8322 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 8323 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 8324 verifyFormat("T ** t = new T *;", PointerMiddle); 8325 8326 // Member function reference qualifiers aren't binary operators. 8327 verifyFormat("string // break\n" 8328 "operator()() & {}"); 8329 verifyFormat("string // break\n" 8330 "operator()() && {}"); 8331 verifyGoogleFormat("template <typename T>\n" 8332 "auto x() & -> int {}"); 8333 } 8334 8335 TEST_F(FormatTest, UnderstandsAttributes) { 8336 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 8337 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 8338 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8339 FormatStyle AfterType = getLLVMStyle(); 8340 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 8341 verifyFormat("__attribute__((nodebug)) void\n" 8342 "foo() {}\n", 8343 AfterType); 8344 verifyFormat("__unused void\n" 8345 "foo() {}", 8346 AfterType); 8347 8348 FormatStyle CustomAttrs = getLLVMStyle(); 8349 CustomAttrs.AttributeMacros.push_back("__unused"); 8350 CustomAttrs.AttributeMacros.push_back("__attr1"); 8351 CustomAttrs.AttributeMacros.push_back("__attr2"); 8352 CustomAttrs.AttributeMacros.push_back("no_underscore_attr"); 8353 verifyFormat("vector<SomeType *__attribute((foo))> v;"); 8354 verifyFormat("vector<SomeType *__attribute__((foo))> v;"); 8355 verifyFormat("vector<SomeType * __not_attribute__((foo))> v;"); 8356 // Check that it is parsed as a multiplication without AttributeMacros and 8357 // as a pointer qualifier when we add __attr1/__attr2 to AttributeMacros. 8358 verifyFormat("vector<SomeType * __attr1> v;"); 8359 verifyFormat("vector<SomeType __attr1 *> v;"); 8360 verifyFormat("vector<SomeType __attr1 *const> v;"); 8361 verifyFormat("vector<SomeType __attr1 * __attr2> v;"); 8362 verifyFormat("vector<SomeType *__attr1> v;", CustomAttrs); 8363 verifyFormat("vector<SomeType *__attr2> v;", CustomAttrs); 8364 verifyFormat("vector<SomeType *no_underscore_attr> v;", CustomAttrs); 8365 verifyFormat("vector<SomeType __attr1 *> v;", CustomAttrs); 8366 verifyFormat("vector<SomeType __attr1 *const> v;", CustomAttrs); 8367 verifyFormat("vector<SomeType __attr1 *__attr2> v;", CustomAttrs); 8368 verifyFormat("vector<SomeType __attr1 *no_underscore_attr> v;", CustomAttrs); 8369 8370 // Check that these are not parsed as function declarations: 8371 CustomAttrs.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8372 CustomAttrs.BreakBeforeBraces = FormatStyle::BS_Allman; 8373 verifyFormat("SomeType s(InitValue);", CustomAttrs); 8374 verifyFormat("SomeType s{InitValue};", CustomAttrs); 8375 verifyFormat("SomeType *__unused s(InitValue);", CustomAttrs); 8376 verifyFormat("SomeType *__unused s{InitValue};", CustomAttrs); 8377 verifyFormat("SomeType s __unused(InitValue);", CustomAttrs); 8378 verifyFormat("SomeType s __unused{InitValue};", CustomAttrs); 8379 verifyFormat("SomeType *__capability s(InitValue);", CustomAttrs); 8380 verifyFormat("SomeType *__capability s{InitValue};", CustomAttrs); 8381 } 8382 8383 TEST_F(FormatTest, UnderstandsPointerQualifiersInCast) { 8384 // Check that qualifiers on pointers don't break parsing of casts. 8385 verifyFormat("x = (foo *const)*v;"); 8386 verifyFormat("x = (foo *volatile)*v;"); 8387 verifyFormat("x = (foo *restrict)*v;"); 8388 verifyFormat("x = (foo *__attribute__((foo)))*v;"); 8389 verifyFormat("x = (foo *_Nonnull)*v;"); 8390 verifyFormat("x = (foo *_Nullable)*v;"); 8391 verifyFormat("x = (foo *_Null_unspecified)*v;"); 8392 verifyFormat("x = (foo *_Nonnull)*v;"); 8393 verifyFormat("x = (foo *[[clang::attr]])*v;"); 8394 verifyFormat("x = (foo *[[clang::attr(\"foo\")]])*v;"); 8395 verifyFormat("x = (foo *__ptr32)*v;"); 8396 verifyFormat("x = (foo *__ptr64)*v;"); 8397 verifyFormat("x = (foo *__capability)*v;"); 8398 8399 // Check that we handle multiple trailing qualifiers and skip them all to 8400 // determine that the expression is a cast to a pointer type. 8401 FormatStyle LongPointerRight = getLLVMStyleWithColumns(999); 8402 FormatStyle LongPointerLeft = getLLVMStyleWithColumns(999); 8403 LongPointerLeft.PointerAlignment = FormatStyle::PAS_Left; 8404 StringRef AllQualifiers = 8405 "const volatile restrict __attribute__((foo)) _Nonnull _Null_unspecified " 8406 "_Nonnull [[clang::attr]] __ptr32 __ptr64 __capability"; 8407 verifyFormat(("x = (foo *" + AllQualifiers + ")*v;").str(), LongPointerRight); 8408 verifyFormat(("x = (foo* " + AllQualifiers + ")*v;").str(), LongPointerLeft); 8409 8410 // Also check that address-of is not parsed as a binary bitwise-and: 8411 verifyFormat("x = (foo *const)&v;"); 8412 verifyFormat(("x = (foo *" + AllQualifiers + ")&v;").str(), LongPointerRight); 8413 verifyFormat(("x = (foo* " + AllQualifiers + ")&v;").str(), LongPointerLeft); 8414 8415 // Check custom qualifiers: 8416 FormatStyle CustomQualifier = getLLVMStyleWithColumns(999); 8417 CustomQualifier.AttributeMacros.push_back("__my_qualifier"); 8418 verifyFormat("x = (foo * __my_qualifier) * v;"); // not parsed as qualifier. 8419 verifyFormat("x = (foo *__my_qualifier)*v;", CustomQualifier); 8420 verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)*v;").str(), 8421 CustomQualifier); 8422 verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)&v;").str(), 8423 CustomQualifier); 8424 8425 // Check that unknown identifiers result in binary operator parsing: 8426 verifyFormat("x = (foo * __unknown_qualifier) * v;"); 8427 verifyFormat("x = (foo * __unknown_qualifier) & v;"); 8428 } 8429 8430 TEST_F(FormatTest, UnderstandsSquareAttributes) { 8431 verifyFormat("SomeType s [[unused]] (InitValue);"); 8432 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 8433 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 8434 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 8435 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 8436 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8437 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8438 verifyFormat("[[nodiscard]] bool f() { return false; }"); 8439 verifyFormat("class [[nodiscard]] f {\npublic:\n f() {}\n}"); 8440 verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n f() {}\n}"); 8441 verifyFormat("class [[gnu::unused]] f {\npublic:\n f() {}\n}"); 8442 8443 // Make sure we do not mistake attributes for array subscripts. 8444 verifyFormat("int a() {}\n" 8445 "[[unused]] int b() {}\n"); 8446 verifyFormat("NSArray *arr;\n" 8447 "arr[[Foo() bar]];"); 8448 8449 // On the other hand, we still need to correctly find array subscripts. 8450 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 8451 8452 // Make sure that we do not mistake Objective-C method inside array literals 8453 // as attributes, even if those method names are also keywords. 8454 verifyFormat("@[ [foo bar] ];"); 8455 verifyFormat("@[ [NSArray class] ];"); 8456 verifyFormat("@[ [foo enum] ];"); 8457 8458 verifyFormat("template <typename T> [[nodiscard]] int a() { return 1; }"); 8459 8460 // Make sure we do not parse attributes as lambda introducers. 8461 FormatStyle MultiLineFunctions = getLLVMStyle(); 8462 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8463 verifyFormat("[[unused]] int b() {\n" 8464 " return 42;\n" 8465 "}\n", 8466 MultiLineFunctions); 8467 } 8468 8469 TEST_F(FormatTest, AttributeClass) { 8470 FormatStyle Style = getChromiumStyle(FormatStyle::LK_Cpp); 8471 verifyFormat("class S {\n" 8472 " S(S&&) = default;\n" 8473 "};", 8474 Style); 8475 verifyFormat("class [[nodiscard]] S {\n" 8476 " S(S&&) = default;\n" 8477 "};", 8478 Style); 8479 verifyFormat("class __attribute((maybeunused)) S {\n" 8480 " S(S&&) = default;\n" 8481 "};", 8482 Style); 8483 verifyFormat("struct S {\n" 8484 " S(S&&) = default;\n" 8485 "};", 8486 Style); 8487 verifyFormat("struct [[nodiscard]] S {\n" 8488 " S(S&&) = default;\n" 8489 "};", 8490 Style); 8491 } 8492 8493 TEST_F(FormatTest, AttributesAfterMacro) { 8494 FormatStyle Style = getLLVMStyle(); 8495 verifyFormat("MACRO;\n" 8496 "__attribute__((maybe_unused)) int foo() {\n" 8497 " //...\n" 8498 "}"); 8499 8500 verifyFormat("MACRO;\n" 8501 "[[nodiscard]] int foo() {\n" 8502 " //...\n" 8503 "}"); 8504 8505 EXPECT_EQ("MACRO\n\n" 8506 "__attribute__((maybe_unused)) int foo() {\n" 8507 " //...\n" 8508 "}", 8509 format("MACRO\n\n" 8510 "__attribute__((maybe_unused)) int foo() {\n" 8511 " //...\n" 8512 "}")); 8513 8514 EXPECT_EQ("MACRO\n\n" 8515 "[[nodiscard]] int foo() {\n" 8516 " //...\n" 8517 "}", 8518 format("MACRO\n\n" 8519 "[[nodiscard]] int foo() {\n" 8520 " //...\n" 8521 "}")); 8522 } 8523 8524 TEST_F(FormatTest, AttributePenaltyBreaking) { 8525 FormatStyle Style = getLLVMStyle(); 8526 verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n" 8527 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8528 Style); 8529 verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n" 8530 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8531 Style); 8532 verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const " 8533 "shared_ptr<ALongTypeName> &C d) {\n}", 8534 Style); 8535 } 8536 8537 TEST_F(FormatTest, UnderstandsEllipsis) { 8538 FormatStyle Style = getLLVMStyle(); 8539 verifyFormat("int printf(const char *fmt, ...);"); 8540 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 8541 verifyFormat("template <class... Ts> void Foo(Ts *...ts) {}"); 8542 8543 verifyFormat("template <int *...PP> a;", Style); 8544 8545 Style.PointerAlignment = FormatStyle::PAS_Left; 8546 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", Style); 8547 8548 verifyFormat("template <int*... PP> a;", Style); 8549 8550 Style.PointerAlignment = FormatStyle::PAS_Middle; 8551 verifyFormat("template <int *... PP> a;", Style); 8552 } 8553 8554 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 8555 EXPECT_EQ("int *a;\n" 8556 "int *a;\n" 8557 "int *a;", 8558 format("int *a;\n" 8559 "int* a;\n" 8560 "int *a;", 8561 getGoogleStyle())); 8562 EXPECT_EQ("int* a;\n" 8563 "int* a;\n" 8564 "int* a;", 8565 format("int* a;\n" 8566 "int* a;\n" 8567 "int *a;", 8568 getGoogleStyle())); 8569 EXPECT_EQ("int *a;\n" 8570 "int *a;\n" 8571 "int *a;", 8572 format("int *a;\n" 8573 "int * a;\n" 8574 "int * a;", 8575 getGoogleStyle())); 8576 EXPECT_EQ("auto x = [] {\n" 8577 " int *a;\n" 8578 " int *a;\n" 8579 " int *a;\n" 8580 "};", 8581 format("auto x=[]{int *a;\n" 8582 "int * a;\n" 8583 "int * a;};", 8584 getGoogleStyle())); 8585 } 8586 8587 TEST_F(FormatTest, UnderstandsRvalueReferences) { 8588 verifyFormat("int f(int &&a) {}"); 8589 verifyFormat("int f(int a, char &&b) {}"); 8590 verifyFormat("void f() { int &&a = b; }"); 8591 verifyGoogleFormat("int f(int a, char&& b) {}"); 8592 verifyGoogleFormat("void f() { int&& a = b; }"); 8593 8594 verifyIndependentOfContext("A<int &&> a;"); 8595 verifyIndependentOfContext("A<int &&, int &&> a;"); 8596 verifyGoogleFormat("A<int&&> a;"); 8597 verifyGoogleFormat("A<int&&, int&&> a;"); 8598 8599 // Not rvalue references: 8600 verifyFormat("template <bool B, bool C> class A {\n" 8601 " static_assert(B && C, \"Something is wrong\");\n" 8602 "};"); 8603 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 8604 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 8605 verifyFormat("#define A(a, b) (a && b)"); 8606 } 8607 8608 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 8609 verifyFormat("void f() {\n" 8610 " x[aaaaaaaaa -\n" 8611 " b] = 23;\n" 8612 "}", 8613 getLLVMStyleWithColumns(15)); 8614 } 8615 8616 TEST_F(FormatTest, FormatsCasts) { 8617 verifyFormat("Type *A = static_cast<Type *>(P);"); 8618 verifyFormat("Type *A = (Type *)P;"); 8619 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 8620 verifyFormat("int a = (int)(2.0f);"); 8621 verifyFormat("int a = (int)2.0f;"); 8622 verifyFormat("x[(int32)y];"); 8623 verifyFormat("x = (int32)y;"); 8624 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 8625 verifyFormat("int a = (int)*b;"); 8626 verifyFormat("int a = (int)2.0f;"); 8627 verifyFormat("int a = (int)~0;"); 8628 verifyFormat("int a = (int)++a;"); 8629 verifyFormat("int a = (int)sizeof(int);"); 8630 verifyFormat("int a = (int)+2;"); 8631 verifyFormat("my_int a = (my_int)2.0f;"); 8632 verifyFormat("my_int a = (my_int)sizeof(int);"); 8633 verifyFormat("return (my_int)aaa;"); 8634 verifyFormat("#define x ((int)-1)"); 8635 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 8636 verifyFormat("#define p(q) ((int *)&q)"); 8637 verifyFormat("fn(a)(b) + 1;"); 8638 8639 verifyFormat("void f() { my_int a = (my_int)*b; }"); 8640 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 8641 verifyFormat("my_int a = (my_int)~0;"); 8642 verifyFormat("my_int a = (my_int)++a;"); 8643 verifyFormat("my_int a = (my_int)-2;"); 8644 verifyFormat("my_int a = (my_int)1;"); 8645 verifyFormat("my_int a = (my_int *)1;"); 8646 verifyFormat("my_int a = (const my_int)-1;"); 8647 verifyFormat("my_int a = (const my_int *)-1;"); 8648 verifyFormat("my_int a = (my_int)(my_int)-1;"); 8649 verifyFormat("my_int a = (ns::my_int)-2;"); 8650 verifyFormat("case (my_int)ONE:"); 8651 verifyFormat("auto x = (X)this;"); 8652 // Casts in Obj-C style calls used to not be recognized as such. 8653 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 8654 8655 // FIXME: single value wrapped with paren will be treated as cast. 8656 verifyFormat("void f(int i = (kValue)*kMask) {}"); 8657 8658 verifyFormat("{ (void)F; }"); 8659 8660 // Don't break after a cast's 8661 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 8662 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 8663 " bbbbbbbbbbbbbbbbbbbbbb);"); 8664 8665 // These are not casts. 8666 verifyFormat("void f(int *) {}"); 8667 verifyFormat("f(foo)->b;"); 8668 verifyFormat("f(foo).b;"); 8669 verifyFormat("f(foo)(b);"); 8670 verifyFormat("f(foo)[b];"); 8671 verifyFormat("[](foo) { return 4; }(bar);"); 8672 verifyFormat("(*funptr)(foo)[4];"); 8673 verifyFormat("funptrs[4](foo)[4];"); 8674 verifyFormat("void f(int *);"); 8675 verifyFormat("void f(int *) = 0;"); 8676 verifyFormat("void f(SmallVector<int>) {}"); 8677 verifyFormat("void f(SmallVector<int>);"); 8678 verifyFormat("void f(SmallVector<int>) = 0;"); 8679 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 8680 verifyFormat("int a = sizeof(int) * b;"); 8681 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 8682 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 8683 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 8684 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 8685 8686 // These are not casts, but at some point were confused with casts. 8687 verifyFormat("virtual void foo(int *) override;"); 8688 verifyFormat("virtual void foo(char &) const;"); 8689 verifyFormat("virtual void foo(int *a, char *) const;"); 8690 verifyFormat("int a = sizeof(int *) + b;"); 8691 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 8692 verifyFormat("bool b = f(g<int>) && c;"); 8693 verifyFormat("typedef void (*f)(int i) func;"); 8694 verifyFormat("void operator++(int) noexcept;"); 8695 verifyFormat("void operator++(int &) noexcept;"); 8696 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 8697 "&) noexcept;"); 8698 verifyFormat( 8699 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 8700 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 8701 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 8702 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 8703 verifyFormat("void operator delete(foo &) noexcept;"); 8704 verifyFormat("void operator delete(foo) noexcept;"); 8705 verifyFormat("void operator delete(int) noexcept;"); 8706 verifyFormat("void operator delete(int &) noexcept;"); 8707 verifyFormat("void operator delete(int &) volatile noexcept;"); 8708 verifyFormat("void operator delete(int &) const"); 8709 verifyFormat("void operator delete(int &) = default"); 8710 verifyFormat("void operator delete(int &) = delete"); 8711 verifyFormat("void operator delete(int &) [[noreturn]]"); 8712 verifyFormat("void operator delete(int &) throw();"); 8713 verifyFormat("void operator delete(int &) throw(int);"); 8714 verifyFormat("auto operator delete(int &) -> int;"); 8715 verifyFormat("auto operator delete(int &) override"); 8716 verifyFormat("auto operator delete(int &) final"); 8717 8718 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 8719 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 8720 // FIXME: The indentation here is not ideal. 8721 verifyFormat( 8722 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8723 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 8724 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 8725 } 8726 8727 TEST_F(FormatTest, FormatsFunctionTypes) { 8728 verifyFormat("A<bool()> a;"); 8729 verifyFormat("A<SomeType()> a;"); 8730 verifyFormat("A<void (*)(int, std::string)> a;"); 8731 verifyFormat("A<void *(int)>;"); 8732 verifyFormat("void *(*a)(int *, SomeType *);"); 8733 verifyFormat("int (*func)(void *);"); 8734 verifyFormat("void f() { int (*func)(void *); }"); 8735 verifyFormat("template <class CallbackClass>\n" 8736 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 8737 8738 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 8739 verifyGoogleFormat("void* (*a)(int);"); 8740 verifyGoogleFormat( 8741 "template <class CallbackClass>\n" 8742 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 8743 8744 // Other constructs can look somewhat like function types: 8745 verifyFormat("A<sizeof(*x)> a;"); 8746 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 8747 verifyFormat("some_var = function(*some_pointer_var)[0];"); 8748 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 8749 verifyFormat("int x = f(&h)();"); 8750 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 8751 verifyFormat("std::function<\n" 8752 " LooooooooooongTemplatedType<\n" 8753 " SomeType>*(\n" 8754 " LooooooooooooooooongType type)>\n" 8755 " function;", 8756 getGoogleStyleWithColumns(40)); 8757 } 8758 8759 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 8760 verifyFormat("A (*foo_)[6];"); 8761 verifyFormat("vector<int> (*foo_)[6];"); 8762 } 8763 8764 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 8765 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8766 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8767 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 8768 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8769 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8770 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8771 8772 // Different ways of ()-initializiation. 8773 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8774 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 8775 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8776 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 8777 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8778 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 8779 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8780 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 8781 8782 // Lambdas should not confuse the variable declaration heuristic. 8783 verifyFormat("LooooooooooooooooongType\n" 8784 " variable(nullptr, [](A *a) {});", 8785 getLLVMStyleWithColumns(40)); 8786 } 8787 8788 TEST_F(FormatTest, BreaksLongDeclarations) { 8789 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 8790 " AnotherNameForTheLongType;"); 8791 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 8792 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 8793 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8794 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8795 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 8796 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8797 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8798 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8799 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 8800 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8801 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8802 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8803 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8804 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8805 verifyFormat("typeof(LoooooooooooooooooooooooooooooooooooooooooongName)\n" 8806 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8807 verifyFormat("_Atomic(LooooooooooooooooooooooooooooooooooooooooongName)\n" 8808 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8809 verifyFormat("__underlying_type(LooooooooooooooooooooooooooooooongName)\n" 8810 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8811 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8812 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 8813 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8814 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 8815 FormatStyle Indented = getLLVMStyle(); 8816 Indented.IndentWrappedFunctionNames = true; 8817 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8818 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 8819 Indented); 8820 verifyFormat( 8821 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8822 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8823 Indented); 8824 verifyFormat( 8825 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8826 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8827 Indented); 8828 verifyFormat( 8829 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8830 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8831 Indented); 8832 8833 // FIXME: Without the comment, this breaks after "(". 8834 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 8835 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 8836 getGoogleStyle()); 8837 8838 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 8839 " int LoooooooooooooooooooongParam2) {}"); 8840 verifyFormat( 8841 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 8842 " SourceLocation L, IdentifierIn *II,\n" 8843 " Type *T) {}"); 8844 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 8845 "ReallyReaaallyLongFunctionName(\n" 8846 " const std::string &SomeParameter,\n" 8847 " const SomeType<string, SomeOtherTemplateParameter>\n" 8848 " &ReallyReallyLongParameterName,\n" 8849 " const SomeType<string, SomeOtherTemplateParameter>\n" 8850 " &AnotherLongParameterName) {}"); 8851 verifyFormat("template <typename A>\n" 8852 "SomeLoooooooooooooooooooooongType<\n" 8853 " typename some_namespace::SomeOtherType<A>::Type>\n" 8854 "Function() {}"); 8855 8856 verifyGoogleFormat( 8857 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 8858 " aaaaaaaaaaaaaaaaaaaaaaa;"); 8859 verifyGoogleFormat( 8860 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 8861 " SourceLocation L) {}"); 8862 verifyGoogleFormat( 8863 "some_namespace::LongReturnType\n" 8864 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 8865 " int first_long_parameter, int second_parameter) {}"); 8866 8867 verifyGoogleFormat("template <typename T>\n" 8868 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8869 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 8870 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8871 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 8872 8873 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 8874 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8875 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8876 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8877 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8878 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 8879 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8880 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 8881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 8882 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8883 8884 verifyFormat("template <typename T> // Templates on own line.\n" 8885 "static int // Some comment.\n" 8886 "MyFunction(int a);", 8887 getLLVMStyle()); 8888 } 8889 8890 TEST_F(FormatTest, FormatsArrays) { 8891 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8892 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 8893 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 8894 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 8895 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 8896 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 8897 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8898 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8899 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8900 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 8901 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8902 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8903 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8904 verifyFormat( 8905 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 8906 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8907 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 8908 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 8909 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8910 8911 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 8912 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 8913 verifyFormat( 8914 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 8915 " .aaaaaaa[0]\n" 8916 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8917 verifyFormat("a[::b::c];"); 8918 8919 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 8920 8921 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 8922 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 8923 } 8924 8925 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 8926 verifyFormat("(a)->b();"); 8927 verifyFormat("--a;"); 8928 } 8929 8930 TEST_F(FormatTest, HandlesIncludeDirectives) { 8931 verifyFormat("#include <string>\n" 8932 "#include <a/b/c.h>\n" 8933 "#include \"a/b/string\"\n" 8934 "#include \"string.h\"\n" 8935 "#include \"string.h\"\n" 8936 "#include <a-a>\n" 8937 "#include < path with space >\n" 8938 "#include_next <test.h>" 8939 "#include \"abc.h\" // this is included for ABC\n" 8940 "#include \"some long include\" // with a comment\n" 8941 "#include \"some very long include path\"\n" 8942 "#include <some/very/long/include/path>\n", 8943 getLLVMStyleWithColumns(35)); 8944 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 8945 EXPECT_EQ("#include <a>", format("#include<a>")); 8946 8947 verifyFormat("#import <string>"); 8948 verifyFormat("#import <a/b/c.h>"); 8949 verifyFormat("#import \"a/b/string\""); 8950 verifyFormat("#import \"string.h\""); 8951 verifyFormat("#import \"string.h\""); 8952 verifyFormat("#if __has_include(<strstream>)\n" 8953 "#include <strstream>\n" 8954 "#endif"); 8955 8956 verifyFormat("#define MY_IMPORT <a/b>"); 8957 8958 verifyFormat("#if __has_include(<a/b>)"); 8959 verifyFormat("#if __has_include_next(<a/b>)"); 8960 verifyFormat("#define F __has_include(<a/b>)"); 8961 verifyFormat("#define F __has_include_next(<a/b>)"); 8962 8963 // Protocol buffer definition or missing "#". 8964 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 8965 getLLVMStyleWithColumns(30)); 8966 8967 FormatStyle Style = getLLVMStyle(); 8968 Style.AlwaysBreakBeforeMultilineStrings = true; 8969 Style.ColumnLimit = 0; 8970 verifyFormat("#import \"abc.h\"", Style); 8971 8972 // But 'import' might also be a regular C++ namespace. 8973 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8974 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8975 } 8976 8977 //===----------------------------------------------------------------------===// 8978 // Error recovery tests. 8979 //===----------------------------------------------------------------------===// 8980 8981 TEST_F(FormatTest, IncompleteParameterLists) { 8982 FormatStyle NoBinPacking = getLLVMStyle(); 8983 NoBinPacking.BinPackParameters = false; 8984 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 8985 " double *min_x,\n" 8986 " double *max_x,\n" 8987 " double *min_y,\n" 8988 " double *max_y,\n" 8989 " double *min_z,\n" 8990 " double *max_z, ) {}", 8991 NoBinPacking); 8992 } 8993 8994 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 8995 verifyFormat("void f() { return; }\n42"); 8996 verifyFormat("void f() {\n" 8997 " if (0)\n" 8998 " return;\n" 8999 "}\n" 9000 "42"); 9001 verifyFormat("void f() { return }\n42"); 9002 verifyFormat("void f() {\n" 9003 " if (0)\n" 9004 " return\n" 9005 "}\n" 9006 "42"); 9007 } 9008 9009 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 9010 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 9011 EXPECT_EQ("void f() {\n" 9012 " if (a)\n" 9013 " return\n" 9014 "}", 9015 format("void f ( ) { if ( a ) return }")); 9016 EXPECT_EQ("namespace N {\n" 9017 "void f()\n" 9018 "}", 9019 format("namespace N { void f() }")); 9020 EXPECT_EQ("namespace N {\n" 9021 "void f() {}\n" 9022 "void g()\n" 9023 "} // namespace N", 9024 format("namespace N { void f( ) { } void g( ) }")); 9025 } 9026 9027 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 9028 verifyFormat("int aaaaaaaa =\n" 9029 " // Overlylongcomment\n" 9030 " b;", 9031 getLLVMStyleWithColumns(20)); 9032 verifyFormat("function(\n" 9033 " ShortArgument,\n" 9034 " LoooooooooooongArgument);\n", 9035 getLLVMStyleWithColumns(20)); 9036 } 9037 9038 TEST_F(FormatTest, IncorrectAccessSpecifier) { 9039 verifyFormat("public:"); 9040 verifyFormat("class A {\n" 9041 "public\n" 9042 " void f() {}\n" 9043 "};"); 9044 verifyFormat("public\n" 9045 "int qwerty;"); 9046 verifyFormat("public\n" 9047 "B {}"); 9048 verifyFormat("public\n" 9049 "{}"); 9050 verifyFormat("public\n" 9051 "B { int x; }"); 9052 } 9053 9054 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 9055 verifyFormat("{"); 9056 verifyFormat("#})"); 9057 verifyNoCrash("(/**/[:!] ?[)."); 9058 } 9059 9060 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 9061 // Found by oss-fuzz: 9062 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 9063 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 9064 Style.ColumnLimit = 60; 9065 verifyNoCrash( 9066 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 9067 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 9068 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 9069 Style); 9070 } 9071 9072 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 9073 verifyFormat("do {\n}"); 9074 verifyFormat("do {\n}\n" 9075 "f();"); 9076 verifyFormat("do {\n}\n" 9077 "wheeee(fun);"); 9078 verifyFormat("do {\n" 9079 " f();\n" 9080 "}"); 9081 } 9082 9083 TEST_F(FormatTest, IncorrectCodeMissingParens) { 9084 verifyFormat("if {\n foo;\n foo();\n}"); 9085 verifyFormat("switch {\n foo;\n foo();\n}"); 9086 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 9087 verifyFormat("while {\n foo;\n foo();\n}"); 9088 verifyFormat("do {\n foo;\n foo();\n} while;"); 9089 } 9090 9091 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 9092 verifyIncompleteFormat("namespace {\n" 9093 "class Foo { Foo (\n" 9094 "};\n" 9095 "} // namespace"); 9096 } 9097 9098 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 9099 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 9100 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 9101 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 9102 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 9103 9104 EXPECT_EQ("{\n" 9105 " {\n" 9106 " breakme(\n" 9107 " qwe);\n" 9108 " }\n", 9109 format("{\n" 9110 " {\n" 9111 " breakme(qwe);\n" 9112 "}\n", 9113 getLLVMStyleWithColumns(10))); 9114 } 9115 9116 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 9117 verifyFormat("int x = {\n" 9118 " avariable,\n" 9119 " b(alongervariable)};", 9120 getLLVMStyleWithColumns(25)); 9121 } 9122 9123 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 9124 verifyFormat("return (a)(b){1, 2, 3};"); 9125 } 9126 9127 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 9128 verifyFormat("vector<int> x{1, 2, 3, 4};"); 9129 verifyFormat("vector<int> x{\n" 9130 " 1,\n" 9131 " 2,\n" 9132 " 3,\n" 9133 " 4,\n" 9134 "};"); 9135 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 9136 verifyFormat("f({1, 2});"); 9137 verifyFormat("auto v = Foo{-1};"); 9138 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 9139 verifyFormat("Class::Class : member{1, 2, 3} {}"); 9140 verifyFormat("new vector<int>{1, 2, 3};"); 9141 verifyFormat("new int[3]{1, 2, 3};"); 9142 verifyFormat("new int{1};"); 9143 verifyFormat("return {arg1, arg2};"); 9144 verifyFormat("return {arg1, SomeType{parameter}};"); 9145 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 9146 verifyFormat("new T{arg1, arg2};"); 9147 verifyFormat("f(MyMap[{composite, key}]);"); 9148 verifyFormat("class Class {\n" 9149 " T member = {arg1, arg2};\n" 9150 "};"); 9151 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 9152 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 9153 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 9154 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 9155 verifyFormat("int a = std::is_integral<int>{} + 0;"); 9156 9157 verifyFormat("int foo(int i) { return fo1{}(i); }"); 9158 verifyFormat("int foo(int i) { return fo1{}(i); }"); 9159 verifyFormat("auto i = decltype(x){};"); 9160 verifyFormat("auto i = typeof(x){};"); 9161 verifyFormat("auto i = _Atomic(x){};"); 9162 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 9163 verifyFormat("Node n{1, Node{1000}, //\n" 9164 " 2};"); 9165 verifyFormat("Aaaa aaaaaaa{\n" 9166 " {\n" 9167 " aaaa,\n" 9168 " },\n" 9169 "};"); 9170 verifyFormat("class C : public D {\n" 9171 " SomeClass SC{2};\n" 9172 "};"); 9173 verifyFormat("class C : public A {\n" 9174 " class D : public B {\n" 9175 " void f() { int i{2}; }\n" 9176 " };\n" 9177 "};"); 9178 verifyFormat("#define A {a, a},"); 9179 9180 // Avoid breaking between equal sign and opening brace 9181 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 9182 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 9183 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 9184 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 9185 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 9186 " {\"ccccccccccccccccccccc\", 2}};", 9187 AvoidBreakingFirstArgument); 9188 9189 // Binpacking only if there is no trailing comma 9190 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 9191 " cccccccccc, dddddddddd};", 9192 getLLVMStyleWithColumns(50)); 9193 verifyFormat("const Aaaaaa aaaaa = {\n" 9194 " aaaaaaaaaaa,\n" 9195 " bbbbbbbbbbb,\n" 9196 " ccccccccccc,\n" 9197 " ddddddddddd,\n" 9198 "};", 9199 getLLVMStyleWithColumns(50)); 9200 9201 // Cases where distinguising braced lists and blocks is hard. 9202 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 9203 verifyFormat("void f() {\n" 9204 " return; // comment\n" 9205 "}\n" 9206 "SomeType t;"); 9207 verifyFormat("void f() {\n" 9208 " if (a) {\n" 9209 " f();\n" 9210 " }\n" 9211 "}\n" 9212 "SomeType t;"); 9213 9214 // In combination with BinPackArguments = false. 9215 FormatStyle NoBinPacking = getLLVMStyle(); 9216 NoBinPacking.BinPackArguments = false; 9217 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 9218 " bbbbb,\n" 9219 " ccccc,\n" 9220 " ddddd,\n" 9221 " eeeee,\n" 9222 " ffffff,\n" 9223 " ggggg,\n" 9224 " hhhhhh,\n" 9225 " iiiiii,\n" 9226 " jjjjjj,\n" 9227 " kkkkkk};", 9228 NoBinPacking); 9229 verifyFormat("const Aaaaaa aaaaa = {\n" 9230 " aaaaa,\n" 9231 " bbbbb,\n" 9232 " ccccc,\n" 9233 " ddddd,\n" 9234 " eeeee,\n" 9235 " ffffff,\n" 9236 " ggggg,\n" 9237 " hhhhhh,\n" 9238 " iiiiii,\n" 9239 " jjjjjj,\n" 9240 " kkkkkk,\n" 9241 "};", 9242 NoBinPacking); 9243 verifyFormat( 9244 "const Aaaaaa aaaaa = {\n" 9245 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 9246 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 9247 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 9248 "};", 9249 NoBinPacking); 9250 9251 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9252 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 9253 " CDDDP83848_BMCR_REGISTER,\n" 9254 " CDDDP83848_BMSR_REGISTER,\n" 9255 " CDDDP83848_RBR_REGISTER};", 9256 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 9257 " CDDDP83848_BMSR_REGISTER,\n" 9258 " CDDDP83848_RBR_REGISTER};", 9259 NoBinPacking)); 9260 9261 // FIXME: The alignment of these trailing comments might be bad. Then again, 9262 // this might be utterly useless in real code. 9263 verifyFormat("Constructor::Constructor()\n" 9264 " : some_value{ //\n" 9265 " aaaaaaa, //\n" 9266 " bbbbbbb} {}"); 9267 9268 // In braced lists, the first comment is always assumed to belong to the 9269 // first element. Thus, it can be moved to the next or previous line as 9270 // appropriate. 9271 EXPECT_EQ("function({// First element:\n" 9272 " 1,\n" 9273 " // Second element:\n" 9274 " 2});", 9275 format("function({\n" 9276 " // First element:\n" 9277 " 1,\n" 9278 " // Second element:\n" 9279 " 2});")); 9280 EXPECT_EQ("std::vector<int> MyNumbers{\n" 9281 " // First element:\n" 9282 " 1,\n" 9283 " // Second element:\n" 9284 " 2};", 9285 format("std::vector<int> MyNumbers{// First element:\n" 9286 " 1,\n" 9287 " // Second element:\n" 9288 " 2};", 9289 getLLVMStyleWithColumns(30))); 9290 // A trailing comma should still lead to an enforced line break and no 9291 // binpacking. 9292 EXPECT_EQ("vector<int> SomeVector = {\n" 9293 " // aaa\n" 9294 " 1,\n" 9295 " 2,\n" 9296 "};", 9297 format("vector<int> SomeVector = { // aaa\n" 9298 " 1, 2, };")); 9299 9300 // C++11 brace initializer list l-braces should not be treated any differently 9301 // when breaking before lambda bodies is enabled 9302 FormatStyle BreakBeforeLambdaBody = getLLVMStyle(); 9303 BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 9304 BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 9305 BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true; 9306 verifyFormat( 9307 "std::runtime_error{\n" 9308 " \"Long string which will force a break onto the next line...\"};", 9309 BreakBeforeLambdaBody); 9310 9311 FormatStyle ExtraSpaces = getLLVMStyle(); 9312 ExtraSpaces.Cpp11BracedListStyle = false; 9313 ExtraSpaces.ColumnLimit = 75; 9314 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 9315 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 9316 verifyFormat("f({ 1, 2 });", ExtraSpaces); 9317 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 9318 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 9319 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 9320 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 9321 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 9322 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 9323 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 9324 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 9325 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 9326 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 9327 verifyFormat("class Class {\n" 9328 " T member = { arg1, arg2 };\n" 9329 "};", 9330 ExtraSpaces); 9331 verifyFormat( 9332 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9333 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 9334 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 9335 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 9336 ExtraSpaces); 9337 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 9338 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 9339 ExtraSpaces); 9340 verifyFormat( 9341 "someFunction(OtherParam,\n" 9342 " BracedList{ // comment 1 (Forcing interesting break)\n" 9343 " param1, param2,\n" 9344 " // comment 2\n" 9345 " param3, param4 });", 9346 ExtraSpaces); 9347 verifyFormat( 9348 "std::this_thread::sleep_for(\n" 9349 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 9350 ExtraSpaces); 9351 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 9352 " aaaaaaa,\n" 9353 " aaaaaaaaaa,\n" 9354 " aaaaa,\n" 9355 " aaaaaaaaaaaaaaa,\n" 9356 " aaa,\n" 9357 " aaaaaaaaaa,\n" 9358 " a,\n" 9359 " aaaaaaaaaaaaaaaaaaaaa,\n" 9360 " aaaaaaaaaaaa,\n" 9361 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 9362 " aaaaaaa,\n" 9363 " a};"); 9364 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 9365 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 9366 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 9367 9368 // Avoid breaking between initializer/equal sign and opening brace 9369 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 9370 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 9371 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 9372 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 9373 " { \"ccccccccccccccccccccc\", 2 }\n" 9374 "};", 9375 ExtraSpaces); 9376 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 9377 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 9378 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 9379 " { \"ccccccccccccccccccccc\", 2 }\n" 9380 "};", 9381 ExtraSpaces); 9382 9383 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 9384 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 9385 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 9386 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 9387 9388 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 9389 SpaceBetweenBraces.SpacesInAngles = true; 9390 SpaceBetweenBraces.SpacesInParentheses = true; 9391 SpaceBetweenBraces.SpacesInSquareBrackets = true; 9392 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 9393 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 9394 verifyFormat("vector< int > x{ // comment 1\n" 9395 " 1, 2, 3, 4 };", 9396 SpaceBetweenBraces); 9397 SpaceBetweenBraces.ColumnLimit = 20; 9398 EXPECT_EQ("vector< int > x{\n" 9399 " 1, 2, 3, 4 };", 9400 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 9401 SpaceBetweenBraces.ColumnLimit = 24; 9402 EXPECT_EQ("vector< int > x{ 1, 2,\n" 9403 " 3, 4 };", 9404 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 9405 EXPECT_EQ("vector< int > x{\n" 9406 " 1,\n" 9407 " 2,\n" 9408 " 3,\n" 9409 " 4,\n" 9410 "};", 9411 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 9412 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 9413 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 9414 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 9415 } 9416 9417 TEST_F(FormatTest, FormatSpacesInAngles) { 9418 FormatStyle SpaceInAngles = getLLVMStyle(); 9419 SpaceInAngles.SpacesInAngles = true; 9420 verifyFormat("vector< ::std::string > x1;", SpaceInAngles); 9421 verifyFormat("Foo< int, Bar > x2;", SpaceInAngles); 9422 verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles); 9423 9424 SpaceInAngles.SpacesInAngles = false; 9425 verifyFormat("vector<::std::string> x4;", SpaceInAngles); 9426 verifyFormat("vector<int> x5;", SpaceInAngles); 9427 verifyFormat("Foo<int, Bar> x6;", SpaceInAngles); 9428 verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles); 9429 } 9430 9431 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 9432 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9433 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9434 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9435 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9436 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9437 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 9438 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 9439 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9440 " 1, 22, 333, 4444, 55555, //\n" 9441 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9442 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 9443 verifyFormat( 9444 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9445 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9446 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 9447 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9448 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9449 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9450 " 7777777};"); 9451 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9452 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9453 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9454 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9455 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9456 " // Separating comment.\n" 9457 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9458 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9459 " // Leading comment\n" 9460 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9461 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9462 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9463 " 1, 1, 1, 1};", 9464 getLLVMStyleWithColumns(39)); 9465 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9466 " 1, 1, 1, 1};", 9467 getLLVMStyleWithColumns(38)); 9468 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 9469 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 9470 getLLVMStyleWithColumns(43)); 9471 verifyFormat( 9472 "static unsigned SomeValues[10][3] = {\n" 9473 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 9474 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 9475 verifyFormat("static auto fields = new vector<string>{\n" 9476 " \"aaaaaaaaaaaaa\",\n" 9477 " \"aaaaaaaaaaaaa\",\n" 9478 " \"aaaaaaaaaaaa\",\n" 9479 " \"aaaaaaaaaaaaaa\",\n" 9480 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9481 " \"aaaaaaaaaaaa\",\n" 9482 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9483 "};"); 9484 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 9485 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 9486 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 9487 " 3, cccccccccccccccccccccc};", 9488 getLLVMStyleWithColumns(60)); 9489 9490 // Trailing commas. 9491 verifyFormat("vector<int> x = {\n" 9492 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 9493 "};", 9494 getLLVMStyleWithColumns(39)); 9495 verifyFormat("vector<int> x = {\n" 9496 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 9497 "};", 9498 getLLVMStyleWithColumns(39)); 9499 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9500 " 1, 1, 1, 1,\n" 9501 " /**/ /**/};", 9502 getLLVMStyleWithColumns(39)); 9503 9504 // Trailing comment in the first line. 9505 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 9506 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 9507 " 111111111, 222222222, 3333333333, 444444444, //\n" 9508 " 11111111, 22222222, 333333333, 44444444};"); 9509 // Trailing comment in the last line. 9510 verifyFormat("int aaaaa[] = {\n" 9511 " 1, 2, 3, // comment\n" 9512 " 4, 5, 6 // comment\n" 9513 "};"); 9514 9515 // With nested lists, we should either format one item per line or all nested 9516 // lists one on line. 9517 // FIXME: For some nested lists, we can do better. 9518 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 9519 " {aaaaaaaaaaaaaaaaaaa},\n" 9520 " {aaaaaaaaaaaaaaaaaaaaa},\n" 9521 " {aaaaaaaaaaaaaaaaa}};", 9522 getLLVMStyleWithColumns(60)); 9523 verifyFormat( 9524 "SomeStruct my_struct_array = {\n" 9525 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 9526 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 9527 " {aaa, aaa},\n" 9528 " {aaa, aaa},\n" 9529 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 9530 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 9531 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 9532 9533 // No column layout should be used here. 9534 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 9535 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 9536 9537 verifyNoCrash("a<,"); 9538 9539 // No braced initializer here. 9540 verifyFormat("void f() {\n" 9541 " struct Dummy {};\n" 9542 " f(v);\n" 9543 "}"); 9544 9545 // Long lists should be formatted in columns even if they are nested. 9546 verifyFormat( 9547 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9548 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9549 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9550 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9551 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9552 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 9553 9554 // Allow "single-column" layout even if that violates the column limit. There 9555 // isn't going to be a better way. 9556 verifyFormat("std::vector<int> a = {\n" 9557 " aaaaaaaa,\n" 9558 " aaaaaaaa,\n" 9559 " aaaaaaaa,\n" 9560 " aaaaaaaa,\n" 9561 " aaaaaaaaaa,\n" 9562 " aaaaaaaa,\n" 9563 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 9564 getLLVMStyleWithColumns(30)); 9565 verifyFormat("vector<int> aaaa = {\n" 9566 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9567 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9568 " aaaaaa.aaaaaaa,\n" 9569 " aaaaaa.aaaaaaa,\n" 9570 " aaaaaa.aaaaaaa,\n" 9571 " aaaaaa.aaaaaaa,\n" 9572 "};"); 9573 9574 // Don't create hanging lists. 9575 verifyFormat("someFunction(Param, {List1, List2,\n" 9576 " List3});", 9577 getLLVMStyleWithColumns(35)); 9578 verifyFormat("someFunction(Param, Param,\n" 9579 " {List1, List2,\n" 9580 " List3});", 9581 getLLVMStyleWithColumns(35)); 9582 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 9583 " aaaaaaaaaaaaaaaaaaaaaaa);"); 9584 } 9585 9586 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 9587 FormatStyle DoNotMerge = getLLVMStyle(); 9588 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9589 9590 verifyFormat("void f() { return 42; }"); 9591 verifyFormat("void f() {\n" 9592 " return 42;\n" 9593 "}", 9594 DoNotMerge); 9595 verifyFormat("void f() {\n" 9596 " // Comment\n" 9597 "}"); 9598 verifyFormat("{\n" 9599 "#error {\n" 9600 " int a;\n" 9601 "}"); 9602 verifyFormat("{\n" 9603 " int a;\n" 9604 "#error {\n" 9605 "}"); 9606 verifyFormat("void f() {} // comment"); 9607 verifyFormat("void f() { int a; } // comment"); 9608 verifyFormat("void f() {\n" 9609 "} // comment", 9610 DoNotMerge); 9611 verifyFormat("void f() {\n" 9612 " int a;\n" 9613 "} // comment", 9614 DoNotMerge); 9615 verifyFormat("void f() {\n" 9616 "} // comment", 9617 getLLVMStyleWithColumns(15)); 9618 9619 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 9620 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 9621 9622 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 9623 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 9624 verifyFormat("class C {\n" 9625 " C()\n" 9626 " : iiiiiiii(nullptr),\n" 9627 " kkkkkkk(nullptr),\n" 9628 " mmmmmmm(nullptr),\n" 9629 " nnnnnnn(nullptr) {}\n" 9630 "};", 9631 getGoogleStyle()); 9632 9633 FormatStyle NoColumnLimit = getLLVMStyle(); 9634 NoColumnLimit.ColumnLimit = 0; 9635 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 9636 EXPECT_EQ("class C {\n" 9637 " A() : b(0) {}\n" 9638 "};", 9639 format("class C{A():b(0){}};", NoColumnLimit)); 9640 EXPECT_EQ("A()\n" 9641 " : b(0) {\n" 9642 "}", 9643 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 9644 9645 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 9646 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 9647 FormatStyle::SFS_None; 9648 EXPECT_EQ("A()\n" 9649 " : b(0) {\n" 9650 "}", 9651 format("A():b(0){}", DoNotMergeNoColumnLimit)); 9652 EXPECT_EQ("A()\n" 9653 " : b(0) {\n" 9654 "}", 9655 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 9656 9657 verifyFormat("#define A \\\n" 9658 " void f() { \\\n" 9659 " int i; \\\n" 9660 " }", 9661 getLLVMStyleWithColumns(20)); 9662 verifyFormat("#define A \\\n" 9663 " void f() { int i; }", 9664 getLLVMStyleWithColumns(21)); 9665 verifyFormat("#define A \\\n" 9666 " void f() { \\\n" 9667 " int i; \\\n" 9668 " } \\\n" 9669 " int j;", 9670 getLLVMStyleWithColumns(22)); 9671 verifyFormat("#define A \\\n" 9672 " void f() { int i; } \\\n" 9673 " int j;", 9674 getLLVMStyleWithColumns(23)); 9675 } 9676 9677 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 9678 FormatStyle MergeEmptyOnly = getLLVMStyle(); 9679 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9680 verifyFormat("class C {\n" 9681 " int f() {}\n" 9682 "};", 9683 MergeEmptyOnly); 9684 verifyFormat("class C {\n" 9685 " int f() {\n" 9686 " return 42;\n" 9687 " }\n" 9688 "};", 9689 MergeEmptyOnly); 9690 verifyFormat("int f() {}", MergeEmptyOnly); 9691 verifyFormat("int f() {\n" 9692 " return 42;\n" 9693 "}", 9694 MergeEmptyOnly); 9695 9696 // Also verify behavior when BraceWrapping.AfterFunction = true 9697 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9698 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 9699 verifyFormat("int f() {}", MergeEmptyOnly); 9700 verifyFormat("class C {\n" 9701 " int f() {}\n" 9702 "};", 9703 MergeEmptyOnly); 9704 } 9705 9706 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 9707 FormatStyle MergeInlineOnly = getLLVMStyle(); 9708 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9709 verifyFormat("class C {\n" 9710 " int f() { return 42; }\n" 9711 "};", 9712 MergeInlineOnly); 9713 verifyFormat("int f() {\n" 9714 " return 42;\n" 9715 "}", 9716 MergeInlineOnly); 9717 9718 // SFS_Inline implies SFS_Empty 9719 verifyFormat("class C {\n" 9720 " int f() {}\n" 9721 "};", 9722 MergeInlineOnly); 9723 verifyFormat("int f() {}", MergeInlineOnly); 9724 9725 // Also verify behavior when BraceWrapping.AfterFunction = true 9726 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9727 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9728 verifyFormat("class C {\n" 9729 " int f() { return 42; }\n" 9730 "};", 9731 MergeInlineOnly); 9732 verifyFormat("int f()\n" 9733 "{\n" 9734 " return 42;\n" 9735 "}", 9736 MergeInlineOnly); 9737 9738 // SFS_Inline implies SFS_Empty 9739 verifyFormat("int f() {}", MergeInlineOnly); 9740 verifyFormat("class C {\n" 9741 " int f() {}\n" 9742 "};", 9743 MergeInlineOnly); 9744 } 9745 9746 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 9747 FormatStyle MergeInlineOnly = getLLVMStyle(); 9748 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 9749 FormatStyle::SFS_InlineOnly; 9750 verifyFormat("class C {\n" 9751 " int f() { return 42; }\n" 9752 "};", 9753 MergeInlineOnly); 9754 verifyFormat("int f() {\n" 9755 " return 42;\n" 9756 "}", 9757 MergeInlineOnly); 9758 9759 // SFS_InlineOnly does not imply SFS_Empty 9760 verifyFormat("class C {\n" 9761 " int f() {}\n" 9762 "};", 9763 MergeInlineOnly); 9764 verifyFormat("int f() {\n" 9765 "}", 9766 MergeInlineOnly); 9767 9768 // Also verify behavior when BraceWrapping.AfterFunction = true 9769 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9770 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9771 verifyFormat("class C {\n" 9772 " int f() { return 42; }\n" 9773 "};", 9774 MergeInlineOnly); 9775 verifyFormat("int f()\n" 9776 "{\n" 9777 " return 42;\n" 9778 "}", 9779 MergeInlineOnly); 9780 9781 // SFS_InlineOnly does not imply SFS_Empty 9782 verifyFormat("int f()\n" 9783 "{\n" 9784 "}", 9785 MergeInlineOnly); 9786 verifyFormat("class C {\n" 9787 " int f() {}\n" 9788 "};", 9789 MergeInlineOnly); 9790 } 9791 9792 TEST_F(FormatTest, SplitEmptyFunction) { 9793 FormatStyle Style = getLLVMStyle(); 9794 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9795 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9796 Style.BraceWrapping.AfterFunction = true; 9797 Style.BraceWrapping.SplitEmptyFunction = false; 9798 Style.ColumnLimit = 40; 9799 9800 verifyFormat("int f()\n" 9801 "{}", 9802 Style); 9803 verifyFormat("int f()\n" 9804 "{\n" 9805 " return 42;\n" 9806 "}", 9807 Style); 9808 verifyFormat("int f()\n" 9809 "{\n" 9810 " // some comment\n" 9811 "}", 9812 Style); 9813 9814 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9815 verifyFormat("int f() {}", Style); 9816 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9817 "{}", 9818 Style); 9819 verifyFormat("int f()\n" 9820 "{\n" 9821 " return 0;\n" 9822 "}", 9823 Style); 9824 9825 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9826 verifyFormat("class Foo {\n" 9827 " int f() {}\n" 9828 "};\n", 9829 Style); 9830 verifyFormat("class Foo {\n" 9831 " int f() { return 0; }\n" 9832 "};\n", 9833 Style); 9834 verifyFormat("class Foo {\n" 9835 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9836 " {}\n" 9837 "};\n", 9838 Style); 9839 verifyFormat("class Foo {\n" 9840 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9841 " {\n" 9842 " return 0;\n" 9843 " }\n" 9844 "};\n", 9845 Style); 9846 9847 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9848 verifyFormat("int f() {}", Style); 9849 verifyFormat("int f() { return 0; }", Style); 9850 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9851 "{}", 9852 Style); 9853 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9854 "{\n" 9855 " return 0;\n" 9856 "}", 9857 Style); 9858 } 9859 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 9860 FormatStyle Style = getLLVMStyle(); 9861 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9862 verifyFormat("#ifdef A\n" 9863 "int f() {}\n" 9864 "#else\n" 9865 "int g() {}\n" 9866 "#endif", 9867 Style); 9868 } 9869 9870 TEST_F(FormatTest, SplitEmptyClass) { 9871 FormatStyle Style = getLLVMStyle(); 9872 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9873 Style.BraceWrapping.AfterClass = true; 9874 Style.BraceWrapping.SplitEmptyRecord = false; 9875 9876 verifyFormat("class Foo\n" 9877 "{};", 9878 Style); 9879 verifyFormat("/* something */ class Foo\n" 9880 "{};", 9881 Style); 9882 verifyFormat("template <typename X> class Foo\n" 9883 "{};", 9884 Style); 9885 verifyFormat("class Foo\n" 9886 "{\n" 9887 " Foo();\n" 9888 "};", 9889 Style); 9890 verifyFormat("typedef class Foo\n" 9891 "{\n" 9892 "} Foo_t;", 9893 Style); 9894 } 9895 9896 TEST_F(FormatTest, SplitEmptyStruct) { 9897 FormatStyle Style = getLLVMStyle(); 9898 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9899 Style.BraceWrapping.AfterStruct = true; 9900 Style.BraceWrapping.SplitEmptyRecord = false; 9901 9902 verifyFormat("struct Foo\n" 9903 "{};", 9904 Style); 9905 verifyFormat("/* something */ struct Foo\n" 9906 "{};", 9907 Style); 9908 verifyFormat("template <typename X> struct Foo\n" 9909 "{};", 9910 Style); 9911 verifyFormat("struct Foo\n" 9912 "{\n" 9913 " Foo();\n" 9914 "};", 9915 Style); 9916 verifyFormat("typedef struct Foo\n" 9917 "{\n" 9918 "} Foo_t;", 9919 Style); 9920 // typedef struct Bar {} Bar_t; 9921 } 9922 9923 TEST_F(FormatTest, SplitEmptyUnion) { 9924 FormatStyle Style = getLLVMStyle(); 9925 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9926 Style.BraceWrapping.AfterUnion = true; 9927 Style.BraceWrapping.SplitEmptyRecord = false; 9928 9929 verifyFormat("union Foo\n" 9930 "{};", 9931 Style); 9932 verifyFormat("/* something */ union Foo\n" 9933 "{};", 9934 Style); 9935 verifyFormat("union Foo\n" 9936 "{\n" 9937 " A,\n" 9938 "};", 9939 Style); 9940 verifyFormat("typedef union Foo\n" 9941 "{\n" 9942 "} Foo_t;", 9943 Style); 9944 } 9945 9946 TEST_F(FormatTest, SplitEmptyNamespace) { 9947 FormatStyle Style = getLLVMStyle(); 9948 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9949 Style.BraceWrapping.AfterNamespace = true; 9950 Style.BraceWrapping.SplitEmptyNamespace = false; 9951 9952 verifyFormat("namespace Foo\n" 9953 "{};", 9954 Style); 9955 verifyFormat("/* something */ namespace Foo\n" 9956 "{};", 9957 Style); 9958 verifyFormat("inline namespace Foo\n" 9959 "{};", 9960 Style); 9961 verifyFormat("/* something */ inline namespace Foo\n" 9962 "{};", 9963 Style); 9964 verifyFormat("export namespace Foo\n" 9965 "{};", 9966 Style); 9967 verifyFormat("namespace Foo\n" 9968 "{\n" 9969 "void Bar();\n" 9970 "};", 9971 Style); 9972 } 9973 9974 TEST_F(FormatTest, NeverMergeShortRecords) { 9975 FormatStyle Style = getLLVMStyle(); 9976 9977 verifyFormat("class Foo {\n" 9978 " Foo();\n" 9979 "};", 9980 Style); 9981 verifyFormat("typedef class Foo {\n" 9982 " Foo();\n" 9983 "} Foo_t;", 9984 Style); 9985 verifyFormat("struct Foo {\n" 9986 " Foo();\n" 9987 "};", 9988 Style); 9989 verifyFormat("typedef struct Foo {\n" 9990 " Foo();\n" 9991 "} Foo_t;", 9992 Style); 9993 verifyFormat("union Foo {\n" 9994 " A,\n" 9995 "};", 9996 Style); 9997 verifyFormat("typedef union Foo {\n" 9998 " A,\n" 9999 "} Foo_t;", 10000 Style); 10001 verifyFormat("namespace Foo {\n" 10002 "void Bar();\n" 10003 "};", 10004 Style); 10005 10006 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 10007 Style.BraceWrapping.AfterClass = true; 10008 Style.BraceWrapping.AfterStruct = true; 10009 Style.BraceWrapping.AfterUnion = true; 10010 Style.BraceWrapping.AfterNamespace = true; 10011 verifyFormat("class Foo\n" 10012 "{\n" 10013 " Foo();\n" 10014 "};", 10015 Style); 10016 verifyFormat("typedef class Foo\n" 10017 "{\n" 10018 " Foo();\n" 10019 "} Foo_t;", 10020 Style); 10021 verifyFormat("struct Foo\n" 10022 "{\n" 10023 " Foo();\n" 10024 "};", 10025 Style); 10026 verifyFormat("typedef struct Foo\n" 10027 "{\n" 10028 " Foo();\n" 10029 "} Foo_t;", 10030 Style); 10031 verifyFormat("union Foo\n" 10032 "{\n" 10033 " A,\n" 10034 "};", 10035 Style); 10036 verifyFormat("typedef union Foo\n" 10037 "{\n" 10038 " A,\n" 10039 "} Foo_t;", 10040 Style); 10041 verifyFormat("namespace Foo\n" 10042 "{\n" 10043 "void Bar();\n" 10044 "};", 10045 Style); 10046 } 10047 10048 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 10049 // Elaborate type variable declarations. 10050 verifyFormat("struct foo a = {bar};\nint n;"); 10051 verifyFormat("class foo a = {bar};\nint n;"); 10052 verifyFormat("union foo a = {bar};\nint n;"); 10053 10054 // Elaborate types inside function definitions. 10055 verifyFormat("struct foo f() {}\nint n;"); 10056 verifyFormat("class foo f() {}\nint n;"); 10057 verifyFormat("union foo f() {}\nint n;"); 10058 10059 // Templates. 10060 verifyFormat("template <class X> void f() {}\nint n;"); 10061 verifyFormat("template <struct X> void f() {}\nint n;"); 10062 verifyFormat("template <union X> void f() {}\nint n;"); 10063 10064 // Actual definitions... 10065 verifyFormat("struct {\n} n;"); 10066 verifyFormat( 10067 "template <template <class T, class Y>, class Z> class X {\n} n;"); 10068 verifyFormat("union Z {\n int n;\n} x;"); 10069 verifyFormat("class MACRO Z {\n} n;"); 10070 verifyFormat("class MACRO(X) Z {\n} n;"); 10071 verifyFormat("class __attribute__(X) Z {\n} n;"); 10072 verifyFormat("class __declspec(X) Z {\n} n;"); 10073 verifyFormat("class A##B##C {\n} n;"); 10074 verifyFormat("class alignas(16) Z {\n} n;"); 10075 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 10076 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 10077 10078 // Redefinition from nested context: 10079 verifyFormat("class A::B::C {\n} n;"); 10080 10081 // Template definitions. 10082 verifyFormat( 10083 "template <typename F>\n" 10084 "Matcher(const Matcher<F> &Other,\n" 10085 " typename enable_if_c<is_base_of<F, T>::value &&\n" 10086 " !is_same<F, T>::value>::type * = 0)\n" 10087 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 10088 10089 // FIXME: This is still incorrectly handled at the formatter side. 10090 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 10091 verifyFormat("int i = SomeFunction(a<b, a> b);"); 10092 10093 // FIXME: 10094 // This now gets parsed incorrectly as class definition. 10095 // verifyFormat("class A<int> f() {\n}\nint n;"); 10096 10097 // Elaborate types where incorrectly parsing the structural element would 10098 // break the indent. 10099 verifyFormat("if (true)\n" 10100 " class X x;\n" 10101 "else\n" 10102 " f();\n"); 10103 10104 // This is simply incomplete. Formatting is not important, but must not crash. 10105 verifyFormat("class A:"); 10106 } 10107 10108 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 10109 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 10110 format("#error Leave all white!!!!! space* alone!\n")); 10111 EXPECT_EQ( 10112 "#warning Leave all white!!!!! space* alone!\n", 10113 format("#warning Leave all white!!!!! space* alone!\n")); 10114 EXPECT_EQ("#error 1", format(" # error 1")); 10115 EXPECT_EQ("#warning 1", format(" # warning 1")); 10116 } 10117 10118 TEST_F(FormatTest, FormatHashIfExpressions) { 10119 verifyFormat("#if AAAA && BBBB"); 10120 verifyFormat("#if (AAAA && BBBB)"); 10121 verifyFormat("#elif (AAAA && BBBB)"); 10122 // FIXME: Come up with a better indentation for #elif. 10123 verifyFormat( 10124 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 10125 " defined(BBBBBBBB)\n" 10126 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 10127 " defined(BBBBBBBB)\n" 10128 "#endif", 10129 getLLVMStyleWithColumns(65)); 10130 } 10131 10132 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 10133 FormatStyle AllowsMergedIf = getGoogleStyle(); 10134 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 10135 FormatStyle::SIS_WithoutElse; 10136 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 10137 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 10138 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 10139 EXPECT_EQ("if (true) return 42;", 10140 format("if (true)\nreturn 42;", AllowsMergedIf)); 10141 FormatStyle ShortMergedIf = AllowsMergedIf; 10142 ShortMergedIf.ColumnLimit = 25; 10143 verifyFormat("#define A \\\n" 10144 " if (true) return 42;", 10145 ShortMergedIf); 10146 verifyFormat("#define A \\\n" 10147 " f(); \\\n" 10148 " if (true)\n" 10149 "#define B", 10150 ShortMergedIf); 10151 verifyFormat("#define A \\\n" 10152 " f(); \\\n" 10153 " if (true)\n" 10154 "g();", 10155 ShortMergedIf); 10156 verifyFormat("{\n" 10157 "#ifdef A\n" 10158 " // Comment\n" 10159 " if (true) continue;\n" 10160 "#endif\n" 10161 " // Comment\n" 10162 " if (true) continue;\n" 10163 "}", 10164 ShortMergedIf); 10165 ShortMergedIf.ColumnLimit = 33; 10166 verifyFormat("#define A \\\n" 10167 " if constexpr (true) return 42;", 10168 ShortMergedIf); 10169 verifyFormat("#define A \\\n" 10170 " if CONSTEXPR (true) return 42;", 10171 ShortMergedIf); 10172 ShortMergedIf.ColumnLimit = 29; 10173 verifyFormat("#define A \\\n" 10174 " if (aaaaaaaaaa) return 1; \\\n" 10175 " return 2;", 10176 ShortMergedIf); 10177 ShortMergedIf.ColumnLimit = 28; 10178 verifyFormat("#define A \\\n" 10179 " if (aaaaaaaaaa) \\\n" 10180 " return 1; \\\n" 10181 " return 2;", 10182 ShortMergedIf); 10183 verifyFormat("#define A \\\n" 10184 " if constexpr (aaaaaaa) \\\n" 10185 " return 1; \\\n" 10186 " return 2;", 10187 ShortMergedIf); 10188 verifyFormat("#define A \\\n" 10189 " if CONSTEXPR (aaaaaaa) \\\n" 10190 " return 1; \\\n" 10191 " return 2;", 10192 ShortMergedIf); 10193 } 10194 10195 TEST_F(FormatTest, FormatStarDependingOnContext) { 10196 verifyFormat("void f(int *a);"); 10197 verifyFormat("void f() { f(fint * b); }"); 10198 verifyFormat("class A {\n void f(int *a);\n};"); 10199 verifyFormat("class A {\n int *a;\n};"); 10200 verifyFormat("namespace a {\n" 10201 "namespace b {\n" 10202 "class A {\n" 10203 " void f() {}\n" 10204 " int *a;\n" 10205 "};\n" 10206 "} // namespace b\n" 10207 "} // namespace a"); 10208 } 10209 10210 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 10211 verifyFormat("while"); 10212 verifyFormat("operator"); 10213 } 10214 10215 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 10216 // This code would be painfully slow to format if we didn't skip it. 10217 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 10218 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10219 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10220 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10221 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10222 "A(1, 1)\n" 10223 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 10224 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10225 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10226 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10227 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10228 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10229 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10230 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10231 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10232 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 10233 // Deeply nested part is untouched, rest is formatted. 10234 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 10235 format(std::string("int i;\n") + Code + "int j;\n", 10236 getLLVMStyle(), SC_ExpectIncomplete)); 10237 } 10238 10239 //===----------------------------------------------------------------------===// 10240 // Objective-C tests. 10241 //===----------------------------------------------------------------------===// 10242 10243 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 10244 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 10245 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 10246 format("-(NSUInteger)indexOfObject:(id)anObject;")); 10247 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 10248 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 10249 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 10250 format("-(NSInteger)Method3:(id)anObject;")); 10251 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 10252 format("-(NSInteger)Method4:(id)anObject;")); 10253 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 10254 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 10255 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 10256 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 10257 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 10258 "forAllCells:(BOOL)flag;", 10259 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 10260 "forAllCells:(BOOL)flag;")); 10261 10262 // Very long objectiveC method declaration. 10263 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 10264 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 10265 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 10266 " inRange:(NSRange)range\n" 10267 " outRange:(NSRange)out_range\n" 10268 " outRange1:(NSRange)out_range1\n" 10269 " outRange2:(NSRange)out_range2\n" 10270 " outRange3:(NSRange)out_range3\n" 10271 " outRange4:(NSRange)out_range4\n" 10272 " outRange5:(NSRange)out_range5\n" 10273 " outRange6:(NSRange)out_range6\n" 10274 " outRange7:(NSRange)out_range7\n" 10275 " outRange8:(NSRange)out_range8\n" 10276 " outRange9:(NSRange)out_range9;"); 10277 10278 // When the function name has to be wrapped. 10279 FormatStyle Style = getLLVMStyle(); 10280 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 10281 // and always indents instead. 10282 Style.IndentWrappedFunctionNames = false; 10283 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 10284 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 10285 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 10286 "}", 10287 Style); 10288 Style.IndentWrappedFunctionNames = true; 10289 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 10290 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 10291 " anotherName:(NSString)dddddddddddddd {\n" 10292 "}", 10293 Style); 10294 10295 verifyFormat("- (int)sum:(vector<int>)numbers;"); 10296 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 10297 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 10298 // protocol lists (but not for template classes): 10299 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 10300 10301 verifyFormat("- (int (*)())foo:(int (*)())f;"); 10302 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 10303 10304 // If there's no return type (very rare in practice!), LLVM and Google style 10305 // agree. 10306 verifyFormat("- foo;"); 10307 verifyFormat("- foo:(int)f;"); 10308 verifyGoogleFormat("- foo:(int)foo;"); 10309 } 10310 10311 TEST_F(FormatTest, BreaksStringLiterals) { 10312 EXPECT_EQ("\"some text \"\n" 10313 "\"other\";", 10314 format("\"some text other\";", getLLVMStyleWithColumns(12))); 10315 EXPECT_EQ("\"some text \"\n" 10316 "\"other\";", 10317 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 10318 EXPECT_EQ( 10319 "#define A \\\n" 10320 " \"some \" \\\n" 10321 " \"text \" \\\n" 10322 " \"other\";", 10323 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 10324 EXPECT_EQ( 10325 "#define A \\\n" 10326 " \"so \" \\\n" 10327 " \"text \" \\\n" 10328 " \"other\";", 10329 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 10330 10331 EXPECT_EQ("\"some text\"", 10332 format("\"some text\"", getLLVMStyleWithColumns(1))); 10333 EXPECT_EQ("\"some text\"", 10334 format("\"some text\"", getLLVMStyleWithColumns(11))); 10335 EXPECT_EQ("\"some \"\n" 10336 "\"text\"", 10337 format("\"some text\"", getLLVMStyleWithColumns(10))); 10338 EXPECT_EQ("\"some \"\n" 10339 "\"text\"", 10340 format("\"some text\"", getLLVMStyleWithColumns(7))); 10341 EXPECT_EQ("\"some\"\n" 10342 "\" tex\"\n" 10343 "\"t\"", 10344 format("\"some text\"", getLLVMStyleWithColumns(6))); 10345 EXPECT_EQ("\"some\"\n" 10346 "\" tex\"\n" 10347 "\" and\"", 10348 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 10349 EXPECT_EQ("\"some\"\n" 10350 "\"/tex\"\n" 10351 "\"/and\"", 10352 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 10353 10354 EXPECT_EQ("variable =\n" 10355 " \"long string \"\n" 10356 " \"literal\";", 10357 format("variable = \"long string literal\";", 10358 getLLVMStyleWithColumns(20))); 10359 10360 EXPECT_EQ("variable = f(\n" 10361 " \"long string \"\n" 10362 " \"literal\",\n" 10363 " short,\n" 10364 " loooooooooooooooooooong);", 10365 format("variable = f(\"long string literal\", short, " 10366 "loooooooooooooooooooong);", 10367 getLLVMStyleWithColumns(20))); 10368 10369 EXPECT_EQ( 10370 "f(g(\"long string \"\n" 10371 " \"literal\"),\n" 10372 " b);", 10373 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 10374 EXPECT_EQ("f(g(\"long string \"\n" 10375 " \"literal\",\n" 10376 " a),\n" 10377 " b);", 10378 format("f(g(\"long string literal\", a), b);", 10379 getLLVMStyleWithColumns(20))); 10380 EXPECT_EQ( 10381 "f(\"one two\".split(\n" 10382 " variable));", 10383 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 10384 EXPECT_EQ("f(\"one two three four five six \"\n" 10385 " \"seven\".split(\n" 10386 " really_looooong_variable));", 10387 format("f(\"one two three four five six seven\"." 10388 "split(really_looooong_variable));", 10389 getLLVMStyleWithColumns(33))); 10390 10391 EXPECT_EQ("f(\"some \"\n" 10392 " \"text\",\n" 10393 " other);", 10394 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 10395 10396 // Only break as a last resort. 10397 verifyFormat( 10398 "aaaaaaaaaaaaaaaaaaaa(\n" 10399 " aaaaaaaaaaaaaaaaaaaa,\n" 10400 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 10401 10402 EXPECT_EQ("\"splitmea\"\n" 10403 "\"trandomp\"\n" 10404 "\"oint\"", 10405 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 10406 10407 EXPECT_EQ("\"split/\"\n" 10408 "\"pathat/\"\n" 10409 "\"slashes\"", 10410 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 10411 10412 EXPECT_EQ("\"split/\"\n" 10413 "\"pathat/\"\n" 10414 "\"slashes\"", 10415 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 10416 EXPECT_EQ("\"split at \"\n" 10417 "\"spaces/at/\"\n" 10418 "\"slashes.at.any$\"\n" 10419 "\"non-alphanumeric%\"\n" 10420 "\"1111111111characte\"\n" 10421 "\"rs\"", 10422 format("\"split at " 10423 "spaces/at/" 10424 "slashes.at." 10425 "any$non-" 10426 "alphanumeric%" 10427 "1111111111characte" 10428 "rs\"", 10429 getLLVMStyleWithColumns(20))); 10430 10431 // Verify that splitting the strings understands 10432 // Style::AlwaysBreakBeforeMultilineStrings. 10433 EXPECT_EQ("aaaaaaaaaaaa(\n" 10434 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 10435 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 10436 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 10437 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 10438 "aaaaaaaaaaaaaaaaaaaaaa\");", 10439 getGoogleStyle())); 10440 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10441 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 10442 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 10443 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 10444 "aaaaaaaaaaaaaaaaaaaaaa\";", 10445 getGoogleStyle())); 10446 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10447 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10448 format("llvm::outs() << " 10449 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 10450 "aaaaaaaaaaaaaaaaaaa\";")); 10451 EXPECT_EQ("ffff(\n" 10452 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10453 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10454 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 10455 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10456 getGoogleStyle())); 10457 10458 FormatStyle Style = getLLVMStyleWithColumns(12); 10459 Style.BreakStringLiterals = false; 10460 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 10461 10462 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 10463 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10464 EXPECT_EQ("#define A \\\n" 10465 " \"some \" \\\n" 10466 " \"text \" \\\n" 10467 " \"other\";", 10468 format("#define A \"some text other\";", AlignLeft)); 10469 } 10470 10471 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 10472 EXPECT_EQ("C a = \"some more \"\n" 10473 " \"text\";", 10474 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 10475 } 10476 10477 TEST_F(FormatTest, FullyRemoveEmptyLines) { 10478 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 10479 NoEmptyLines.MaxEmptyLinesToKeep = 0; 10480 EXPECT_EQ("int i = a(b());", 10481 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 10482 } 10483 10484 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 10485 EXPECT_EQ( 10486 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10487 "(\n" 10488 " \"x\t\");", 10489 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10490 "aaaaaaa(" 10491 "\"x\t\");")); 10492 } 10493 10494 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 10495 EXPECT_EQ( 10496 "u8\"utf8 string \"\n" 10497 "u8\"literal\";", 10498 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 10499 EXPECT_EQ( 10500 "u\"utf16 string \"\n" 10501 "u\"literal\";", 10502 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 10503 EXPECT_EQ( 10504 "U\"utf32 string \"\n" 10505 "U\"literal\";", 10506 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 10507 EXPECT_EQ("L\"wide string \"\n" 10508 "L\"literal\";", 10509 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 10510 EXPECT_EQ("@\"NSString \"\n" 10511 "@\"literal\";", 10512 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 10513 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 10514 10515 // This input makes clang-format try to split the incomplete unicode escape 10516 // sequence, which used to lead to a crasher. 10517 verifyNoCrash( 10518 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 10519 getLLVMStyleWithColumns(60)); 10520 } 10521 10522 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 10523 FormatStyle Style = getGoogleStyleWithColumns(15); 10524 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 10525 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 10526 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 10527 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 10528 EXPECT_EQ("u8R\"x(raw literal)x\";", 10529 format("u8R\"x(raw literal)x\";", Style)); 10530 } 10531 10532 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 10533 FormatStyle Style = getLLVMStyleWithColumns(20); 10534 EXPECT_EQ( 10535 "_T(\"aaaaaaaaaaaaaa\")\n" 10536 "_T(\"aaaaaaaaaaaaaa\")\n" 10537 "_T(\"aaaaaaaaaaaa\")", 10538 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 10539 EXPECT_EQ("f(x,\n" 10540 " _T(\"aaaaaaaaaaaa\")\n" 10541 " _T(\"aaa\"),\n" 10542 " z);", 10543 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 10544 10545 // FIXME: Handle embedded spaces in one iteration. 10546 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 10547 // "_T(\"aaaaaaaaaaaaa\")\n" 10548 // "_T(\"aaaaaaaaaaaaa\")\n" 10549 // "_T(\"a\")", 10550 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10551 // getLLVMStyleWithColumns(20))); 10552 EXPECT_EQ( 10553 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10554 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 10555 EXPECT_EQ("f(\n" 10556 "#if !TEST\n" 10557 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10558 "#endif\n" 10559 ");", 10560 format("f(\n" 10561 "#if !TEST\n" 10562 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10563 "#endif\n" 10564 ");")); 10565 EXPECT_EQ("f(\n" 10566 "\n" 10567 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 10568 format("f(\n" 10569 "\n" 10570 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 10571 } 10572 10573 TEST_F(FormatTest, BreaksStringLiteralOperands) { 10574 // In a function call with two operands, the second can be broken with no line 10575 // break before it. 10576 EXPECT_EQ( 10577 "func(a, \"long long \"\n" 10578 " \"long long\");", 10579 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 10580 // In a function call with three operands, the second must be broken with a 10581 // line break before it. 10582 EXPECT_EQ("func(a,\n" 10583 " \"long long long \"\n" 10584 " \"long\",\n" 10585 " c);", 10586 format("func(a, \"long long long long\", c);", 10587 getLLVMStyleWithColumns(24))); 10588 // In a function call with three operands, the third must be broken with a 10589 // line break before it. 10590 EXPECT_EQ("func(a, b,\n" 10591 " \"long long long \"\n" 10592 " \"long\");", 10593 format("func(a, b, \"long long long long\");", 10594 getLLVMStyleWithColumns(24))); 10595 // In a function call with three operands, both the second and the third must 10596 // be broken with a line break before them. 10597 EXPECT_EQ("func(a,\n" 10598 " \"long long long \"\n" 10599 " \"long\",\n" 10600 " \"long long long \"\n" 10601 " \"long\");", 10602 format("func(a, \"long long long long\", \"long long long long\");", 10603 getLLVMStyleWithColumns(24))); 10604 // In a chain of << with two operands, the second can be broken with no line 10605 // break before it. 10606 EXPECT_EQ("a << \"line line \"\n" 10607 " \"line\";", 10608 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 10609 // In a chain of << with three operands, the second can be broken with no line 10610 // break before it. 10611 EXPECT_EQ( 10612 "abcde << \"line \"\n" 10613 " \"line line\"\n" 10614 " << c;", 10615 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 10616 // In a chain of << with three operands, the third must be broken with a line 10617 // break before it. 10618 EXPECT_EQ( 10619 "a << b\n" 10620 " << \"line line \"\n" 10621 " \"line\";", 10622 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 10623 // In a chain of << with three operands, the second can be broken with no line 10624 // break before it and the third must be broken with a line break before it. 10625 EXPECT_EQ("abcd << \"line line \"\n" 10626 " \"line\"\n" 10627 " << \"line line \"\n" 10628 " \"line\";", 10629 format("abcd << \"line line line\" << \"line line line\";", 10630 getLLVMStyleWithColumns(20))); 10631 // In a chain of binary operators with two operands, the second can be broken 10632 // with no line break before it. 10633 EXPECT_EQ( 10634 "abcd + \"line line \"\n" 10635 " \"line line\";", 10636 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 10637 // In a chain of binary operators with three operands, the second must be 10638 // broken with a line break before it. 10639 EXPECT_EQ("abcd +\n" 10640 " \"line line \"\n" 10641 " \"line line\" +\n" 10642 " e;", 10643 format("abcd + \"line line line line\" + e;", 10644 getLLVMStyleWithColumns(20))); 10645 // In a function call with two operands, with AlignAfterOpenBracket enabled, 10646 // the first must be broken with a line break before it. 10647 FormatStyle Style = getLLVMStyleWithColumns(25); 10648 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 10649 EXPECT_EQ("someFunction(\n" 10650 " \"long long long \"\n" 10651 " \"long\",\n" 10652 " a);", 10653 format("someFunction(\"long long long long\", a);", Style)); 10654 } 10655 10656 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 10657 EXPECT_EQ( 10658 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10659 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10661 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10663 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 10664 } 10665 10666 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 10667 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 10668 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 10669 EXPECT_EQ("fffffffffff(g(R\"x(\n" 10670 "multiline raw string literal xxxxxxxxxxxxxx\n" 10671 ")x\",\n" 10672 " a),\n" 10673 " b);", 10674 format("fffffffffff(g(R\"x(\n" 10675 "multiline raw string literal xxxxxxxxxxxxxx\n" 10676 ")x\", a), b);", 10677 getGoogleStyleWithColumns(20))); 10678 EXPECT_EQ("fffffffffff(\n" 10679 " g(R\"x(qqq\n" 10680 "multiline raw string literal xxxxxxxxxxxxxx\n" 10681 ")x\",\n" 10682 " a),\n" 10683 " b);", 10684 format("fffffffffff(g(R\"x(qqq\n" 10685 "multiline raw string literal xxxxxxxxxxxxxx\n" 10686 ")x\", a), b);", 10687 getGoogleStyleWithColumns(20))); 10688 10689 EXPECT_EQ("fffffffffff(R\"x(\n" 10690 "multiline raw string literal xxxxxxxxxxxxxx\n" 10691 ")x\");", 10692 format("fffffffffff(R\"x(\n" 10693 "multiline raw string literal xxxxxxxxxxxxxx\n" 10694 ")x\");", 10695 getGoogleStyleWithColumns(20))); 10696 EXPECT_EQ("fffffffffff(R\"x(\n" 10697 "multiline raw string literal xxxxxxxxxxxxxx\n" 10698 ")x\" + bbbbbb);", 10699 format("fffffffffff(R\"x(\n" 10700 "multiline raw string literal xxxxxxxxxxxxxx\n" 10701 ")x\" + bbbbbb);", 10702 getGoogleStyleWithColumns(20))); 10703 EXPECT_EQ("fffffffffff(\n" 10704 " R\"x(\n" 10705 "multiline raw string literal xxxxxxxxxxxxxx\n" 10706 ")x\" +\n" 10707 " bbbbbb);", 10708 format("fffffffffff(\n" 10709 " R\"x(\n" 10710 "multiline raw string literal xxxxxxxxxxxxxx\n" 10711 ")x\" + bbbbbb);", 10712 getGoogleStyleWithColumns(20))); 10713 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 10714 format("fffffffffff(\n" 10715 " R\"(single line raw string)\" + bbbbbb);")); 10716 } 10717 10718 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 10719 verifyFormat("string a = \"unterminated;"); 10720 EXPECT_EQ("function(\"unterminated,\n" 10721 " OtherParameter);", 10722 format("function( \"unterminated,\n" 10723 " OtherParameter);")); 10724 } 10725 10726 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 10727 FormatStyle Style = getLLVMStyle(); 10728 Style.Standard = FormatStyle::LS_Cpp03; 10729 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 10730 format("#define x(_a) printf(\"foo\"_a);", Style)); 10731 } 10732 10733 TEST_F(FormatTest, CppLexVersion) { 10734 FormatStyle Style = getLLVMStyle(); 10735 // Formatting of x * y differs if x is a type. 10736 verifyFormat("void foo() { MACRO(a * b); }", Style); 10737 verifyFormat("void foo() { MACRO(int *b); }", Style); 10738 10739 // LLVM style uses latest lexer. 10740 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 10741 Style.Standard = FormatStyle::LS_Cpp17; 10742 // But in c++17, char8_t isn't a keyword. 10743 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 10744 } 10745 10746 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 10747 10748 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 10749 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 10750 " \"ddeeefff\");", 10751 format("someFunction(\"aaabbbcccdddeeefff\");", 10752 getLLVMStyleWithColumns(25))); 10753 EXPECT_EQ("someFunction1234567890(\n" 10754 " \"aaabbbcccdddeeefff\");", 10755 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10756 getLLVMStyleWithColumns(26))); 10757 EXPECT_EQ("someFunction1234567890(\n" 10758 " \"aaabbbcccdddeeeff\"\n" 10759 " \"f\");", 10760 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10761 getLLVMStyleWithColumns(25))); 10762 EXPECT_EQ("someFunction1234567890(\n" 10763 " \"aaabbbcccdddeeeff\"\n" 10764 " \"f\");", 10765 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10766 getLLVMStyleWithColumns(24))); 10767 EXPECT_EQ("someFunction(\n" 10768 " \"aaabbbcc ddde \"\n" 10769 " \"efff\");", 10770 format("someFunction(\"aaabbbcc ddde efff\");", 10771 getLLVMStyleWithColumns(25))); 10772 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 10773 " \"ddeeefff\");", 10774 format("someFunction(\"aaabbbccc ddeeefff\");", 10775 getLLVMStyleWithColumns(25))); 10776 EXPECT_EQ("someFunction1234567890(\n" 10777 " \"aaabb \"\n" 10778 " \"cccdddeeefff\");", 10779 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 10780 getLLVMStyleWithColumns(25))); 10781 EXPECT_EQ("#define A \\\n" 10782 " string s = \\\n" 10783 " \"123456789\" \\\n" 10784 " \"0\"; \\\n" 10785 " int i;", 10786 format("#define A string s = \"1234567890\"; int i;", 10787 getLLVMStyleWithColumns(20))); 10788 EXPECT_EQ("someFunction(\n" 10789 " \"aaabbbcc \"\n" 10790 " \"dddeeefff\");", 10791 format("someFunction(\"aaabbbcc dddeeefff\");", 10792 getLLVMStyleWithColumns(25))); 10793 } 10794 10795 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 10796 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 10797 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 10798 EXPECT_EQ("\"test\"\n" 10799 "\"\\n\"", 10800 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 10801 EXPECT_EQ("\"tes\\\\\"\n" 10802 "\"n\"", 10803 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 10804 EXPECT_EQ("\"\\\\\\\\\"\n" 10805 "\"\\n\"", 10806 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 10807 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 10808 EXPECT_EQ("\"\\uff01\"\n" 10809 "\"test\"", 10810 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 10811 EXPECT_EQ("\"\\Uff01ff02\"", 10812 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 10813 EXPECT_EQ("\"\\x000000000001\"\n" 10814 "\"next\"", 10815 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 10816 EXPECT_EQ("\"\\x000000000001next\"", 10817 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 10818 EXPECT_EQ("\"\\x000000000001\"", 10819 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 10820 EXPECT_EQ("\"test\"\n" 10821 "\"\\000000\"\n" 10822 "\"000001\"", 10823 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 10824 EXPECT_EQ("\"test\\000\"\n" 10825 "\"00000000\"\n" 10826 "\"1\"", 10827 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 10828 } 10829 10830 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 10831 verifyFormat("void f() {\n" 10832 " return g() {}\n" 10833 " void h() {}"); 10834 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 10835 "g();\n" 10836 "}"); 10837 } 10838 10839 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 10840 verifyFormat( 10841 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 10842 } 10843 10844 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 10845 verifyFormat("class X {\n" 10846 " void f() {\n" 10847 " }\n" 10848 "};", 10849 getLLVMStyleWithColumns(12)); 10850 } 10851 10852 TEST_F(FormatTest, ConfigurableIndentWidth) { 10853 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 10854 EightIndent.IndentWidth = 8; 10855 EightIndent.ContinuationIndentWidth = 8; 10856 verifyFormat("void f() {\n" 10857 " someFunction();\n" 10858 " if (true) {\n" 10859 " f();\n" 10860 " }\n" 10861 "}", 10862 EightIndent); 10863 verifyFormat("class X {\n" 10864 " void f() {\n" 10865 " }\n" 10866 "};", 10867 EightIndent); 10868 verifyFormat("int x[] = {\n" 10869 " call(),\n" 10870 " call()};", 10871 EightIndent); 10872 } 10873 10874 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 10875 verifyFormat("double\n" 10876 "f();", 10877 getLLVMStyleWithColumns(8)); 10878 } 10879 10880 TEST_F(FormatTest, ConfigurableUseOfTab) { 10881 FormatStyle Tab = getLLVMStyleWithColumns(42); 10882 Tab.IndentWidth = 8; 10883 Tab.UseTab = FormatStyle::UT_Always; 10884 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10885 10886 EXPECT_EQ("if (aaaaaaaa && // q\n" 10887 " bb)\t\t// w\n" 10888 "\t;", 10889 format("if (aaaaaaaa &&// q\n" 10890 "bb)// w\n" 10891 ";", 10892 Tab)); 10893 EXPECT_EQ("if (aaa && bbb) // w\n" 10894 "\t;", 10895 format("if(aaa&&bbb)// w\n" 10896 ";", 10897 Tab)); 10898 10899 verifyFormat("class X {\n" 10900 "\tvoid f() {\n" 10901 "\t\tsomeFunction(parameter1,\n" 10902 "\t\t\t parameter2);\n" 10903 "\t}\n" 10904 "};", 10905 Tab); 10906 verifyFormat("#define A \\\n" 10907 "\tvoid f() { \\\n" 10908 "\t\tsomeFunction( \\\n" 10909 "\t\t parameter1, \\\n" 10910 "\t\t parameter2); \\\n" 10911 "\t}", 10912 Tab); 10913 verifyFormat("int a;\t // x\n" 10914 "int bbbbbbbb; // x\n", 10915 Tab); 10916 10917 Tab.TabWidth = 4; 10918 Tab.IndentWidth = 8; 10919 verifyFormat("class TabWidth4Indent8 {\n" 10920 "\t\tvoid f() {\n" 10921 "\t\t\t\tsomeFunction(parameter1,\n" 10922 "\t\t\t\t\t\t\t parameter2);\n" 10923 "\t\t}\n" 10924 "};", 10925 Tab); 10926 10927 Tab.TabWidth = 4; 10928 Tab.IndentWidth = 4; 10929 verifyFormat("class TabWidth4Indent4 {\n" 10930 "\tvoid f() {\n" 10931 "\t\tsomeFunction(parameter1,\n" 10932 "\t\t\t\t\t parameter2);\n" 10933 "\t}\n" 10934 "};", 10935 Tab); 10936 10937 Tab.TabWidth = 8; 10938 Tab.IndentWidth = 4; 10939 verifyFormat("class TabWidth8Indent4 {\n" 10940 " void f() {\n" 10941 "\tsomeFunction(parameter1,\n" 10942 "\t\t parameter2);\n" 10943 " }\n" 10944 "};", 10945 Tab); 10946 10947 Tab.TabWidth = 8; 10948 Tab.IndentWidth = 8; 10949 EXPECT_EQ("/*\n" 10950 "\t a\t\tcomment\n" 10951 "\t in multiple lines\n" 10952 " */", 10953 format(" /*\t \t \n" 10954 " \t \t a\t\tcomment\t \t\n" 10955 " \t \t in multiple lines\t\n" 10956 " \t */", 10957 Tab)); 10958 10959 Tab.UseTab = FormatStyle::UT_ForIndentation; 10960 verifyFormat("{\n" 10961 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10962 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10963 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10964 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10965 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10966 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10967 "};", 10968 Tab); 10969 verifyFormat("enum AA {\n" 10970 "\ta1, // Force multiple lines\n" 10971 "\ta2,\n" 10972 "\ta3\n" 10973 "};", 10974 Tab); 10975 EXPECT_EQ("if (aaaaaaaa && // q\n" 10976 " bb) // w\n" 10977 "\t;", 10978 format("if (aaaaaaaa &&// q\n" 10979 "bb)// w\n" 10980 ";", 10981 Tab)); 10982 verifyFormat("class X {\n" 10983 "\tvoid f() {\n" 10984 "\t\tsomeFunction(parameter1,\n" 10985 "\t\t parameter2);\n" 10986 "\t}\n" 10987 "};", 10988 Tab); 10989 verifyFormat("{\n" 10990 "\tQ(\n" 10991 "\t {\n" 10992 "\t\t int a;\n" 10993 "\t\t someFunction(aaaaaaaa,\n" 10994 "\t\t bbbbbbb);\n" 10995 "\t },\n" 10996 "\t p);\n" 10997 "}", 10998 Tab); 10999 EXPECT_EQ("{\n" 11000 "\t/* aaaa\n" 11001 "\t bbbb */\n" 11002 "}", 11003 format("{\n" 11004 "/* aaaa\n" 11005 " bbbb */\n" 11006 "}", 11007 Tab)); 11008 EXPECT_EQ("{\n" 11009 "\t/*\n" 11010 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11011 "\t bbbbbbbbbbbbb\n" 11012 "\t*/\n" 11013 "}", 11014 format("{\n" 11015 "/*\n" 11016 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11017 "*/\n" 11018 "}", 11019 Tab)); 11020 EXPECT_EQ("{\n" 11021 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11022 "\t// bbbbbbbbbbbbb\n" 11023 "}", 11024 format("{\n" 11025 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11026 "}", 11027 Tab)); 11028 EXPECT_EQ("{\n" 11029 "\t/*\n" 11030 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11031 "\t bbbbbbbbbbbbb\n" 11032 "\t*/\n" 11033 "}", 11034 format("{\n" 11035 "\t/*\n" 11036 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11037 "\t*/\n" 11038 "}", 11039 Tab)); 11040 EXPECT_EQ("{\n" 11041 "\t/*\n" 11042 "\n" 11043 "\t*/\n" 11044 "}", 11045 format("{\n" 11046 "\t/*\n" 11047 "\n" 11048 "\t*/\n" 11049 "}", 11050 Tab)); 11051 EXPECT_EQ("{\n" 11052 "\t/*\n" 11053 " asdf\n" 11054 "\t*/\n" 11055 "}", 11056 format("{\n" 11057 "\t/*\n" 11058 " asdf\n" 11059 "\t*/\n" 11060 "}", 11061 Tab)); 11062 11063 Tab.UseTab = FormatStyle::UT_Never; 11064 EXPECT_EQ("/*\n" 11065 " a\t\tcomment\n" 11066 " in multiple lines\n" 11067 " */", 11068 format(" /*\t \t \n" 11069 " \t \t a\t\tcomment\t \t\n" 11070 " \t \t in multiple lines\t\n" 11071 " \t */", 11072 Tab)); 11073 EXPECT_EQ("/* some\n" 11074 " comment */", 11075 format(" \t \t /* some\n" 11076 " \t \t comment */", 11077 Tab)); 11078 EXPECT_EQ("int a; /* some\n" 11079 " comment */", 11080 format(" \t \t int a; /* some\n" 11081 " \t \t comment */", 11082 Tab)); 11083 11084 EXPECT_EQ("int a; /* some\n" 11085 "comment */", 11086 format(" \t \t int\ta; /* some\n" 11087 " \t \t comment */", 11088 Tab)); 11089 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11090 " comment */", 11091 format(" \t \t f(\"\t\t\"); /* some\n" 11092 " \t \t comment */", 11093 Tab)); 11094 EXPECT_EQ("{\n" 11095 " /*\n" 11096 " * Comment\n" 11097 " */\n" 11098 " int i;\n" 11099 "}", 11100 format("{\n" 11101 "\t/*\n" 11102 "\t * Comment\n" 11103 "\t */\n" 11104 "\t int i;\n" 11105 "}", 11106 Tab)); 11107 11108 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 11109 Tab.TabWidth = 8; 11110 Tab.IndentWidth = 8; 11111 EXPECT_EQ("if (aaaaaaaa && // q\n" 11112 " bb) // w\n" 11113 "\t;", 11114 format("if (aaaaaaaa &&// q\n" 11115 "bb)// w\n" 11116 ";", 11117 Tab)); 11118 EXPECT_EQ("if (aaa && bbb) // w\n" 11119 "\t;", 11120 format("if(aaa&&bbb)// w\n" 11121 ";", 11122 Tab)); 11123 verifyFormat("class X {\n" 11124 "\tvoid f() {\n" 11125 "\t\tsomeFunction(parameter1,\n" 11126 "\t\t\t parameter2);\n" 11127 "\t}\n" 11128 "};", 11129 Tab); 11130 verifyFormat("#define A \\\n" 11131 "\tvoid f() { \\\n" 11132 "\t\tsomeFunction( \\\n" 11133 "\t\t parameter1, \\\n" 11134 "\t\t parameter2); \\\n" 11135 "\t}", 11136 Tab); 11137 Tab.TabWidth = 4; 11138 Tab.IndentWidth = 8; 11139 verifyFormat("class TabWidth4Indent8 {\n" 11140 "\t\tvoid f() {\n" 11141 "\t\t\t\tsomeFunction(parameter1,\n" 11142 "\t\t\t\t\t\t\t parameter2);\n" 11143 "\t\t}\n" 11144 "};", 11145 Tab); 11146 Tab.TabWidth = 4; 11147 Tab.IndentWidth = 4; 11148 verifyFormat("class TabWidth4Indent4 {\n" 11149 "\tvoid f() {\n" 11150 "\t\tsomeFunction(parameter1,\n" 11151 "\t\t\t\t\t parameter2);\n" 11152 "\t}\n" 11153 "};", 11154 Tab); 11155 Tab.TabWidth = 8; 11156 Tab.IndentWidth = 4; 11157 verifyFormat("class TabWidth8Indent4 {\n" 11158 " void f() {\n" 11159 "\tsomeFunction(parameter1,\n" 11160 "\t\t parameter2);\n" 11161 " }\n" 11162 "};", 11163 Tab); 11164 Tab.TabWidth = 8; 11165 Tab.IndentWidth = 8; 11166 EXPECT_EQ("/*\n" 11167 "\t a\t\tcomment\n" 11168 "\t in multiple lines\n" 11169 " */", 11170 format(" /*\t \t \n" 11171 " \t \t a\t\tcomment\t \t\n" 11172 " \t \t in multiple lines\t\n" 11173 " \t */", 11174 Tab)); 11175 verifyFormat("{\n" 11176 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11177 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11178 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11179 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11180 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11181 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11182 "};", 11183 Tab); 11184 verifyFormat("enum AA {\n" 11185 "\ta1, // Force multiple lines\n" 11186 "\ta2,\n" 11187 "\ta3\n" 11188 "};", 11189 Tab); 11190 EXPECT_EQ("if (aaaaaaaa && // q\n" 11191 " bb) // w\n" 11192 "\t;", 11193 format("if (aaaaaaaa &&// q\n" 11194 "bb)// w\n" 11195 ";", 11196 Tab)); 11197 verifyFormat("class X {\n" 11198 "\tvoid f() {\n" 11199 "\t\tsomeFunction(parameter1,\n" 11200 "\t\t\t parameter2);\n" 11201 "\t}\n" 11202 "};", 11203 Tab); 11204 verifyFormat("{\n" 11205 "\tQ(\n" 11206 "\t {\n" 11207 "\t\t int a;\n" 11208 "\t\t someFunction(aaaaaaaa,\n" 11209 "\t\t\t\t bbbbbbb);\n" 11210 "\t },\n" 11211 "\t p);\n" 11212 "}", 11213 Tab); 11214 EXPECT_EQ("{\n" 11215 "\t/* aaaa\n" 11216 "\t bbbb */\n" 11217 "}", 11218 format("{\n" 11219 "/* aaaa\n" 11220 " bbbb */\n" 11221 "}", 11222 Tab)); 11223 EXPECT_EQ("{\n" 11224 "\t/*\n" 11225 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11226 "\t bbbbbbbbbbbbb\n" 11227 "\t*/\n" 11228 "}", 11229 format("{\n" 11230 "/*\n" 11231 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11232 "*/\n" 11233 "}", 11234 Tab)); 11235 EXPECT_EQ("{\n" 11236 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11237 "\t// bbbbbbbbbbbbb\n" 11238 "}", 11239 format("{\n" 11240 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11241 "}", 11242 Tab)); 11243 EXPECT_EQ("{\n" 11244 "\t/*\n" 11245 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11246 "\t bbbbbbbbbbbbb\n" 11247 "\t*/\n" 11248 "}", 11249 format("{\n" 11250 "\t/*\n" 11251 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11252 "\t*/\n" 11253 "}", 11254 Tab)); 11255 EXPECT_EQ("{\n" 11256 "\t/*\n" 11257 "\n" 11258 "\t*/\n" 11259 "}", 11260 format("{\n" 11261 "\t/*\n" 11262 "\n" 11263 "\t*/\n" 11264 "}", 11265 Tab)); 11266 EXPECT_EQ("{\n" 11267 "\t/*\n" 11268 " asdf\n" 11269 "\t*/\n" 11270 "}", 11271 format("{\n" 11272 "\t/*\n" 11273 " asdf\n" 11274 "\t*/\n" 11275 "}", 11276 Tab)); 11277 EXPECT_EQ("/* some\n" 11278 " comment */", 11279 format(" \t \t /* some\n" 11280 " \t \t comment */", 11281 Tab)); 11282 EXPECT_EQ("int a; /* some\n" 11283 " comment */", 11284 format(" \t \t int a; /* some\n" 11285 " \t \t comment */", 11286 Tab)); 11287 EXPECT_EQ("int a; /* some\n" 11288 "comment */", 11289 format(" \t \t int\ta; /* some\n" 11290 " \t \t comment */", 11291 Tab)); 11292 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11293 " comment */", 11294 format(" \t \t f(\"\t\t\"); /* some\n" 11295 " \t \t comment */", 11296 Tab)); 11297 EXPECT_EQ("{\n" 11298 "\t/*\n" 11299 "\t * Comment\n" 11300 "\t */\n" 11301 "\tint i;\n" 11302 "}", 11303 format("{\n" 11304 "\t/*\n" 11305 "\t * Comment\n" 11306 "\t */\n" 11307 "\t int i;\n" 11308 "}", 11309 Tab)); 11310 Tab.TabWidth = 2; 11311 Tab.IndentWidth = 2; 11312 EXPECT_EQ("{\n" 11313 "\t/* aaaa\n" 11314 "\t\t bbbb */\n" 11315 "}", 11316 format("{\n" 11317 "/* aaaa\n" 11318 "\t bbbb */\n" 11319 "}", 11320 Tab)); 11321 EXPECT_EQ("{\n" 11322 "\t/*\n" 11323 "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11324 "\t\tbbbbbbbbbbbbb\n" 11325 "\t*/\n" 11326 "}", 11327 format("{\n" 11328 "/*\n" 11329 "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11330 "*/\n" 11331 "}", 11332 Tab)); 11333 Tab.AlignConsecutiveAssignments = true; 11334 Tab.AlignConsecutiveDeclarations = true; 11335 Tab.TabWidth = 4; 11336 Tab.IndentWidth = 4; 11337 verifyFormat("class Assign {\n" 11338 "\tvoid f() {\n" 11339 "\t\tint x = 123;\n" 11340 "\t\tint random = 4;\n" 11341 "\t\tstd::string alphabet =\n" 11342 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11343 "\t}\n" 11344 "};", 11345 Tab); 11346 11347 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11348 Tab.TabWidth = 8; 11349 Tab.IndentWidth = 8; 11350 EXPECT_EQ("if (aaaaaaaa && // q\n" 11351 " bb) // w\n" 11352 "\t;", 11353 format("if (aaaaaaaa &&// q\n" 11354 "bb)// w\n" 11355 ";", 11356 Tab)); 11357 EXPECT_EQ("if (aaa && bbb) // w\n" 11358 "\t;", 11359 format("if(aaa&&bbb)// w\n" 11360 ";", 11361 Tab)); 11362 verifyFormat("class X {\n" 11363 "\tvoid f() {\n" 11364 "\t\tsomeFunction(parameter1,\n" 11365 "\t\t parameter2);\n" 11366 "\t}\n" 11367 "};", 11368 Tab); 11369 verifyFormat("#define A \\\n" 11370 "\tvoid f() { \\\n" 11371 "\t\tsomeFunction( \\\n" 11372 "\t\t parameter1, \\\n" 11373 "\t\t parameter2); \\\n" 11374 "\t}", 11375 Tab); 11376 Tab.TabWidth = 4; 11377 Tab.IndentWidth = 8; 11378 verifyFormat("class TabWidth4Indent8 {\n" 11379 "\t\tvoid f() {\n" 11380 "\t\t\t\tsomeFunction(parameter1,\n" 11381 "\t\t\t\t parameter2);\n" 11382 "\t\t}\n" 11383 "};", 11384 Tab); 11385 Tab.TabWidth = 4; 11386 Tab.IndentWidth = 4; 11387 verifyFormat("class TabWidth4Indent4 {\n" 11388 "\tvoid f() {\n" 11389 "\t\tsomeFunction(parameter1,\n" 11390 "\t\t parameter2);\n" 11391 "\t}\n" 11392 "};", 11393 Tab); 11394 Tab.TabWidth = 8; 11395 Tab.IndentWidth = 4; 11396 verifyFormat("class TabWidth8Indent4 {\n" 11397 " void f() {\n" 11398 "\tsomeFunction(parameter1,\n" 11399 "\t parameter2);\n" 11400 " }\n" 11401 "};", 11402 Tab); 11403 Tab.TabWidth = 8; 11404 Tab.IndentWidth = 8; 11405 EXPECT_EQ("/*\n" 11406 " a\t\tcomment\n" 11407 " in multiple lines\n" 11408 " */", 11409 format(" /*\t \t \n" 11410 " \t \t a\t\tcomment\t \t\n" 11411 " \t \t in multiple lines\t\n" 11412 " \t */", 11413 Tab)); 11414 verifyFormat("{\n" 11415 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11416 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11417 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11418 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11419 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11420 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11421 "};", 11422 Tab); 11423 verifyFormat("enum AA {\n" 11424 "\ta1, // Force multiple lines\n" 11425 "\ta2,\n" 11426 "\ta3\n" 11427 "};", 11428 Tab); 11429 EXPECT_EQ("if (aaaaaaaa && // q\n" 11430 " bb) // w\n" 11431 "\t;", 11432 format("if (aaaaaaaa &&// q\n" 11433 "bb)// w\n" 11434 ";", 11435 Tab)); 11436 verifyFormat("class X {\n" 11437 "\tvoid f() {\n" 11438 "\t\tsomeFunction(parameter1,\n" 11439 "\t\t parameter2);\n" 11440 "\t}\n" 11441 "};", 11442 Tab); 11443 verifyFormat("{\n" 11444 "\tQ(\n" 11445 "\t {\n" 11446 "\t\t int a;\n" 11447 "\t\t someFunction(aaaaaaaa,\n" 11448 "\t\t bbbbbbb);\n" 11449 "\t },\n" 11450 "\t p);\n" 11451 "}", 11452 Tab); 11453 EXPECT_EQ("{\n" 11454 "\t/* aaaa\n" 11455 "\t bbbb */\n" 11456 "}", 11457 format("{\n" 11458 "/* aaaa\n" 11459 " bbbb */\n" 11460 "}", 11461 Tab)); 11462 EXPECT_EQ("{\n" 11463 "\t/*\n" 11464 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11465 "\t bbbbbbbbbbbbb\n" 11466 "\t*/\n" 11467 "}", 11468 format("{\n" 11469 "/*\n" 11470 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11471 "*/\n" 11472 "}", 11473 Tab)); 11474 EXPECT_EQ("{\n" 11475 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11476 "\t// bbbbbbbbbbbbb\n" 11477 "}", 11478 format("{\n" 11479 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11480 "}", 11481 Tab)); 11482 EXPECT_EQ("{\n" 11483 "\t/*\n" 11484 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11485 "\t bbbbbbbbbbbbb\n" 11486 "\t*/\n" 11487 "}", 11488 format("{\n" 11489 "\t/*\n" 11490 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11491 "\t*/\n" 11492 "}", 11493 Tab)); 11494 EXPECT_EQ("{\n" 11495 "\t/*\n" 11496 "\n" 11497 "\t*/\n" 11498 "}", 11499 format("{\n" 11500 "\t/*\n" 11501 "\n" 11502 "\t*/\n" 11503 "}", 11504 Tab)); 11505 EXPECT_EQ("{\n" 11506 "\t/*\n" 11507 " asdf\n" 11508 "\t*/\n" 11509 "}", 11510 format("{\n" 11511 "\t/*\n" 11512 " asdf\n" 11513 "\t*/\n" 11514 "}", 11515 Tab)); 11516 EXPECT_EQ("/* some\n" 11517 " comment */", 11518 format(" \t \t /* some\n" 11519 " \t \t comment */", 11520 Tab)); 11521 EXPECT_EQ("int a; /* some\n" 11522 " comment */", 11523 format(" \t \t int a; /* some\n" 11524 " \t \t comment */", 11525 Tab)); 11526 EXPECT_EQ("int a; /* some\n" 11527 "comment */", 11528 format(" \t \t int\ta; /* some\n" 11529 " \t \t comment */", 11530 Tab)); 11531 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11532 " comment */", 11533 format(" \t \t f(\"\t\t\"); /* some\n" 11534 " \t \t comment */", 11535 Tab)); 11536 EXPECT_EQ("{\n" 11537 "\t/*\n" 11538 "\t * Comment\n" 11539 "\t */\n" 11540 "\tint i;\n" 11541 "}", 11542 format("{\n" 11543 "\t/*\n" 11544 "\t * Comment\n" 11545 "\t */\n" 11546 "\t int i;\n" 11547 "}", 11548 Tab)); 11549 Tab.TabWidth = 2; 11550 Tab.IndentWidth = 2; 11551 EXPECT_EQ("{\n" 11552 "\t/* aaaa\n" 11553 "\t bbbb */\n" 11554 "}", 11555 format("{\n" 11556 "/* aaaa\n" 11557 " bbbb */\n" 11558 "}", 11559 Tab)); 11560 EXPECT_EQ("{\n" 11561 "\t/*\n" 11562 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11563 "\t bbbbbbbbbbbbb\n" 11564 "\t*/\n" 11565 "}", 11566 format("{\n" 11567 "/*\n" 11568 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11569 "*/\n" 11570 "}", 11571 Tab)); 11572 Tab.AlignConsecutiveAssignments = true; 11573 Tab.AlignConsecutiveDeclarations = true; 11574 Tab.TabWidth = 4; 11575 Tab.IndentWidth = 4; 11576 verifyFormat("class Assign {\n" 11577 "\tvoid f() {\n" 11578 "\t\tint x = 123;\n" 11579 "\t\tint random = 4;\n" 11580 "\t\tstd::string alphabet =\n" 11581 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11582 "\t}\n" 11583 "};", 11584 Tab); 11585 Tab.AlignOperands = FormatStyle::OAS_Align; 11586 verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb +\n" 11587 " cccccccccccccccccccc;", 11588 Tab); 11589 // no alignment 11590 verifyFormat("int aaaaaaaaaa =\n" 11591 "\tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 11592 Tab); 11593 verifyFormat("return aaaaaaaaaaaaaaaa ? 111111111111111\n" 11594 " : bbbbbbbbbbbbbb ? 222222222222222\n" 11595 " : 333333333333333;", 11596 Tab); 11597 Tab.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11598 Tab.AlignOperands = FormatStyle::OAS_AlignAfterOperator; 11599 verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb\n" 11600 " + cccccccccccccccccccc;", 11601 Tab); 11602 } 11603 11604 TEST_F(FormatTest, ZeroTabWidth) { 11605 FormatStyle Tab = getLLVMStyleWithColumns(42); 11606 Tab.IndentWidth = 8; 11607 Tab.UseTab = FormatStyle::UT_Never; 11608 Tab.TabWidth = 0; 11609 EXPECT_EQ("void a(){\n" 11610 " // line starts with '\t'\n" 11611 "};", 11612 format("void a(){\n" 11613 "\t// line starts with '\t'\n" 11614 "};", 11615 Tab)); 11616 11617 EXPECT_EQ("void a(){\n" 11618 " // line starts with '\t'\n" 11619 "};", 11620 format("void a(){\n" 11621 "\t\t// line starts with '\t'\n" 11622 "};", 11623 Tab)); 11624 11625 Tab.UseTab = FormatStyle::UT_ForIndentation; 11626 EXPECT_EQ("void a(){\n" 11627 " // line starts with '\t'\n" 11628 "};", 11629 format("void a(){\n" 11630 "\t// line starts with '\t'\n" 11631 "};", 11632 Tab)); 11633 11634 EXPECT_EQ("void a(){\n" 11635 " // line starts with '\t'\n" 11636 "};", 11637 format("void a(){\n" 11638 "\t\t// line starts with '\t'\n" 11639 "};", 11640 Tab)); 11641 11642 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 11643 EXPECT_EQ("void a(){\n" 11644 " // line starts with '\t'\n" 11645 "};", 11646 format("void a(){\n" 11647 "\t// line starts with '\t'\n" 11648 "};", 11649 Tab)); 11650 11651 EXPECT_EQ("void a(){\n" 11652 " // line starts with '\t'\n" 11653 "};", 11654 format("void a(){\n" 11655 "\t\t// line starts with '\t'\n" 11656 "};", 11657 Tab)); 11658 11659 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11660 EXPECT_EQ("void a(){\n" 11661 " // line starts with '\t'\n" 11662 "};", 11663 format("void a(){\n" 11664 "\t// line starts with '\t'\n" 11665 "};", 11666 Tab)); 11667 11668 EXPECT_EQ("void a(){\n" 11669 " // line starts with '\t'\n" 11670 "};", 11671 format("void a(){\n" 11672 "\t\t// line starts with '\t'\n" 11673 "};", 11674 Tab)); 11675 11676 Tab.UseTab = FormatStyle::UT_Always; 11677 EXPECT_EQ("void a(){\n" 11678 "// line starts with '\t'\n" 11679 "};", 11680 format("void a(){\n" 11681 "\t// line starts with '\t'\n" 11682 "};", 11683 Tab)); 11684 11685 EXPECT_EQ("void a(){\n" 11686 "// line starts with '\t'\n" 11687 "};", 11688 format("void a(){\n" 11689 "\t\t// line starts with '\t'\n" 11690 "};", 11691 Tab)); 11692 } 11693 11694 TEST_F(FormatTest, CalculatesOriginalColumn) { 11695 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11696 "q\"; /* some\n" 11697 " comment */", 11698 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11699 "q\"; /* some\n" 11700 " comment */", 11701 getLLVMStyle())); 11702 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11703 "/* some\n" 11704 " comment */", 11705 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11706 " /* some\n" 11707 " comment */", 11708 getLLVMStyle())); 11709 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11710 "qqq\n" 11711 "/* some\n" 11712 " comment */", 11713 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11714 "qqq\n" 11715 " /* some\n" 11716 " comment */", 11717 getLLVMStyle())); 11718 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11719 "wwww; /* some\n" 11720 " comment */", 11721 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11722 "wwww; /* some\n" 11723 " comment */", 11724 getLLVMStyle())); 11725 } 11726 11727 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 11728 FormatStyle NoSpace = getLLVMStyle(); 11729 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 11730 11731 verifyFormat("while(true)\n" 11732 " continue;", 11733 NoSpace); 11734 verifyFormat("for(;;)\n" 11735 " continue;", 11736 NoSpace); 11737 verifyFormat("if(true)\n" 11738 " f();\n" 11739 "else if(true)\n" 11740 " f();", 11741 NoSpace); 11742 verifyFormat("do {\n" 11743 " do_something();\n" 11744 "} while(something());", 11745 NoSpace); 11746 verifyFormat("switch(x) {\n" 11747 "default:\n" 11748 " break;\n" 11749 "}", 11750 NoSpace); 11751 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 11752 verifyFormat("size_t x = sizeof(x);", NoSpace); 11753 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 11754 verifyFormat("auto f(int x) -> typeof(x);", NoSpace); 11755 verifyFormat("auto f(int x) -> _Atomic(x);", NoSpace); 11756 verifyFormat("auto f(int x) -> __underlying_type(x);", NoSpace); 11757 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 11758 verifyFormat("alignas(128) char a[128];", NoSpace); 11759 verifyFormat("size_t x = alignof(MyType);", NoSpace); 11760 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 11761 verifyFormat("int f() throw(Deprecated);", NoSpace); 11762 verifyFormat("typedef void (*cb)(int);", NoSpace); 11763 verifyFormat("T A::operator()();", NoSpace); 11764 verifyFormat("X A::operator++(T);", NoSpace); 11765 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 11766 11767 FormatStyle Space = getLLVMStyle(); 11768 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 11769 11770 verifyFormat("int f ();", Space); 11771 verifyFormat("void f (int a, T b) {\n" 11772 " while (true)\n" 11773 " continue;\n" 11774 "}", 11775 Space); 11776 verifyFormat("if (true)\n" 11777 " f ();\n" 11778 "else if (true)\n" 11779 " f ();", 11780 Space); 11781 verifyFormat("do {\n" 11782 " do_something ();\n" 11783 "} while (something ());", 11784 Space); 11785 verifyFormat("switch (x) {\n" 11786 "default:\n" 11787 " break;\n" 11788 "}", 11789 Space); 11790 verifyFormat("A::A () : a (1) {}", Space); 11791 verifyFormat("void f () __attribute__ ((asdf));", Space); 11792 verifyFormat("*(&a + 1);\n" 11793 "&((&a)[1]);\n" 11794 "a[(b + c) * d];\n" 11795 "(((a + 1) * 2) + 3) * 4;", 11796 Space); 11797 verifyFormat("#define A(x) x", Space); 11798 verifyFormat("#define A (x) x", Space); 11799 verifyFormat("#if defined(x)\n" 11800 "#endif", 11801 Space); 11802 verifyFormat("auto i = std::make_unique<int> (5);", Space); 11803 verifyFormat("size_t x = sizeof (x);", Space); 11804 verifyFormat("auto f (int x) -> decltype (x);", Space); 11805 verifyFormat("auto f (int x) -> typeof (x);", Space); 11806 verifyFormat("auto f (int x) -> _Atomic (x);", Space); 11807 verifyFormat("auto f (int x) -> __underlying_type (x);", Space); 11808 verifyFormat("int f (T x) noexcept (x.create ());", Space); 11809 verifyFormat("alignas (128) char a[128];", Space); 11810 verifyFormat("size_t x = alignof (MyType);", Space); 11811 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 11812 verifyFormat("int f () throw (Deprecated);", Space); 11813 verifyFormat("typedef void (*cb) (int);", Space); 11814 verifyFormat("T A::operator() ();", Space); 11815 verifyFormat("X A::operator++ (T);", Space); 11816 verifyFormat("auto lambda = [] () { return 0; };", Space); 11817 verifyFormat("int x = int (y);", Space); 11818 11819 FormatStyle SomeSpace = getLLVMStyle(); 11820 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 11821 11822 verifyFormat("[]() -> float {}", SomeSpace); 11823 verifyFormat("[] (auto foo) {}", SomeSpace); 11824 verifyFormat("[foo]() -> int {}", SomeSpace); 11825 verifyFormat("int f();", SomeSpace); 11826 verifyFormat("void f (int a, T b) {\n" 11827 " while (true)\n" 11828 " continue;\n" 11829 "}", 11830 SomeSpace); 11831 verifyFormat("if (true)\n" 11832 " f();\n" 11833 "else if (true)\n" 11834 " f();", 11835 SomeSpace); 11836 verifyFormat("do {\n" 11837 " do_something();\n" 11838 "} while (something());", 11839 SomeSpace); 11840 verifyFormat("switch (x) {\n" 11841 "default:\n" 11842 " break;\n" 11843 "}", 11844 SomeSpace); 11845 verifyFormat("A::A() : a (1) {}", SomeSpace); 11846 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 11847 verifyFormat("*(&a + 1);\n" 11848 "&((&a)[1]);\n" 11849 "a[(b + c) * d];\n" 11850 "(((a + 1) * 2) + 3) * 4;", 11851 SomeSpace); 11852 verifyFormat("#define A(x) x", SomeSpace); 11853 verifyFormat("#define A (x) x", SomeSpace); 11854 verifyFormat("#if defined(x)\n" 11855 "#endif", 11856 SomeSpace); 11857 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 11858 verifyFormat("size_t x = sizeof (x);", SomeSpace); 11859 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 11860 verifyFormat("auto f (int x) -> typeof (x);", SomeSpace); 11861 verifyFormat("auto f (int x) -> _Atomic (x);", SomeSpace); 11862 verifyFormat("auto f (int x) -> __underlying_type (x);", SomeSpace); 11863 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 11864 verifyFormat("alignas (128) char a[128];", SomeSpace); 11865 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 11866 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 11867 SomeSpace); 11868 verifyFormat("int f() throw (Deprecated);", SomeSpace); 11869 verifyFormat("typedef void (*cb) (int);", SomeSpace); 11870 verifyFormat("T A::operator()();", SomeSpace); 11871 verifyFormat("X A::operator++ (T);", SomeSpace); 11872 verifyFormat("int x = int (y);", SomeSpace); 11873 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 11874 } 11875 11876 TEST_F(FormatTest, SpaceAfterLogicalNot) { 11877 FormatStyle Spaces = getLLVMStyle(); 11878 Spaces.SpaceAfterLogicalNot = true; 11879 11880 verifyFormat("bool x = ! y", Spaces); 11881 verifyFormat("if (! isFailure())", Spaces); 11882 verifyFormat("if (! (a && b))", Spaces); 11883 verifyFormat("\"Error!\"", Spaces); 11884 verifyFormat("! ! x", Spaces); 11885 } 11886 11887 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 11888 FormatStyle Spaces = getLLVMStyle(); 11889 11890 Spaces.SpacesInParentheses = true; 11891 verifyFormat("do_something( ::globalVar );", Spaces); 11892 verifyFormat("call( x, y, z );", Spaces); 11893 verifyFormat("call();", Spaces); 11894 verifyFormat("std::function<void( int, int )> callback;", Spaces); 11895 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 11896 Spaces); 11897 verifyFormat("while ( (bool)1 )\n" 11898 " continue;", 11899 Spaces); 11900 verifyFormat("for ( ;; )\n" 11901 " continue;", 11902 Spaces); 11903 verifyFormat("if ( true )\n" 11904 " f();\n" 11905 "else if ( true )\n" 11906 " f();", 11907 Spaces); 11908 verifyFormat("do {\n" 11909 " do_something( (int)i );\n" 11910 "} while ( something() );", 11911 Spaces); 11912 verifyFormat("switch ( x ) {\n" 11913 "default:\n" 11914 " break;\n" 11915 "}", 11916 Spaces); 11917 11918 Spaces.SpacesInParentheses = false; 11919 Spaces.SpacesInCStyleCastParentheses = true; 11920 verifyFormat("Type *A = ( Type * )P;", Spaces); 11921 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 11922 verifyFormat("x = ( int32 )y;", Spaces); 11923 verifyFormat("int a = ( int )(2.0f);", Spaces); 11924 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 11925 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 11926 verifyFormat("#define x (( int )-1)", Spaces); 11927 11928 // Run the first set of tests again with: 11929 Spaces.SpacesInParentheses = false; 11930 Spaces.SpaceInEmptyParentheses = true; 11931 Spaces.SpacesInCStyleCastParentheses = true; 11932 verifyFormat("call(x, y, z);", Spaces); 11933 verifyFormat("call( );", Spaces); 11934 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11935 verifyFormat("while (( bool )1)\n" 11936 " continue;", 11937 Spaces); 11938 verifyFormat("for (;;)\n" 11939 " continue;", 11940 Spaces); 11941 verifyFormat("if (true)\n" 11942 " f( );\n" 11943 "else if (true)\n" 11944 " f( );", 11945 Spaces); 11946 verifyFormat("do {\n" 11947 " do_something(( int )i);\n" 11948 "} while (something( ));", 11949 Spaces); 11950 verifyFormat("switch (x) {\n" 11951 "default:\n" 11952 " break;\n" 11953 "}", 11954 Spaces); 11955 11956 // Run the first set of tests again with: 11957 Spaces.SpaceAfterCStyleCast = true; 11958 verifyFormat("call(x, y, z);", Spaces); 11959 verifyFormat("call( );", Spaces); 11960 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11961 verifyFormat("while (( bool ) 1)\n" 11962 " continue;", 11963 Spaces); 11964 verifyFormat("for (;;)\n" 11965 " continue;", 11966 Spaces); 11967 verifyFormat("if (true)\n" 11968 " f( );\n" 11969 "else if (true)\n" 11970 " f( );", 11971 Spaces); 11972 verifyFormat("do {\n" 11973 " do_something(( int ) i);\n" 11974 "} while (something( ));", 11975 Spaces); 11976 verifyFormat("switch (x) {\n" 11977 "default:\n" 11978 " break;\n" 11979 "}", 11980 Spaces); 11981 11982 // Run subset of tests again with: 11983 Spaces.SpacesInCStyleCastParentheses = false; 11984 Spaces.SpaceAfterCStyleCast = true; 11985 verifyFormat("while ((bool) 1)\n" 11986 " continue;", 11987 Spaces); 11988 verifyFormat("do {\n" 11989 " do_something((int) i);\n" 11990 "} while (something( ));", 11991 Spaces); 11992 11993 verifyFormat("size_t idx = (size_t) (ptr - ((char *) file));", Spaces); 11994 verifyFormat("size_t idx = (size_t) a;", Spaces); 11995 verifyFormat("size_t idx = (size_t) (a - 1);", Spaces); 11996 verifyFormat("size_t idx = (a->*foo)(a - 1);", Spaces); 11997 verifyFormat("size_t idx = (a->foo)(a - 1);", Spaces); 11998 verifyFormat("size_t idx = (*foo)(a - 1);", Spaces); 11999 Spaces.SpaceAfterCStyleCast = false; 12000 verifyFormat("size_t idx = (size_t)(ptr - ((char *)file));", Spaces); 12001 verifyFormat("size_t idx = (size_t)a;", Spaces); 12002 verifyFormat("size_t idx = (size_t)(a - 1);", Spaces); 12003 verifyFormat("size_t idx = (a->*foo)(a - 1);", Spaces); 12004 verifyFormat("size_t idx = (a->foo)(a - 1);", Spaces); 12005 verifyFormat("size_t idx = (*foo)(a - 1);", Spaces); 12006 } 12007 12008 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 12009 verifyFormat("int a[5];"); 12010 verifyFormat("a[3] += 42;"); 12011 12012 FormatStyle Spaces = getLLVMStyle(); 12013 Spaces.SpacesInSquareBrackets = true; 12014 // Not lambdas. 12015 verifyFormat("int a[ 5 ];", Spaces); 12016 verifyFormat("a[ 3 ] += 42;", Spaces); 12017 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 12018 verifyFormat("double &operator[](int i) { return 0; }\n" 12019 "int i;", 12020 Spaces); 12021 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 12022 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 12023 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 12024 // Lambdas. 12025 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 12026 verifyFormat("return [ i, args... ] {};", Spaces); 12027 verifyFormat("int foo = [ &bar ]() {};", Spaces); 12028 verifyFormat("int foo = [ = ]() {};", Spaces); 12029 verifyFormat("int foo = [ & ]() {};", Spaces); 12030 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 12031 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 12032 } 12033 12034 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 12035 FormatStyle NoSpaceStyle = getLLVMStyle(); 12036 verifyFormat("int a[5];", NoSpaceStyle); 12037 verifyFormat("a[3] += 42;", NoSpaceStyle); 12038 12039 verifyFormat("int a[1];", NoSpaceStyle); 12040 verifyFormat("int 1 [a];", NoSpaceStyle); 12041 verifyFormat("int a[1][2];", NoSpaceStyle); 12042 verifyFormat("a[7] = 5;", NoSpaceStyle); 12043 verifyFormat("int a = (f())[23];", NoSpaceStyle); 12044 verifyFormat("f([] {})", NoSpaceStyle); 12045 12046 FormatStyle Space = getLLVMStyle(); 12047 Space.SpaceBeforeSquareBrackets = true; 12048 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 12049 verifyFormat("return [i, args...] {};", Space); 12050 12051 verifyFormat("int a [5];", Space); 12052 verifyFormat("a [3] += 42;", Space); 12053 verifyFormat("constexpr char hello []{\"hello\"};", Space); 12054 verifyFormat("double &operator[](int i) { return 0; }\n" 12055 "int i;", 12056 Space); 12057 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 12058 verifyFormat("int i = a [a][a]->f();", Space); 12059 verifyFormat("int i = (*b) [a]->f();", Space); 12060 12061 verifyFormat("int a [1];", Space); 12062 verifyFormat("int 1 [a];", Space); 12063 verifyFormat("int a [1][2];", Space); 12064 verifyFormat("a [7] = 5;", Space); 12065 verifyFormat("int a = (f()) [23];", Space); 12066 verifyFormat("f([] {})", Space); 12067 } 12068 12069 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 12070 verifyFormat("int a = 5;"); 12071 verifyFormat("a += 42;"); 12072 verifyFormat("a or_eq 8;"); 12073 12074 FormatStyle Spaces = getLLVMStyle(); 12075 Spaces.SpaceBeforeAssignmentOperators = false; 12076 verifyFormat("int a= 5;", Spaces); 12077 verifyFormat("a+= 42;", Spaces); 12078 verifyFormat("a or_eq 8;", Spaces); 12079 } 12080 12081 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 12082 verifyFormat("class Foo : public Bar {};"); 12083 verifyFormat("Foo::Foo() : foo(1) {}"); 12084 verifyFormat("for (auto a : b) {\n}"); 12085 verifyFormat("int x = a ? b : c;"); 12086 verifyFormat("{\n" 12087 "label0:\n" 12088 " int x = 0;\n" 12089 "}"); 12090 verifyFormat("switch (x) {\n" 12091 "case 1:\n" 12092 "default:\n" 12093 "}"); 12094 verifyFormat("switch (allBraces) {\n" 12095 "case 1: {\n" 12096 " break;\n" 12097 "}\n" 12098 "case 2: {\n" 12099 " [[fallthrough]];\n" 12100 "}\n" 12101 "default: {\n" 12102 " break;\n" 12103 "}\n" 12104 "}"); 12105 12106 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 12107 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 12108 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 12109 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 12110 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 12111 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 12112 verifyFormat("{\n" 12113 "label1:\n" 12114 " int x = 0;\n" 12115 "}", 12116 CtorInitializerStyle); 12117 verifyFormat("switch (x) {\n" 12118 "case 1:\n" 12119 "default:\n" 12120 "}", 12121 CtorInitializerStyle); 12122 verifyFormat("switch (allBraces) {\n" 12123 "case 1: {\n" 12124 " break;\n" 12125 "}\n" 12126 "case 2: {\n" 12127 " [[fallthrough]];\n" 12128 "}\n" 12129 "default: {\n" 12130 " break;\n" 12131 "}\n" 12132 "}", 12133 CtorInitializerStyle); 12134 CtorInitializerStyle.BreakConstructorInitializers = 12135 FormatStyle::BCIS_AfterColon; 12136 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 12137 " aaaaaaaaaaaaaaaa(1),\n" 12138 " bbbbbbbbbbbbbbbb(2) {}", 12139 CtorInitializerStyle); 12140 CtorInitializerStyle.BreakConstructorInitializers = 12141 FormatStyle::BCIS_BeforeComma; 12142 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12143 " : aaaaaaaaaaaaaaaa(1)\n" 12144 " , bbbbbbbbbbbbbbbb(2) {}", 12145 CtorInitializerStyle); 12146 CtorInitializerStyle.BreakConstructorInitializers = 12147 FormatStyle::BCIS_BeforeColon; 12148 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12149 " : aaaaaaaaaaaaaaaa(1),\n" 12150 " bbbbbbbbbbbbbbbb(2) {}", 12151 CtorInitializerStyle); 12152 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 12153 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12154 ": aaaaaaaaaaaaaaaa(1),\n" 12155 " bbbbbbbbbbbbbbbb(2) {}", 12156 CtorInitializerStyle); 12157 12158 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 12159 InheritanceStyle.SpaceBeforeInheritanceColon = false; 12160 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 12161 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 12162 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 12163 verifyFormat("int x = a ? b : c;", InheritanceStyle); 12164 verifyFormat("{\n" 12165 "label2:\n" 12166 " int x = 0;\n" 12167 "}", 12168 InheritanceStyle); 12169 verifyFormat("switch (x) {\n" 12170 "case 1:\n" 12171 "default:\n" 12172 "}", 12173 InheritanceStyle); 12174 verifyFormat("switch (allBraces) {\n" 12175 "case 1: {\n" 12176 " break;\n" 12177 "}\n" 12178 "case 2: {\n" 12179 " [[fallthrough]];\n" 12180 "}\n" 12181 "default: {\n" 12182 " break;\n" 12183 "}\n" 12184 "}", 12185 InheritanceStyle); 12186 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 12187 verifyFormat("class Foooooooooooooooooooooo:\n" 12188 " public aaaaaaaaaaaaaaaaaa,\n" 12189 " public bbbbbbbbbbbbbbbbbb {\n" 12190 "}", 12191 InheritanceStyle); 12192 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 12193 verifyFormat("class Foooooooooooooooooooooo\n" 12194 " : public aaaaaaaaaaaaaaaaaa\n" 12195 " , public bbbbbbbbbbbbbbbbbb {\n" 12196 "}", 12197 InheritanceStyle); 12198 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12199 verifyFormat("class Foooooooooooooooooooooo\n" 12200 " : public aaaaaaaaaaaaaaaaaa,\n" 12201 " public bbbbbbbbbbbbbbbbbb {\n" 12202 "}", 12203 InheritanceStyle); 12204 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 12205 verifyFormat("class Foooooooooooooooooooooo\n" 12206 ": public aaaaaaaaaaaaaaaaaa,\n" 12207 " public bbbbbbbbbbbbbbbbbb {}", 12208 InheritanceStyle); 12209 12210 FormatStyle ForLoopStyle = getLLVMStyle(); 12211 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 12212 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 12213 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 12214 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 12215 verifyFormat("int x = a ? b : c;", ForLoopStyle); 12216 verifyFormat("{\n" 12217 "label2:\n" 12218 " int x = 0;\n" 12219 "}", 12220 ForLoopStyle); 12221 verifyFormat("switch (x) {\n" 12222 "case 1:\n" 12223 "default:\n" 12224 "}", 12225 ForLoopStyle); 12226 verifyFormat("switch (allBraces) {\n" 12227 "case 1: {\n" 12228 " break;\n" 12229 "}\n" 12230 "case 2: {\n" 12231 " [[fallthrough]];\n" 12232 "}\n" 12233 "default: {\n" 12234 " break;\n" 12235 "}\n" 12236 "}", 12237 ForLoopStyle); 12238 12239 FormatStyle CaseStyle = getLLVMStyle(); 12240 CaseStyle.SpaceBeforeCaseColon = true; 12241 verifyFormat("class Foo : public Bar {};", CaseStyle); 12242 verifyFormat("Foo::Foo() : foo(1) {}", CaseStyle); 12243 verifyFormat("for (auto a : b) {\n}", CaseStyle); 12244 verifyFormat("int x = a ? b : c;", CaseStyle); 12245 verifyFormat("switch (x) {\n" 12246 "case 1 :\n" 12247 "default :\n" 12248 "}", 12249 CaseStyle); 12250 verifyFormat("switch (allBraces) {\n" 12251 "case 1 : {\n" 12252 " break;\n" 12253 "}\n" 12254 "case 2 : {\n" 12255 " [[fallthrough]];\n" 12256 "}\n" 12257 "default : {\n" 12258 " break;\n" 12259 "}\n" 12260 "}", 12261 CaseStyle); 12262 12263 FormatStyle NoSpaceStyle = getLLVMStyle(); 12264 EXPECT_EQ(NoSpaceStyle.SpaceBeforeCaseColon, false); 12265 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 12266 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 12267 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 12268 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 12269 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 12270 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 12271 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 12272 verifyFormat("{\n" 12273 "label3:\n" 12274 " int x = 0;\n" 12275 "}", 12276 NoSpaceStyle); 12277 verifyFormat("switch (x) {\n" 12278 "case 1:\n" 12279 "default:\n" 12280 "}", 12281 NoSpaceStyle); 12282 verifyFormat("switch (allBraces) {\n" 12283 "case 1: {\n" 12284 " break;\n" 12285 "}\n" 12286 "case 2: {\n" 12287 " [[fallthrough]];\n" 12288 "}\n" 12289 "default: {\n" 12290 " break;\n" 12291 "}\n" 12292 "}", 12293 NoSpaceStyle); 12294 12295 FormatStyle InvertedSpaceStyle = getLLVMStyle(); 12296 InvertedSpaceStyle.SpaceBeforeCaseColon = true; 12297 InvertedSpaceStyle.SpaceBeforeCtorInitializerColon = false; 12298 InvertedSpaceStyle.SpaceBeforeInheritanceColon = false; 12299 InvertedSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 12300 verifyFormat("class Foo: public Bar {};", InvertedSpaceStyle); 12301 verifyFormat("Foo::Foo(): foo(1) {}", InvertedSpaceStyle); 12302 verifyFormat("for (auto a: b) {\n}", InvertedSpaceStyle); 12303 verifyFormat("int x = a ? b : c;", InvertedSpaceStyle); 12304 verifyFormat("{\n" 12305 "label3:\n" 12306 " int x = 0;\n" 12307 "}", 12308 InvertedSpaceStyle); 12309 verifyFormat("switch (x) {\n" 12310 "case 1 :\n" 12311 "case 2 : {\n" 12312 " break;\n" 12313 "}\n" 12314 "default :\n" 12315 " break;\n" 12316 "}", 12317 InvertedSpaceStyle); 12318 verifyFormat("switch (allBraces) {\n" 12319 "case 1 : {\n" 12320 " break;\n" 12321 "}\n" 12322 "case 2 : {\n" 12323 " [[fallthrough]];\n" 12324 "}\n" 12325 "default : {\n" 12326 " break;\n" 12327 "}\n" 12328 "}", 12329 InvertedSpaceStyle); 12330 } 12331 12332 TEST_F(FormatTest, ConfigurableSpaceAroundPointerQualifiers) { 12333 FormatStyle Style = getLLVMStyle(); 12334 12335 Style.PointerAlignment = FormatStyle::PAS_Left; 12336 Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default; 12337 verifyFormat("void* const* x = NULL;", Style); 12338 12339 #define verifyQualifierSpaces(Code, Pointers, Qualifiers) \ 12340 do { \ 12341 Style.PointerAlignment = FormatStyle::Pointers; \ 12342 Style.SpaceAroundPointerQualifiers = FormatStyle::Qualifiers; \ 12343 verifyFormat(Code, Style); \ 12344 } while (false) 12345 12346 verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Default); 12347 verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_Default); 12348 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Default); 12349 12350 verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Before); 12351 verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Before); 12352 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Before); 12353 12354 verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_After); 12355 verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_After); 12356 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_After); 12357 12358 verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_Both); 12359 verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Both); 12360 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Both); 12361 12362 #undef verifyQualifierSpaces 12363 12364 FormatStyle Spaces = getLLVMStyle(); 12365 Spaces.AttributeMacros.push_back("qualified"); 12366 Spaces.PointerAlignment = FormatStyle::PAS_Right; 12367 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default; 12368 verifyFormat("SomeType *volatile *a = NULL;", Spaces); 12369 verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces); 12370 verifyFormat("std::vector<SomeType *const *> x;", Spaces); 12371 verifyFormat("std::vector<SomeType *qualified *> x;", Spaces); 12372 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12373 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before; 12374 verifyFormat("SomeType * volatile *a = NULL;", Spaces); 12375 verifyFormat("SomeType * __attribute__((attr)) *a = NULL;", Spaces); 12376 verifyFormat("std::vector<SomeType * const *> x;", Spaces); 12377 verifyFormat("std::vector<SomeType * qualified *> x;", Spaces); 12378 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12379 12380 // Check that SAPQ_Before doesn't result in extra spaces for PAS_Left. 12381 Spaces.PointerAlignment = FormatStyle::PAS_Left; 12382 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before; 12383 verifyFormat("SomeType* volatile* a = NULL;", Spaces); 12384 verifyFormat("SomeType* __attribute__((attr))* a = NULL;", Spaces); 12385 verifyFormat("std::vector<SomeType* const*> x;", Spaces); 12386 verifyFormat("std::vector<SomeType* qualified*> x;", Spaces); 12387 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12388 // However, setting it to SAPQ_After should add spaces after __attribute, etc. 12389 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After; 12390 verifyFormat("SomeType* volatile * a = NULL;", Spaces); 12391 verifyFormat("SomeType* __attribute__((attr)) * a = NULL;", Spaces); 12392 verifyFormat("std::vector<SomeType* const *> x;", Spaces); 12393 verifyFormat("std::vector<SomeType* qualified *> x;", Spaces); 12394 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12395 12396 // PAS_Middle should not have any noticeable changes even for SAPQ_Both 12397 Spaces.PointerAlignment = FormatStyle::PAS_Middle; 12398 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After; 12399 verifyFormat("SomeType * volatile * a = NULL;", Spaces); 12400 verifyFormat("SomeType * __attribute__((attr)) * a = NULL;", Spaces); 12401 verifyFormat("std::vector<SomeType * const *> x;", Spaces); 12402 verifyFormat("std::vector<SomeType * qualified *> x;", Spaces); 12403 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12404 } 12405 12406 TEST_F(FormatTest, AlignConsecutiveMacros) { 12407 FormatStyle Style = getLLVMStyle(); 12408 Style.AlignConsecutiveAssignments = true; 12409 Style.AlignConsecutiveDeclarations = true; 12410 Style.AlignConsecutiveMacros = false; 12411 12412 verifyFormat("#define a 3\n" 12413 "#define bbbb 4\n" 12414 "#define ccc (5)", 12415 Style); 12416 12417 verifyFormat("#define f(x) (x * x)\n" 12418 "#define fff(x, y, z) (x * y + z)\n" 12419 "#define ffff(x, y) (x - y)", 12420 Style); 12421 12422 verifyFormat("#define foo(x, y) (x + y)\n" 12423 "#define bar (5, 6)(2 + 2)", 12424 Style); 12425 12426 verifyFormat("#define a 3\n" 12427 "#define bbbb 4\n" 12428 "#define ccc (5)\n" 12429 "#define f(x) (x * x)\n" 12430 "#define fff(x, y, z) (x * y + z)\n" 12431 "#define ffff(x, y) (x - y)", 12432 Style); 12433 12434 Style.AlignConsecutiveMacros = true; 12435 verifyFormat("#define a 3\n" 12436 "#define bbbb 4\n" 12437 "#define ccc (5)", 12438 Style); 12439 12440 verifyFormat("#define f(x) (x * x)\n" 12441 "#define fff(x, y, z) (x * y + z)\n" 12442 "#define ffff(x, y) (x - y)", 12443 Style); 12444 12445 verifyFormat("#define foo(x, y) (x + y)\n" 12446 "#define bar (5, 6)(2 + 2)", 12447 Style); 12448 12449 verifyFormat("#define a 3\n" 12450 "#define bbbb 4\n" 12451 "#define ccc (5)\n" 12452 "#define f(x) (x * x)\n" 12453 "#define fff(x, y, z) (x * y + z)\n" 12454 "#define ffff(x, y) (x - y)", 12455 Style); 12456 12457 verifyFormat("#define a 5\n" 12458 "#define foo(x, y) (x + y)\n" 12459 "#define CCC (6)\n" 12460 "auto lambda = []() {\n" 12461 " auto ii = 0;\n" 12462 " float j = 0;\n" 12463 " return 0;\n" 12464 "};\n" 12465 "int i = 0;\n" 12466 "float i2 = 0;\n" 12467 "auto v = type{\n" 12468 " i = 1, //\n" 12469 " (i = 2), //\n" 12470 " i = 3 //\n" 12471 "};", 12472 Style); 12473 12474 Style.AlignConsecutiveMacros = false; 12475 Style.ColumnLimit = 20; 12476 12477 verifyFormat("#define a \\\n" 12478 " \"aabbbbbbbbbbbb\"\n" 12479 "#define D \\\n" 12480 " \"aabbbbbbbbbbbb\" \\\n" 12481 " \"ccddeeeeeeeee\"\n" 12482 "#define B \\\n" 12483 " \"QQQQQQQQQQQQQ\" \\\n" 12484 " \"FFFFFFFFFFFFF\" \\\n" 12485 " \"LLLLLLLL\"\n", 12486 Style); 12487 12488 Style.AlignConsecutiveMacros = true; 12489 verifyFormat("#define a \\\n" 12490 " \"aabbbbbbbbbbbb\"\n" 12491 "#define D \\\n" 12492 " \"aabbbbbbbbbbbb\" \\\n" 12493 " \"ccddeeeeeeeee\"\n" 12494 "#define B \\\n" 12495 " \"QQQQQQQQQQQQQ\" \\\n" 12496 " \"FFFFFFFFFFFFF\" \\\n" 12497 " \"LLLLLLLL\"\n", 12498 Style); 12499 } 12500 12501 TEST_F(FormatTest, AlignConsecutiveAssignments) { 12502 FormatStyle Alignment = getLLVMStyle(); 12503 Alignment.AlignConsecutiveMacros = true; 12504 Alignment.AlignConsecutiveAssignments = false; 12505 verifyFormat("int a = 5;\n" 12506 "int oneTwoThree = 123;", 12507 Alignment); 12508 verifyFormat("int a = 5;\n" 12509 "int oneTwoThree = 123;", 12510 Alignment); 12511 12512 Alignment.AlignConsecutiveAssignments = true; 12513 verifyFormat("int a = 5;\n" 12514 "int oneTwoThree = 123;", 12515 Alignment); 12516 verifyFormat("int a = method();\n" 12517 "int oneTwoThree = 133;", 12518 Alignment); 12519 verifyFormat("a &= 5;\n" 12520 "bcd *= 5;\n" 12521 "ghtyf += 5;\n" 12522 "dvfvdb -= 5;\n" 12523 "a /= 5;\n" 12524 "vdsvsv %= 5;\n" 12525 "sfdbddfbdfbb ^= 5;\n" 12526 "dvsdsv |= 5;\n" 12527 "int dsvvdvsdvvv = 123;", 12528 Alignment); 12529 verifyFormat("int i = 1, j = 10;\n" 12530 "something = 2000;", 12531 Alignment); 12532 verifyFormat("something = 2000;\n" 12533 "int i = 1, j = 10;\n", 12534 Alignment); 12535 verifyFormat("something = 2000;\n" 12536 "another = 911;\n" 12537 "int i = 1, j = 10;\n" 12538 "oneMore = 1;\n" 12539 "i = 2;", 12540 Alignment); 12541 verifyFormat("int a = 5;\n" 12542 "int one = 1;\n" 12543 "method();\n" 12544 "int oneTwoThree = 123;\n" 12545 "int oneTwo = 12;", 12546 Alignment); 12547 verifyFormat("int oneTwoThree = 123;\n" 12548 "int oneTwo = 12;\n" 12549 "method();\n", 12550 Alignment); 12551 verifyFormat("int oneTwoThree = 123; // comment\n" 12552 "int oneTwo = 12; // comment", 12553 Alignment); 12554 12555 // Bug 25167 12556 /* Uncomment when fixed 12557 verifyFormat("#if A\n" 12558 "#else\n" 12559 "int aaaaaaaa = 12;\n" 12560 "#endif\n" 12561 "#if B\n" 12562 "#else\n" 12563 "int a = 12;\n" 12564 "#endif\n", 12565 Alignment); 12566 verifyFormat("enum foo {\n" 12567 "#if A\n" 12568 "#else\n" 12569 " aaaaaaaa = 12;\n" 12570 "#endif\n" 12571 "#if B\n" 12572 "#else\n" 12573 " a = 12;\n" 12574 "#endif\n" 12575 "};\n", 12576 Alignment); 12577 */ 12578 12579 EXPECT_EQ("int a = 5;\n" 12580 "\n" 12581 "int oneTwoThree = 123;", 12582 format("int a = 5;\n" 12583 "\n" 12584 "int oneTwoThree= 123;", 12585 Alignment)); 12586 EXPECT_EQ("int a = 5;\n" 12587 "int one = 1;\n" 12588 "\n" 12589 "int oneTwoThree = 123;", 12590 format("int a = 5;\n" 12591 "int one = 1;\n" 12592 "\n" 12593 "int oneTwoThree = 123;", 12594 Alignment)); 12595 EXPECT_EQ("int a = 5;\n" 12596 "int one = 1;\n" 12597 "\n" 12598 "int oneTwoThree = 123;\n" 12599 "int oneTwo = 12;", 12600 format("int a = 5;\n" 12601 "int one = 1;\n" 12602 "\n" 12603 "int oneTwoThree = 123;\n" 12604 "int oneTwo = 12;", 12605 Alignment)); 12606 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12607 verifyFormat("#define A \\\n" 12608 " int aaaa = 12; \\\n" 12609 " int b = 23; \\\n" 12610 " int ccc = 234; \\\n" 12611 " int dddddddddd = 2345;", 12612 Alignment); 12613 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12614 verifyFormat("#define A \\\n" 12615 " int aaaa = 12; \\\n" 12616 " int b = 23; \\\n" 12617 " int ccc = 234; \\\n" 12618 " int dddddddddd = 2345;", 12619 Alignment); 12620 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12621 verifyFormat("#define A " 12622 " \\\n" 12623 " int aaaa = 12; " 12624 " \\\n" 12625 " int b = 23; " 12626 " \\\n" 12627 " int ccc = 234; " 12628 " \\\n" 12629 " int dddddddddd = 2345;", 12630 Alignment); 12631 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12632 "k = 4, int l = 5,\n" 12633 " int m = 6) {\n" 12634 " int j = 10;\n" 12635 " otherThing = 1;\n" 12636 "}", 12637 Alignment); 12638 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12639 " int i = 1;\n" 12640 " int j = 2;\n" 12641 " int big = 10000;\n" 12642 "}", 12643 Alignment); 12644 verifyFormat("class C {\n" 12645 "public:\n" 12646 " int i = 1;\n" 12647 " virtual void f() = 0;\n" 12648 "};", 12649 Alignment); 12650 verifyFormat("int i = 1;\n" 12651 "if (SomeType t = getSomething()) {\n" 12652 "}\n" 12653 "int j = 2;\n" 12654 "int big = 10000;", 12655 Alignment); 12656 verifyFormat("int j = 7;\n" 12657 "for (int k = 0; k < N; ++k) {\n" 12658 "}\n" 12659 "int j = 2;\n" 12660 "int big = 10000;\n" 12661 "}", 12662 Alignment); 12663 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12664 verifyFormat("int i = 1;\n" 12665 "LooooooooooongType loooooooooooooooooooooongVariable\n" 12666 " = someLooooooooooooooooongFunction();\n" 12667 "int j = 2;", 12668 Alignment); 12669 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 12670 verifyFormat("int i = 1;\n" 12671 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 12672 " someLooooooooooooooooongFunction();\n" 12673 "int j = 2;", 12674 Alignment); 12675 12676 verifyFormat("auto lambda = []() {\n" 12677 " auto i = 0;\n" 12678 " return 0;\n" 12679 "};\n" 12680 "int i = 0;\n" 12681 "auto v = type{\n" 12682 " i = 1, //\n" 12683 " (i = 2), //\n" 12684 " i = 3 //\n" 12685 "};", 12686 Alignment); 12687 12688 verifyFormat( 12689 "int i = 1;\n" 12690 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12691 " loooooooooooooooooooooongParameterB);\n" 12692 "int j = 2;", 12693 Alignment); 12694 12695 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 12696 " typename B = very_long_type_name_1,\n" 12697 " typename T_2 = very_long_type_name_2>\n" 12698 "auto foo() {}\n", 12699 Alignment); 12700 verifyFormat("int a, b = 1;\n" 12701 "int c = 2;\n" 12702 "int dd = 3;\n", 12703 Alignment); 12704 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12705 "float b[1][] = {{3.f}};\n", 12706 Alignment); 12707 verifyFormat("for (int i = 0; i < 1; i++)\n" 12708 " int x = 1;\n", 12709 Alignment); 12710 verifyFormat("for (i = 0; i < 1; i++)\n" 12711 " x = 1;\n" 12712 "y = 1;\n", 12713 Alignment); 12714 12715 Alignment.ReflowComments = true; 12716 Alignment.ColumnLimit = 50; 12717 EXPECT_EQ("int x = 0;\n" 12718 "int yy = 1; /// specificlennospace\n" 12719 "int zzz = 2;\n", 12720 format("int x = 0;\n" 12721 "int yy = 1; ///specificlennospace\n" 12722 "int zzz = 2;\n", 12723 Alignment)); 12724 } 12725 12726 TEST_F(FormatTest, AlignConsecutiveBitFields) { 12727 FormatStyle Alignment = getLLVMStyle(); 12728 Alignment.AlignConsecutiveBitFields = true; 12729 verifyFormat("int const a : 5;\n" 12730 "int oneTwoThree : 23;", 12731 Alignment); 12732 12733 // Initializers are allowed starting with c++2a 12734 verifyFormat("int const a : 5 = 1;\n" 12735 "int oneTwoThree : 23 = 0;", 12736 Alignment); 12737 12738 Alignment.AlignConsecutiveDeclarations = true; 12739 verifyFormat("int const a : 5;\n" 12740 "int oneTwoThree : 23;", 12741 Alignment); 12742 12743 verifyFormat("int const a : 5; // comment\n" 12744 "int oneTwoThree : 23; // comment", 12745 Alignment); 12746 12747 verifyFormat("int const a : 5 = 1;\n" 12748 "int oneTwoThree : 23 = 0;", 12749 Alignment); 12750 12751 Alignment.AlignConsecutiveAssignments = true; 12752 verifyFormat("int const a : 5 = 1;\n" 12753 "int oneTwoThree : 23 = 0;", 12754 Alignment); 12755 verifyFormat("int const a : 5 = {1};\n" 12756 "int oneTwoThree : 23 = 0;", 12757 Alignment); 12758 12759 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_None; 12760 verifyFormat("int const a :5;\n" 12761 "int oneTwoThree:23;", 12762 Alignment); 12763 12764 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_Before; 12765 verifyFormat("int const a :5;\n" 12766 "int oneTwoThree :23;", 12767 Alignment); 12768 12769 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_After; 12770 verifyFormat("int const a : 5;\n" 12771 "int oneTwoThree: 23;", 12772 Alignment); 12773 12774 // Known limitations: ':' is only recognized as a bitfield colon when 12775 // followed by a number. 12776 /* 12777 verifyFormat("int oneTwoThree : SOME_CONSTANT;\n" 12778 "int a : 5;", 12779 Alignment); 12780 */ 12781 } 12782 12783 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 12784 FormatStyle Alignment = getLLVMStyle(); 12785 Alignment.AlignConsecutiveMacros = true; 12786 Alignment.AlignConsecutiveDeclarations = false; 12787 verifyFormat("float const a = 5;\n" 12788 "int oneTwoThree = 123;", 12789 Alignment); 12790 verifyFormat("int a = 5;\n" 12791 "float const oneTwoThree = 123;", 12792 Alignment); 12793 12794 Alignment.AlignConsecutiveDeclarations = true; 12795 verifyFormat("float const a = 5;\n" 12796 "int oneTwoThree = 123;", 12797 Alignment); 12798 verifyFormat("int a = method();\n" 12799 "float const oneTwoThree = 133;", 12800 Alignment); 12801 verifyFormat("int i = 1, j = 10;\n" 12802 "something = 2000;", 12803 Alignment); 12804 verifyFormat("something = 2000;\n" 12805 "int i = 1, j = 10;\n", 12806 Alignment); 12807 verifyFormat("float something = 2000;\n" 12808 "double another = 911;\n" 12809 "int i = 1, j = 10;\n" 12810 "const int *oneMore = 1;\n" 12811 "unsigned i = 2;", 12812 Alignment); 12813 verifyFormat("float a = 5;\n" 12814 "int one = 1;\n" 12815 "method();\n" 12816 "const double oneTwoThree = 123;\n" 12817 "const unsigned int oneTwo = 12;", 12818 Alignment); 12819 verifyFormat("int oneTwoThree{0}; // comment\n" 12820 "unsigned oneTwo; // comment", 12821 Alignment); 12822 EXPECT_EQ("float const a = 5;\n" 12823 "\n" 12824 "int oneTwoThree = 123;", 12825 format("float const a = 5;\n" 12826 "\n" 12827 "int oneTwoThree= 123;", 12828 Alignment)); 12829 EXPECT_EQ("float a = 5;\n" 12830 "int one = 1;\n" 12831 "\n" 12832 "unsigned oneTwoThree = 123;", 12833 format("float a = 5;\n" 12834 "int one = 1;\n" 12835 "\n" 12836 "unsigned oneTwoThree = 123;", 12837 Alignment)); 12838 EXPECT_EQ("float a = 5;\n" 12839 "int one = 1;\n" 12840 "\n" 12841 "unsigned oneTwoThree = 123;\n" 12842 "int oneTwo = 12;", 12843 format("float a = 5;\n" 12844 "int one = 1;\n" 12845 "\n" 12846 "unsigned oneTwoThree = 123;\n" 12847 "int oneTwo = 12;", 12848 Alignment)); 12849 // Function prototype alignment 12850 verifyFormat("int a();\n" 12851 "double b();", 12852 Alignment); 12853 verifyFormat("int a(int x);\n" 12854 "double b();", 12855 Alignment); 12856 unsigned OldColumnLimit = Alignment.ColumnLimit; 12857 // We need to set ColumnLimit to zero, in order to stress nested alignments, 12858 // otherwise the function parameters will be re-flowed onto a single line. 12859 Alignment.ColumnLimit = 0; 12860 EXPECT_EQ("int a(int x,\n" 12861 " float y);\n" 12862 "double b(int x,\n" 12863 " double y);", 12864 format("int a(int x,\n" 12865 " float y);\n" 12866 "double b(int x,\n" 12867 " double y);", 12868 Alignment)); 12869 // This ensures that function parameters of function declarations are 12870 // correctly indented when their owning functions are indented. 12871 // The failure case here is for 'double y' to not be indented enough. 12872 EXPECT_EQ("double a(int x);\n" 12873 "int b(int y,\n" 12874 " double z);", 12875 format("double a(int x);\n" 12876 "int b(int y,\n" 12877 " double z);", 12878 Alignment)); 12879 // Set ColumnLimit low so that we induce wrapping immediately after 12880 // the function name and opening paren. 12881 Alignment.ColumnLimit = 13; 12882 verifyFormat("int function(\n" 12883 " int x,\n" 12884 " bool y);", 12885 Alignment); 12886 Alignment.ColumnLimit = OldColumnLimit; 12887 // Ensure function pointers don't screw up recursive alignment 12888 verifyFormat("int a(int x, void (*fp)(int y));\n" 12889 "double b();", 12890 Alignment); 12891 Alignment.AlignConsecutiveAssignments = true; 12892 // Ensure recursive alignment is broken by function braces, so that the 12893 // "a = 1" does not align with subsequent assignments inside the function 12894 // body. 12895 verifyFormat("int func(int a = 1) {\n" 12896 " int b = 2;\n" 12897 " int cc = 3;\n" 12898 "}", 12899 Alignment); 12900 verifyFormat("float something = 2000;\n" 12901 "double another = 911;\n" 12902 "int i = 1, j = 10;\n" 12903 "const int *oneMore = 1;\n" 12904 "unsigned i = 2;", 12905 Alignment); 12906 verifyFormat("int oneTwoThree = {0}; // comment\n" 12907 "unsigned oneTwo = 0; // comment", 12908 Alignment); 12909 // Make sure that scope is correctly tracked, in the absence of braces 12910 verifyFormat("for (int i = 0; i < n; i++)\n" 12911 " j = i;\n" 12912 "double x = 1;\n", 12913 Alignment); 12914 verifyFormat("if (int i = 0)\n" 12915 " j = i;\n" 12916 "double x = 1;\n", 12917 Alignment); 12918 // Ensure operator[] and operator() are comprehended 12919 verifyFormat("struct test {\n" 12920 " long long int foo();\n" 12921 " int operator[](int a);\n" 12922 " double bar();\n" 12923 "};\n", 12924 Alignment); 12925 verifyFormat("struct test {\n" 12926 " long long int foo();\n" 12927 " int operator()(int a);\n" 12928 " double bar();\n" 12929 "};\n", 12930 Alignment); 12931 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 12932 " int const i = 1;\n" 12933 " int * j = 2;\n" 12934 " int big = 10000;\n" 12935 "\n" 12936 " unsigned oneTwoThree = 123;\n" 12937 " int oneTwo = 12;\n" 12938 " method();\n" 12939 " float k = 2;\n" 12940 " int ll = 10000;\n" 12941 "}", 12942 format("void SomeFunction(int parameter= 0) {\n" 12943 " int const i= 1;\n" 12944 " int *j=2;\n" 12945 " int big = 10000;\n" 12946 "\n" 12947 "unsigned oneTwoThree =123;\n" 12948 "int oneTwo = 12;\n" 12949 " method();\n" 12950 "float k= 2;\n" 12951 "int ll=10000;\n" 12952 "}", 12953 Alignment)); 12954 Alignment.AlignConsecutiveAssignments = false; 12955 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12956 verifyFormat("#define A \\\n" 12957 " int aaaa = 12; \\\n" 12958 " float b = 23; \\\n" 12959 " const int ccc = 234; \\\n" 12960 " unsigned dddddddddd = 2345;", 12961 Alignment); 12962 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12963 verifyFormat("#define A \\\n" 12964 " int aaaa = 12; \\\n" 12965 " float b = 23; \\\n" 12966 " const int ccc = 234; \\\n" 12967 " unsigned dddddddddd = 2345;", 12968 Alignment); 12969 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12970 Alignment.ColumnLimit = 30; 12971 verifyFormat("#define A \\\n" 12972 " int aaaa = 12; \\\n" 12973 " float b = 23; \\\n" 12974 " const int ccc = 234; \\\n" 12975 " int dddddddddd = 2345;", 12976 Alignment); 12977 Alignment.ColumnLimit = 80; 12978 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12979 "k = 4, int l = 5,\n" 12980 " int m = 6) {\n" 12981 " const int j = 10;\n" 12982 " otherThing = 1;\n" 12983 "}", 12984 Alignment); 12985 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12986 " int const i = 1;\n" 12987 " int * j = 2;\n" 12988 " int big = 10000;\n" 12989 "}", 12990 Alignment); 12991 verifyFormat("class C {\n" 12992 "public:\n" 12993 " int i = 1;\n" 12994 " virtual void f() = 0;\n" 12995 "};", 12996 Alignment); 12997 verifyFormat("float i = 1;\n" 12998 "if (SomeType t = getSomething()) {\n" 12999 "}\n" 13000 "const unsigned j = 2;\n" 13001 "int big = 10000;", 13002 Alignment); 13003 verifyFormat("float j = 7;\n" 13004 "for (int k = 0; k < N; ++k) {\n" 13005 "}\n" 13006 "unsigned j = 2;\n" 13007 "int big = 10000;\n" 13008 "}", 13009 Alignment); 13010 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 13011 verifyFormat("float i = 1;\n" 13012 "LooooooooooongType loooooooooooooooooooooongVariable\n" 13013 " = someLooooooooooooooooongFunction();\n" 13014 "int j = 2;", 13015 Alignment); 13016 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 13017 verifyFormat("int i = 1;\n" 13018 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 13019 " someLooooooooooooooooongFunction();\n" 13020 "int j = 2;", 13021 Alignment); 13022 13023 Alignment.AlignConsecutiveAssignments = true; 13024 verifyFormat("auto lambda = []() {\n" 13025 " auto ii = 0;\n" 13026 " float j = 0;\n" 13027 " return 0;\n" 13028 "};\n" 13029 "int i = 0;\n" 13030 "float i2 = 0;\n" 13031 "auto v = type{\n" 13032 " i = 1, //\n" 13033 " (i = 2), //\n" 13034 " i = 3 //\n" 13035 "};", 13036 Alignment); 13037 Alignment.AlignConsecutiveAssignments = false; 13038 13039 verifyFormat( 13040 "int i = 1;\n" 13041 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 13042 " loooooooooooooooooooooongParameterB);\n" 13043 "int j = 2;", 13044 Alignment); 13045 13046 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 13047 // We expect declarations and assignments to align, as long as it doesn't 13048 // exceed the column limit, starting a new alignment sequence whenever it 13049 // happens. 13050 Alignment.AlignConsecutiveAssignments = true; 13051 Alignment.ColumnLimit = 30; 13052 verifyFormat("float ii = 1;\n" 13053 "unsigned j = 2;\n" 13054 "int someVerylongVariable = 1;\n" 13055 "AnotherLongType ll = 123456;\n" 13056 "VeryVeryLongType k = 2;\n" 13057 "int myvar = 1;", 13058 Alignment); 13059 Alignment.ColumnLimit = 80; 13060 Alignment.AlignConsecutiveAssignments = false; 13061 13062 verifyFormat( 13063 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 13064 " typename LongType, typename B>\n" 13065 "auto foo() {}\n", 13066 Alignment); 13067 verifyFormat("float a, b = 1;\n" 13068 "int c = 2;\n" 13069 "int dd = 3;\n", 13070 Alignment); 13071 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 13072 "float b[1][] = {{3.f}};\n", 13073 Alignment); 13074 Alignment.AlignConsecutiveAssignments = true; 13075 verifyFormat("float a, b = 1;\n" 13076 "int c = 2;\n" 13077 "int dd = 3;\n", 13078 Alignment); 13079 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 13080 "float b[1][] = {{3.f}};\n", 13081 Alignment); 13082 Alignment.AlignConsecutiveAssignments = false; 13083 13084 Alignment.ColumnLimit = 30; 13085 Alignment.BinPackParameters = false; 13086 verifyFormat("void foo(float a,\n" 13087 " float b,\n" 13088 " int c,\n" 13089 " uint32_t *d) {\n" 13090 " int * e = 0;\n" 13091 " float f = 0;\n" 13092 " double g = 0;\n" 13093 "}\n" 13094 "void bar(ino_t a,\n" 13095 " int b,\n" 13096 " uint32_t *c,\n" 13097 " bool d) {}\n", 13098 Alignment); 13099 Alignment.BinPackParameters = true; 13100 Alignment.ColumnLimit = 80; 13101 13102 // Bug 33507 13103 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 13104 verifyFormat( 13105 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 13106 " static const Version verVs2017;\n" 13107 " return true;\n" 13108 "});\n", 13109 Alignment); 13110 Alignment.PointerAlignment = FormatStyle::PAS_Right; 13111 13112 // See llvm.org/PR35641 13113 Alignment.AlignConsecutiveDeclarations = true; 13114 verifyFormat("int func() { //\n" 13115 " int b;\n" 13116 " unsigned c;\n" 13117 "}", 13118 Alignment); 13119 13120 // See PR37175 13121 FormatStyle Style = getMozillaStyle(); 13122 Style.AlignConsecutiveDeclarations = true; 13123 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 13124 "foo(int a);", 13125 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 13126 } 13127 13128 TEST_F(FormatTest, LinuxBraceBreaking) { 13129 FormatStyle LinuxBraceStyle = getLLVMStyle(); 13130 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 13131 verifyFormat("namespace a\n" 13132 "{\n" 13133 "class A\n" 13134 "{\n" 13135 " void f()\n" 13136 " {\n" 13137 " if (true) {\n" 13138 " a();\n" 13139 " b();\n" 13140 " } else {\n" 13141 " a();\n" 13142 " }\n" 13143 " }\n" 13144 " void g() { return; }\n" 13145 "};\n" 13146 "struct B {\n" 13147 " int x;\n" 13148 "};\n" 13149 "} // namespace a\n", 13150 LinuxBraceStyle); 13151 verifyFormat("enum X {\n" 13152 " Y = 0,\n" 13153 "}\n", 13154 LinuxBraceStyle); 13155 verifyFormat("struct S {\n" 13156 " int Type;\n" 13157 " union {\n" 13158 " int x;\n" 13159 " double y;\n" 13160 " } Value;\n" 13161 " class C\n" 13162 " {\n" 13163 " MyFavoriteType Value;\n" 13164 " } Class;\n" 13165 "}\n", 13166 LinuxBraceStyle); 13167 } 13168 13169 TEST_F(FormatTest, MozillaBraceBreaking) { 13170 FormatStyle MozillaBraceStyle = getLLVMStyle(); 13171 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 13172 MozillaBraceStyle.FixNamespaceComments = false; 13173 verifyFormat("namespace a {\n" 13174 "class A\n" 13175 "{\n" 13176 " void f()\n" 13177 " {\n" 13178 " if (true) {\n" 13179 " a();\n" 13180 " b();\n" 13181 " }\n" 13182 " }\n" 13183 " void g() { return; }\n" 13184 "};\n" 13185 "enum E\n" 13186 "{\n" 13187 " A,\n" 13188 " // foo\n" 13189 " B,\n" 13190 " C\n" 13191 "};\n" 13192 "struct B\n" 13193 "{\n" 13194 " int x;\n" 13195 "};\n" 13196 "}\n", 13197 MozillaBraceStyle); 13198 verifyFormat("struct S\n" 13199 "{\n" 13200 " int Type;\n" 13201 " union\n" 13202 " {\n" 13203 " int x;\n" 13204 " double y;\n" 13205 " } Value;\n" 13206 " class C\n" 13207 " {\n" 13208 " MyFavoriteType Value;\n" 13209 " } Class;\n" 13210 "}\n", 13211 MozillaBraceStyle); 13212 } 13213 13214 TEST_F(FormatTest, StroustrupBraceBreaking) { 13215 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 13216 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 13217 verifyFormat("namespace a {\n" 13218 "class A {\n" 13219 " void f()\n" 13220 " {\n" 13221 " if (true) {\n" 13222 " a();\n" 13223 " b();\n" 13224 " }\n" 13225 " }\n" 13226 " void g() { return; }\n" 13227 "};\n" 13228 "struct B {\n" 13229 " int x;\n" 13230 "};\n" 13231 "} // namespace a\n", 13232 StroustrupBraceStyle); 13233 13234 verifyFormat("void foo()\n" 13235 "{\n" 13236 " if (a) {\n" 13237 " a();\n" 13238 " }\n" 13239 " else {\n" 13240 " b();\n" 13241 " }\n" 13242 "}\n", 13243 StroustrupBraceStyle); 13244 13245 verifyFormat("#ifdef _DEBUG\n" 13246 "int foo(int i = 0)\n" 13247 "#else\n" 13248 "int foo(int i = 5)\n" 13249 "#endif\n" 13250 "{\n" 13251 " return i;\n" 13252 "}", 13253 StroustrupBraceStyle); 13254 13255 verifyFormat("void foo() {}\n" 13256 "void bar()\n" 13257 "#ifdef _DEBUG\n" 13258 "{\n" 13259 " foo();\n" 13260 "}\n" 13261 "#else\n" 13262 "{\n" 13263 "}\n" 13264 "#endif", 13265 StroustrupBraceStyle); 13266 13267 verifyFormat("void foobar() { int i = 5; }\n" 13268 "#ifdef _DEBUG\n" 13269 "void bar() {}\n" 13270 "#else\n" 13271 "void bar() { foobar(); }\n" 13272 "#endif", 13273 StroustrupBraceStyle); 13274 } 13275 13276 TEST_F(FormatTest, AllmanBraceBreaking) { 13277 FormatStyle AllmanBraceStyle = getLLVMStyle(); 13278 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 13279 13280 EXPECT_EQ("namespace a\n" 13281 "{\n" 13282 "void f();\n" 13283 "void g();\n" 13284 "} // namespace a\n", 13285 format("namespace a\n" 13286 "{\n" 13287 "void f();\n" 13288 "void g();\n" 13289 "}\n", 13290 AllmanBraceStyle)); 13291 13292 verifyFormat("namespace a\n" 13293 "{\n" 13294 "class A\n" 13295 "{\n" 13296 " void f()\n" 13297 " {\n" 13298 " if (true)\n" 13299 " {\n" 13300 " a();\n" 13301 " b();\n" 13302 " }\n" 13303 " }\n" 13304 " void g() { return; }\n" 13305 "};\n" 13306 "struct B\n" 13307 "{\n" 13308 " int x;\n" 13309 "};\n" 13310 "union C\n" 13311 "{\n" 13312 "};\n" 13313 "} // namespace a", 13314 AllmanBraceStyle); 13315 13316 verifyFormat("void f()\n" 13317 "{\n" 13318 " if (true)\n" 13319 " {\n" 13320 " a();\n" 13321 " }\n" 13322 " else if (false)\n" 13323 " {\n" 13324 " b();\n" 13325 " }\n" 13326 " else\n" 13327 " {\n" 13328 " c();\n" 13329 " }\n" 13330 "}\n", 13331 AllmanBraceStyle); 13332 13333 verifyFormat("void f()\n" 13334 "{\n" 13335 " for (int i = 0; i < 10; ++i)\n" 13336 " {\n" 13337 " a();\n" 13338 " }\n" 13339 " while (false)\n" 13340 " {\n" 13341 " b();\n" 13342 " }\n" 13343 " do\n" 13344 " {\n" 13345 " c();\n" 13346 " } while (false)\n" 13347 "}\n", 13348 AllmanBraceStyle); 13349 13350 verifyFormat("void f(int a)\n" 13351 "{\n" 13352 " switch (a)\n" 13353 " {\n" 13354 " case 0:\n" 13355 " break;\n" 13356 " case 1:\n" 13357 " {\n" 13358 " break;\n" 13359 " }\n" 13360 " case 2:\n" 13361 " {\n" 13362 " }\n" 13363 " break;\n" 13364 " default:\n" 13365 " break;\n" 13366 " }\n" 13367 "}\n", 13368 AllmanBraceStyle); 13369 13370 verifyFormat("enum X\n" 13371 "{\n" 13372 " Y = 0,\n" 13373 "}\n", 13374 AllmanBraceStyle); 13375 verifyFormat("enum X\n" 13376 "{\n" 13377 " Y = 0\n" 13378 "}\n", 13379 AllmanBraceStyle); 13380 13381 verifyFormat("@interface BSApplicationController ()\n" 13382 "{\n" 13383 "@private\n" 13384 " id _extraIvar;\n" 13385 "}\n" 13386 "@end\n", 13387 AllmanBraceStyle); 13388 13389 verifyFormat("#ifdef _DEBUG\n" 13390 "int foo(int i = 0)\n" 13391 "#else\n" 13392 "int foo(int i = 5)\n" 13393 "#endif\n" 13394 "{\n" 13395 " return i;\n" 13396 "}", 13397 AllmanBraceStyle); 13398 13399 verifyFormat("void foo() {}\n" 13400 "void bar()\n" 13401 "#ifdef _DEBUG\n" 13402 "{\n" 13403 " foo();\n" 13404 "}\n" 13405 "#else\n" 13406 "{\n" 13407 "}\n" 13408 "#endif", 13409 AllmanBraceStyle); 13410 13411 verifyFormat("void foobar() { int i = 5; }\n" 13412 "#ifdef _DEBUG\n" 13413 "void bar() {}\n" 13414 "#else\n" 13415 "void bar() { foobar(); }\n" 13416 "#endif", 13417 AllmanBraceStyle); 13418 13419 // This shouldn't affect ObjC blocks.. 13420 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 13421 " // ...\n" 13422 " int i;\n" 13423 "}];", 13424 AllmanBraceStyle); 13425 verifyFormat("void (^block)(void) = ^{\n" 13426 " // ...\n" 13427 " int i;\n" 13428 "};", 13429 AllmanBraceStyle); 13430 // .. or dict literals. 13431 verifyFormat("void f()\n" 13432 "{\n" 13433 " // ...\n" 13434 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 13435 "}", 13436 AllmanBraceStyle); 13437 verifyFormat("void f()\n" 13438 "{\n" 13439 " // ...\n" 13440 " [object someMethod:@{a : @\"b\"}];\n" 13441 "}", 13442 AllmanBraceStyle); 13443 verifyFormat("int f()\n" 13444 "{ // comment\n" 13445 " return 42;\n" 13446 "}", 13447 AllmanBraceStyle); 13448 13449 AllmanBraceStyle.ColumnLimit = 19; 13450 verifyFormat("void f() { int i; }", AllmanBraceStyle); 13451 AllmanBraceStyle.ColumnLimit = 18; 13452 verifyFormat("void f()\n" 13453 "{\n" 13454 " int i;\n" 13455 "}", 13456 AllmanBraceStyle); 13457 AllmanBraceStyle.ColumnLimit = 80; 13458 13459 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 13460 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 13461 FormatStyle::SIS_WithoutElse; 13462 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 13463 verifyFormat("void f(bool b)\n" 13464 "{\n" 13465 " if (b)\n" 13466 " {\n" 13467 " return;\n" 13468 " }\n" 13469 "}\n", 13470 BreakBeforeBraceShortIfs); 13471 verifyFormat("void f(bool b)\n" 13472 "{\n" 13473 " if constexpr (b)\n" 13474 " {\n" 13475 " return;\n" 13476 " }\n" 13477 "}\n", 13478 BreakBeforeBraceShortIfs); 13479 verifyFormat("void f(bool b)\n" 13480 "{\n" 13481 " if CONSTEXPR (b)\n" 13482 " {\n" 13483 " return;\n" 13484 " }\n" 13485 "}\n", 13486 BreakBeforeBraceShortIfs); 13487 verifyFormat("void f(bool b)\n" 13488 "{\n" 13489 " if (b) return;\n" 13490 "}\n", 13491 BreakBeforeBraceShortIfs); 13492 verifyFormat("void f(bool b)\n" 13493 "{\n" 13494 " if constexpr (b) return;\n" 13495 "}\n", 13496 BreakBeforeBraceShortIfs); 13497 verifyFormat("void f(bool b)\n" 13498 "{\n" 13499 " if CONSTEXPR (b) return;\n" 13500 "}\n", 13501 BreakBeforeBraceShortIfs); 13502 verifyFormat("void f(bool b)\n" 13503 "{\n" 13504 " while (b)\n" 13505 " {\n" 13506 " return;\n" 13507 " }\n" 13508 "}\n", 13509 BreakBeforeBraceShortIfs); 13510 } 13511 13512 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 13513 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 13514 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 13515 13516 // Make a few changes to the style for testing purposes 13517 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 13518 FormatStyle::SFS_Empty; 13519 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13520 WhitesmithsBraceStyle.ColumnLimit = 0; 13521 13522 // FIXME: this test case can't decide whether there should be a blank line 13523 // after the ~D() line or not. It adds one if one doesn't exist in the test 13524 // and it removes the line if one exists. 13525 /* 13526 verifyFormat("class A;\n" 13527 "namespace B\n" 13528 " {\n" 13529 "class C;\n" 13530 "// Comment\n" 13531 "class D\n" 13532 " {\n" 13533 "public:\n" 13534 " D();\n" 13535 " ~D() {}\n" 13536 "private:\n" 13537 " enum E\n" 13538 " {\n" 13539 " F\n" 13540 " }\n" 13541 " };\n" 13542 " } // namespace B\n", 13543 WhitesmithsBraceStyle); 13544 */ 13545 13546 verifyFormat("namespace a\n" 13547 " {\n" 13548 "class A\n" 13549 " {\n" 13550 " void f()\n" 13551 " {\n" 13552 " if (true)\n" 13553 " {\n" 13554 " a();\n" 13555 " b();\n" 13556 " }\n" 13557 " }\n" 13558 " void g()\n" 13559 " {\n" 13560 " return;\n" 13561 " }\n" 13562 " };\n" 13563 "struct B\n" 13564 " {\n" 13565 " int x;\n" 13566 " };\n" 13567 " } // namespace a", 13568 WhitesmithsBraceStyle); 13569 13570 verifyFormat("void f()\n" 13571 " {\n" 13572 " if (true)\n" 13573 " {\n" 13574 " a();\n" 13575 " }\n" 13576 " else if (false)\n" 13577 " {\n" 13578 " b();\n" 13579 " }\n" 13580 " else\n" 13581 " {\n" 13582 " c();\n" 13583 " }\n" 13584 " }\n", 13585 WhitesmithsBraceStyle); 13586 13587 verifyFormat("void f()\n" 13588 " {\n" 13589 " for (int i = 0; i < 10; ++i)\n" 13590 " {\n" 13591 " a();\n" 13592 " }\n" 13593 " while (false)\n" 13594 " {\n" 13595 " b();\n" 13596 " }\n" 13597 " do\n" 13598 " {\n" 13599 " c();\n" 13600 " } while (false)\n" 13601 " }\n", 13602 WhitesmithsBraceStyle); 13603 13604 WhitesmithsBraceStyle.IndentCaseBlocks = true; 13605 verifyFormat("void switchTest1(int a)\n" 13606 " {\n" 13607 " switch (a)\n" 13608 " {\n" 13609 " case 2:\n" 13610 " {\n" 13611 " }\n" 13612 " break;\n" 13613 " }\n" 13614 " }\n", 13615 WhitesmithsBraceStyle); 13616 13617 verifyFormat("void switchTest2(int a)\n" 13618 " {\n" 13619 " switch (a)\n" 13620 " {\n" 13621 " case 0:\n" 13622 " break;\n" 13623 " case 1:\n" 13624 " {\n" 13625 " break;\n" 13626 " }\n" 13627 " case 2:\n" 13628 " {\n" 13629 " }\n" 13630 " break;\n" 13631 " default:\n" 13632 " break;\n" 13633 " }\n" 13634 " }\n", 13635 WhitesmithsBraceStyle); 13636 13637 verifyFormat("void switchTest3(int a)\n" 13638 " {\n" 13639 " switch (a)\n" 13640 " {\n" 13641 " case 0:\n" 13642 " {\n" 13643 " foo(x);\n" 13644 " }\n" 13645 " break;\n" 13646 " default:\n" 13647 " {\n" 13648 " foo(1);\n" 13649 " }\n" 13650 " break;\n" 13651 " }\n" 13652 " }\n", 13653 WhitesmithsBraceStyle); 13654 13655 WhitesmithsBraceStyle.IndentCaseBlocks = false; 13656 13657 verifyFormat("void switchTest4(int a)\n" 13658 " {\n" 13659 " switch (a)\n" 13660 " {\n" 13661 " case 2:\n" 13662 " {\n" 13663 " }\n" 13664 " break;\n" 13665 " }\n" 13666 " }\n", 13667 WhitesmithsBraceStyle); 13668 13669 verifyFormat("void switchTest5(int a)\n" 13670 " {\n" 13671 " switch (a)\n" 13672 " {\n" 13673 " case 0:\n" 13674 " break;\n" 13675 " case 1:\n" 13676 " {\n" 13677 " foo();\n" 13678 " break;\n" 13679 " }\n" 13680 " case 2:\n" 13681 " {\n" 13682 " }\n" 13683 " break;\n" 13684 " default:\n" 13685 " break;\n" 13686 " }\n" 13687 " }\n", 13688 WhitesmithsBraceStyle); 13689 13690 verifyFormat("void switchTest6(int a)\n" 13691 " {\n" 13692 " switch (a)\n" 13693 " {\n" 13694 " case 0:\n" 13695 " {\n" 13696 " foo(x);\n" 13697 " }\n" 13698 " break;\n" 13699 " default:\n" 13700 " {\n" 13701 " foo(1);\n" 13702 " }\n" 13703 " break;\n" 13704 " }\n" 13705 " }\n", 13706 WhitesmithsBraceStyle); 13707 13708 verifyFormat("enum X\n" 13709 " {\n" 13710 " Y = 0, // testing\n" 13711 " }\n", 13712 WhitesmithsBraceStyle); 13713 13714 verifyFormat("enum X\n" 13715 " {\n" 13716 " Y = 0\n" 13717 " }\n", 13718 WhitesmithsBraceStyle); 13719 verifyFormat("enum X\n" 13720 " {\n" 13721 " Y = 0,\n" 13722 " Z = 1\n" 13723 " };\n", 13724 WhitesmithsBraceStyle); 13725 13726 verifyFormat("@interface BSApplicationController ()\n" 13727 " {\n" 13728 "@private\n" 13729 " id _extraIvar;\n" 13730 " }\n" 13731 "@end\n", 13732 WhitesmithsBraceStyle); 13733 13734 verifyFormat("#ifdef _DEBUG\n" 13735 "int foo(int i = 0)\n" 13736 "#else\n" 13737 "int foo(int i = 5)\n" 13738 "#endif\n" 13739 " {\n" 13740 " return i;\n" 13741 " }", 13742 WhitesmithsBraceStyle); 13743 13744 verifyFormat("void foo() {}\n" 13745 "void bar()\n" 13746 "#ifdef _DEBUG\n" 13747 " {\n" 13748 " foo();\n" 13749 " }\n" 13750 "#else\n" 13751 " {\n" 13752 " }\n" 13753 "#endif", 13754 WhitesmithsBraceStyle); 13755 13756 verifyFormat("void foobar()\n" 13757 " {\n" 13758 " int i = 5;\n" 13759 " }\n" 13760 "#ifdef _DEBUG\n" 13761 "void bar()\n" 13762 " {\n" 13763 " }\n" 13764 "#else\n" 13765 "void bar()\n" 13766 " {\n" 13767 " foobar();\n" 13768 " }\n" 13769 "#endif", 13770 WhitesmithsBraceStyle); 13771 13772 // This shouldn't affect ObjC blocks.. 13773 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 13774 " // ...\n" 13775 " int i;\n" 13776 "}];", 13777 WhitesmithsBraceStyle); 13778 verifyFormat("void (^block)(void) = ^{\n" 13779 " // ...\n" 13780 " int i;\n" 13781 "};", 13782 WhitesmithsBraceStyle); 13783 // .. or dict literals. 13784 verifyFormat("void f()\n" 13785 " {\n" 13786 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 13787 " }", 13788 WhitesmithsBraceStyle); 13789 13790 verifyFormat("int f()\n" 13791 " { // comment\n" 13792 " return 42;\n" 13793 " }", 13794 WhitesmithsBraceStyle); 13795 13796 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 13797 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 13798 FormatStyle::SIS_Always; 13799 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 13800 verifyFormat("void f(bool b)\n" 13801 " {\n" 13802 " if (b)\n" 13803 " {\n" 13804 " return;\n" 13805 " }\n" 13806 " }\n", 13807 BreakBeforeBraceShortIfs); 13808 verifyFormat("void f(bool b)\n" 13809 " {\n" 13810 " if (b) return;\n" 13811 " }\n", 13812 BreakBeforeBraceShortIfs); 13813 verifyFormat("void f(bool b)\n" 13814 " {\n" 13815 " while (b)\n" 13816 " {\n" 13817 " return;\n" 13818 " }\n" 13819 " }\n", 13820 BreakBeforeBraceShortIfs); 13821 } 13822 13823 TEST_F(FormatTest, GNUBraceBreaking) { 13824 FormatStyle GNUBraceStyle = getLLVMStyle(); 13825 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 13826 verifyFormat("namespace a\n" 13827 "{\n" 13828 "class A\n" 13829 "{\n" 13830 " void f()\n" 13831 " {\n" 13832 " int a;\n" 13833 " {\n" 13834 " int b;\n" 13835 " }\n" 13836 " if (true)\n" 13837 " {\n" 13838 " a();\n" 13839 " b();\n" 13840 " }\n" 13841 " }\n" 13842 " void g() { return; }\n" 13843 "}\n" 13844 "} // namespace a", 13845 GNUBraceStyle); 13846 13847 verifyFormat("void f()\n" 13848 "{\n" 13849 " if (true)\n" 13850 " {\n" 13851 " a();\n" 13852 " }\n" 13853 " else if (false)\n" 13854 " {\n" 13855 " b();\n" 13856 " }\n" 13857 " else\n" 13858 " {\n" 13859 " c();\n" 13860 " }\n" 13861 "}\n", 13862 GNUBraceStyle); 13863 13864 verifyFormat("void f()\n" 13865 "{\n" 13866 " for (int i = 0; i < 10; ++i)\n" 13867 " {\n" 13868 " a();\n" 13869 " }\n" 13870 " while (false)\n" 13871 " {\n" 13872 " b();\n" 13873 " }\n" 13874 " do\n" 13875 " {\n" 13876 " c();\n" 13877 " }\n" 13878 " while (false);\n" 13879 "}\n", 13880 GNUBraceStyle); 13881 13882 verifyFormat("void f(int a)\n" 13883 "{\n" 13884 " switch (a)\n" 13885 " {\n" 13886 " case 0:\n" 13887 " break;\n" 13888 " case 1:\n" 13889 " {\n" 13890 " break;\n" 13891 " }\n" 13892 " case 2:\n" 13893 " {\n" 13894 " }\n" 13895 " break;\n" 13896 " default:\n" 13897 " break;\n" 13898 " }\n" 13899 "}\n", 13900 GNUBraceStyle); 13901 13902 verifyFormat("enum X\n" 13903 "{\n" 13904 " Y = 0,\n" 13905 "}\n", 13906 GNUBraceStyle); 13907 13908 verifyFormat("@interface BSApplicationController ()\n" 13909 "{\n" 13910 "@private\n" 13911 " id _extraIvar;\n" 13912 "}\n" 13913 "@end\n", 13914 GNUBraceStyle); 13915 13916 verifyFormat("#ifdef _DEBUG\n" 13917 "int foo(int i = 0)\n" 13918 "#else\n" 13919 "int foo(int i = 5)\n" 13920 "#endif\n" 13921 "{\n" 13922 " return i;\n" 13923 "}", 13924 GNUBraceStyle); 13925 13926 verifyFormat("void foo() {}\n" 13927 "void bar()\n" 13928 "#ifdef _DEBUG\n" 13929 "{\n" 13930 " foo();\n" 13931 "}\n" 13932 "#else\n" 13933 "{\n" 13934 "}\n" 13935 "#endif", 13936 GNUBraceStyle); 13937 13938 verifyFormat("void foobar() { int i = 5; }\n" 13939 "#ifdef _DEBUG\n" 13940 "void bar() {}\n" 13941 "#else\n" 13942 "void bar() { foobar(); }\n" 13943 "#endif", 13944 GNUBraceStyle); 13945 } 13946 13947 TEST_F(FormatTest, WebKitBraceBreaking) { 13948 FormatStyle WebKitBraceStyle = getLLVMStyle(); 13949 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 13950 WebKitBraceStyle.FixNamespaceComments = false; 13951 verifyFormat("namespace a {\n" 13952 "class A {\n" 13953 " void f()\n" 13954 " {\n" 13955 " if (true) {\n" 13956 " a();\n" 13957 " b();\n" 13958 " }\n" 13959 " }\n" 13960 " void g() { return; }\n" 13961 "};\n" 13962 "enum E {\n" 13963 " A,\n" 13964 " // foo\n" 13965 " B,\n" 13966 " C\n" 13967 "};\n" 13968 "struct B {\n" 13969 " int x;\n" 13970 "};\n" 13971 "}\n", 13972 WebKitBraceStyle); 13973 verifyFormat("struct S {\n" 13974 " int Type;\n" 13975 " union {\n" 13976 " int x;\n" 13977 " double y;\n" 13978 " } Value;\n" 13979 " class C {\n" 13980 " MyFavoriteType Value;\n" 13981 " } Class;\n" 13982 "};\n", 13983 WebKitBraceStyle); 13984 } 13985 13986 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 13987 verifyFormat("void f() {\n" 13988 " try {\n" 13989 " } catch (const Exception &e) {\n" 13990 " }\n" 13991 "}\n", 13992 getLLVMStyle()); 13993 } 13994 13995 TEST_F(FormatTest, UnderstandsPragmas) { 13996 verifyFormat("#pragma omp reduction(| : var)"); 13997 verifyFormat("#pragma omp reduction(+ : var)"); 13998 13999 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 14000 "(including parentheses).", 14001 format("#pragma mark Any non-hyphenated or hyphenated string " 14002 "(including parentheses).")); 14003 } 14004 14005 TEST_F(FormatTest, UnderstandPragmaOption) { 14006 verifyFormat("#pragma option -C -A"); 14007 14008 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 14009 } 14010 14011 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 14012 FormatStyle Style = getLLVMStyle(); 14013 Style.ColumnLimit = 20; 14014 14015 // See PR41213 14016 EXPECT_EQ("/*\n" 14017 " *\t9012345\n" 14018 " * /8901\n" 14019 " */", 14020 format("/*\n" 14021 " *\t9012345 /8901\n" 14022 " */", 14023 Style)); 14024 EXPECT_EQ("/*\n" 14025 " *345678\n" 14026 " *\t/8901\n" 14027 " */", 14028 format("/*\n" 14029 " *345678\t/8901\n" 14030 " */", 14031 Style)); 14032 14033 verifyFormat("int a; // the\n" 14034 " // comment", 14035 Style); 14036 EXPECT_EQ("int a; /* first line\n" 14037 " * second\n" 14038 " * line third\n" 14039 " * line\n" 14040 " */", 14041 format("int a; /* first line\n" 14042 " * second\n" 14043 " * line third\n" 14044 " * line\n" 14045 " */", 14046 Style)); 14047 EXPECT_EQ("int a; // first line\n" 14048 " // second\n" 14049 " // line third\n" 14050 " // line", 14051 format("int a; // first line\n" 14052 " // second line\n" 14053 " // third line", 14054 Style)); 14055 14056 Style.PenaltyExcessCharacter = 90; 14057 verifyFormat("int a; // the comment", Style); 14058 EXPECT_EQ("int a; // the comment\n" 14059 " // aaa", 14060 format("int a; // the comment aaa", Style)); 14061 EXPECT_EQ("int a; /* first line\n" 14062 " * second line\n" 14063 " * third line\n" 14064 " */", 14065 format("int a; /* first line\n" 14066 " * second line\n" 14067 " * third line\n" 14068 " */", 14069 Style)); 14070 EXPECT_EQ("int a; // first line\n" 14071 " // second line\n" 14072 " // third line", 14073 format("int a; // first line\n" 14074 " // second line\n" 14075 " // third line", 14076 Style)); 14077 // FIXME: Investigate why this is not getting the same layout as the test 14078 // above. 14079 EXPECT_EQ("int a; /* first line\n" 14080 " * second line\n" 14081 " * third line\n" 14082 " */", 14083 format("int a; /* first line second line third line" 14084 "\n*/", 14085 Style)); 14086 14087 EXPECT_EQ("// foo bar baz bazfoo\n" 14088 "// foo bar foo bar\n", 14089 format("// foo bar baz bazfoo\n" 14090 "// foo bar foo bar\n", 14091 Style)); 14092 EXPECT_EQ("// foo bar baz bazfoo\n" 14093 "// foo bar foo bar\n", 14094 format("// foo bar baz bazfoo\n" 14095 "// foo bar foo bar\n", 14096 Style)); 14097 14098 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 14099 // next one. 14100 EXPECT_EQ("// foo bar baz bazfoo\n" 14101 "// bar foo bar\n", 14102 format("// foo bar baz bazfoo bar\n" 14103 "// foo bar\n", 14104 Style)); 14105 14106 EXPECT_EQ("// foo bar baz bazfoo\n" 14107 "// foo bar baz bazfoo\n" 14108 "// bar foo bar\n", 14109 format("// foo bar baz bazfoo\n" 14110 "// foo bar baz bazfoo bar\n" 14111 "// foo bar\n", 14112 Style)); 14113 14114 EXPECT_EQ("// foo bar baz bazfoo\n" 14115 "// foo bar baz bazfoo\n" 14116 "// bar foo bar\n", 14117 format("// foo bar baz bazfoo\n" 14118 "// foo bar baz bazfoo bar\n" 14119 "// foo bar\n", 14120 Style)); 14121 14122 // Make sure we do not keep protruding characters if strict mode reflow is 14123 // cheaper than keeping protruding characters. 14124 Style.ColumnLimit = 21; 14125 EXPECT_EQ( 14126 "// foo foo foo foo\n" 14127 "// foo foo foo foo\n" 14128 "// foo foo foo foo\n", 14129 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 14130 14131 EXPECT_EQ("int a = /* long block\n" 14132 " comment */\n" 14133 " 42;", 14134 format("int a = /* long block comment */ 42;", Style)); 14135 } 14136 14137 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 14138 for (size_t i = 1; i < Styles.size(); ++i) \ 14139 EXPECT_EQ(Styles[0], Styles[i]) \ 14140 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 14141 14142 TEST_F(FormatTest, GetsPredefinedStyleByName) { 14143 SmallVector<FormatStyle, 3> Styles; 14144 Styles.resize(3); 14145 14146 Styles[0] = getLLVMStyle(); 14147 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 14148 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 14149 EXPECT_ALL_STYLES_EQUAL(Styles); 14150 14151 Styles[0] = getGoogleStyle(); 14152 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 14153 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 14154 EXPECT_ALL_STYLES_EQUAL(Styles); 14155 14156 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 14157 EXPECT_TRUE( 14158 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 14159 EXPECT_TRUE( 14160 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 14161 EXPECT_ALL_STYLES_EQUAL(Styles); 14162 14163 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 14164 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 14165 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 14166 EXPECT_ALL_STYLES_EQUAL(Styles); 14167 14168 Styles[0] = getMozillaStyle(); 14169 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 14170 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 14171 EXPECT_ALL_STYLES_EQUAL(Styles); 14172 14173 Styles[0] = getWebKitStyle(); 14174 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 14175 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 14176 EXPECT_ALL_STYLES_EQUAL(Styles); 14177 14178 Styles[0] = getGNUStyle(); 14179 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 14180 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 14181 EXPECT_ALL_STYLES_EQUAL(Styles); 14182 14183 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 14184 } 14185 14186 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 14187 SmallVector<FormatStyle, 8> Styles; 14188 Styles.resize(2); 14189 14190 Styles[0] = getGoogleStyle(); 14191 Styles[1] = getLLVMStyle(); 14192 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 14193 EXPECT_ALL_STYLES_EQUAL(Styles); 14194 14195 Styles.resize(5); 14196 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 14197 Styles[1] = getLLVMStyle(); 14198 Styles[1].Language = FormatStyle::LK_JavaScript; 14199 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 14200 14201 Styles[2] = getLLVMStyle(); 14202 Styles[2].Language = FormatStyle::LK_JavaScript; 14203 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 14204 "BasedOnStyle: Google", 14205 &Styles[2]) 14206 .value()); 14207 14208 Styles[3] = getLLVMStyle(); 14209 Styles[3].Language = FormatStyle::LK_JavaScript; 14210 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 14211 "Language: JavaScript", 14212 &Styles[3]) 14213 .value()); 14214 14215 Styles[4] = getLLVMStyle(); 14216 Styles[4].Language = FormatStyle::LK_JavaScript; 14217 EXPECT_EQ(0, parseConfiguration("---\n" 14218 "BasedOnStyle: LLVM\n" 14219 "IndentWidth: 123\n" 14220 "---\n" 14221 "BasedOnStyle: Google\n" 14222 "Language: JavaScript", 14223 &Styles[4]) 14224 .value()); 14225 EXPECT_ALL_STYLES_EQUAL(Styles); 14226 } 14227 14228 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 14229 Style.FIELD = false; \ 14230 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 14231 EXPECT_TRUE(Style.FIELD); \ 14232 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 14233 EXPECT_FALSE(Style.FIELD); 14234 14235 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 14236 14237 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 14238 Style.STRUCT.FIELD = false; \ 14239 EXPECT_EQ(0, \ 14240 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 14241 .value()); \ 14242 EXPECT_TRUE(Style.STRUCT.FIELD); \ 14243 EXPECT_EQ(0, \ 14244 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 14245 .value()); \ 14246 EXPECT_FALSE(Style.STRUCT.FIELD); 14247 14248 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 14249 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 14250 14251 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 14252 EXPECT_NE(VALUE, Style.FIELD) << "Initial value already the same!"; \ 14253 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 14254 EXPECT_EQ(VALUE, Style.FIELD) << "Unexpected value after parsing!" 14255 14256 TEST_F(FormatTest, ParsesConfigurationBools) { 14257 FormatStyle Style = {}; 14258 Style.Language = FormatStyle::LK_Cpp; 14259 CHECK_PARSE_BOOL(AlignTrailingComments); 14260 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 14261 CHECK_PARSE_BOOL(AlignConsecutiveBitFields); 14262 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 14263 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 14264 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 14265 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 14266 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 14267 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 14268 CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine); 14269 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 14270 CHECK_PARSE_BOOL(BinPackArguments); 14271 CHECK_PARSE_BOOL(BinPackParameters); 14272 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 14273 CHECK_PARSE_BOOL(BreakBeforeConceptDeclarations); 14274 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 14275 CHECK_PARSE_BOOL(BreakStringLiterals); 14276 CHECK_PARSE_BOOL(CompactNamespaces); 14277 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 14278 CHECK_PARSE_BOOL(DeriveLineEnding); 14279 CHECK_PARSE_BOOL(DerivePointerAlignment); 14280 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 14281 CHECK_PARSE_BOOL(DisableFormat); 14282 CHECK_PARSE_BOOL(IndentCaseLabels); 14283 CHECK_PARSE_BOOL(IndentCaseBlocks); 14284 CHECK_PARSE_BOOL(IndentGotoLabels); 14285 CHECK_PARSE_BOOL(IndentPragmas); 14286 CHECK_PARSE_BOOL(IndentRequires); 14287 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 14288 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 14289 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 14290 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 14291 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 14292 CHECK_PARSE_BOOL(ReflowComments); 14293 CHECK_PARSE_BOOL(SortIncludes); 14294 CHECK_PARSE_BOOL(SortUsingDeclarations); 14295 CHECK_PARSE_BOOL(SpacesInParentheses); 14296 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 14297 CHECK_PARSE_BOOL(SpacesInAngles); 14298 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 14299 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 14300 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 14301 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 14302 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 14303 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 14304 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 14305 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 14306 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 14307 CHECK_PARSE_BOOL(SpaceBeforeCaseColon); 14308 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 14309 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 14310 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 14311 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 14312 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 14313 CHECK_PARSE_BOOL(UseCRLF); 14314 14315 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 14316 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 14317 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 14318 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 14319 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 14320 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 14321 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 14322 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 14323 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 14324 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 14325 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 14326 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody); 14327 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile); 14328 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 14329 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 14330 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 14331 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 14332 } 14333 14334 #undef CHECK_PARSE_BOOL 14335 14336 TEST_F(FormatTest, ParsesConfiguration) { 14337 FormatStyle Style = {}; 14338 Style.Language = FormatStyle::LK_Cpp; 14339 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 14340 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 14341 ConstructorInitializerIndentWidth, 1234u); 14342 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 14343 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 14344 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 14345 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 14346 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 14347 PenaltyBreakBeforeFirstCallParameter, 1234u); 14348 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 14349 PenaltyBreakTemplateDeclaration, 1234u); 14350 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 14351 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 14352 PenaltyReturnTypeOnItsOwnLine, 1234u); 14353 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 14354 SpacesBeforeTrailingComments, 1234u); 14355 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 14356 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 14357 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 14358 14359 Style.PointerAlignment = FormatStyle::PAS_Middle; 14360 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 14361 FormatStyle::PAS_Left); 14362 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 14363 FormatStyle::PAS_Right); 14364 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 14365 FormatStyle::PAS_Middle); 14366 // For backward compatibility: 14367 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 14368 FormatStyle::PAS_Left); 14369 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 14370 FormatStyle::PAS_Right); 14371 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 14372 FormatStyle::PAS_Middle); 14373 14374 Style.Standard = FormatStyle::LS_Auto; 14375 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 14376 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 14377 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 14378 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 14379 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 14380 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 14381 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 14382 // Legacy aliases: 14383 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 14384 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 14385 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 14386 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 14387 14388 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 14389 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 14390 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 14391 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 14392 FormatStyle::BOS_None); 14393 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 14394 FormatStyle::BOS_All); 14395 // For backward compatibility: 14396 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 14397 FormatStyle::BOS_None); 14398 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 14399 FormatStyle::BOS_All); 14400 14401 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 14402 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 14403 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 14404 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 14405 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 14406 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 14407 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 14408 // For backward compatibility: 14409 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 14410 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 14411 14412 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 14413 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 14414 FormatStyle::BILS_BeforeComma); 14415 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 14416 FormatStyle::BILS_AfterColon); 14417 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 14418 FormatStyle::BILS_BeforeColon); 14419 // For backward compatibility: 14420 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 14421 FormatStyle::BILS_BeforeComma); 14422 14423 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 14424 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 14425 FormatStyle::BAS_Align); 14426 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 14427 FormatStyle::BAS_DontAlign); 14428 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 14429 FormatStyle::BAS_AlwaysBreak); 14430 // For backward compatibility: 14431 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 14432 FormatStyle::BAS_DontAlign); 14433 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 14434 FormatStyle::BAS_Align); 14435 14436 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 14437 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 14438 FormatStyle::ENAS_DontAlign); 14439 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 14440 FormatStyle::ENAS_Left); 14441 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 14442 FormatStyle::ENAS_Right); 14443 // For backward compatibility: 14444 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 14445 FormatStyle::ENAS_Left); 14446 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 14447 FormatStyle::ENAS_Right); 14448 14449 Style.AlignOperands = FormatStyle::OAS_Align; 14450 CHECK_PARSE("AlignOperands: DontAlign", AlignOperands, 14451 FormatStyle::OAS_DontAlign); 14452 CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align); 14453 CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands, 14454 FormatStyle::OAS_AlignAfterOperator); 14455 // For backward compatibility: 14456 CHECK_PARSE("AlignOperands: false", AlignOperands, 14457 FormatStyle::OAS_DontAlign); 14458 CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align); 14459 14460 Style.UseTab = FormatStyle::UT_ForIndentation; 14461 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 14462 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 14463 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 14464 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 14465 FormatStyle::UT_ForContinuationAndIndentation); 14466 CHECK_PARSE("UseTab: AlignWithSpaces", UseTab, 14467 FormatStyle::UT_AlignWithSpaces); 14468 // For backward compatibility: 14469 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 14470 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 14471 14472 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 14473 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 14474 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 14475 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 14476 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 14477 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 14478 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 14479 // For backward compatibility: 14480 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 14481 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 14482 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 14483 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 14484 14485 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 14486 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 14487 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 14488 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 14489 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 14490 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 14491 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 14492 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 14493 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 14494 // For backward compatibility: 14495 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 14496 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 14497 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 14498 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 14499 14500 Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Both; 14501 CHECK_PARSE("SpaceAroundPointerQualifiers: Default", 14502 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Default); 14503 CHECK_PARSE("SpaceAroundPointerQualifiers: Before", 14504 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Before); 14505 CHECK_PARSE("SpaceAroundPointerQualifiers: After", 14506 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_After); 14507 CHECK_PARSE("SpaceAroundPointerQualifiers: Both", 14508 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both); 14509 14510 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 14511 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 14512 FormatStyle::SBPO_Never); 14513 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 14514 FormatStyle::SBPO_Always); 14515 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 14516 FormatStyle::SBPO_ControlStatements); 14517 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 14518 FormatStyle::SBPO_NonEmptyParentheses); 14519 // For backward compatibility: 14520 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 14521 FormatStyle::SBPO_Never); 14522 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 14523 FormatStyle::SBPO_ControlStatements); 14524 14525 Style.ColumnLimit = 123; 14526 FormatStyle BaseStyle = getLLVMStyle(); 14527 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 14528 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 14529 14530 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 14531 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 14532 FormatStyle::BS_Attach); 14533 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 14534 FormatStyle::BS_Linux); 14535 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 14536 FormatStyle::BS_Mozilla); 14537 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 14538 FormatStyle::BS_Stroustrup); 14539 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 14540 FormatStyle::BS_Allman); 14541 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 14542 FormatStyle::BS_Whitesmiths); 14543 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 14544 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 14545 FormatStyle::BS_WebKit); 14546 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 14547 FormatStyle::BS_Custom); 14548 14549 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 14550 CHECK_PARSE("BraceWrapping:\n" 14551 " AfterControlStatement: MultiLine", 14552 BraceWrapping.AfterControlStatement, 14553 FormatStyle::BWACS_MultiLine); 14554 CHECK_PARSE("BraceWrapping:\n" 14555 " AfterControlStatement: Always", 14556 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 14557 CHECK_PARSE("BraceWrapping:\n" 14558 " AfterControlStatement: Never", 14559 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 14560 // For backward compatibility: 14561 CHECK_PARSE("BraceWrapping:\n" 14562 " AfterControlStatement: true", 14563 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 14564 CHECK_PARSE("BraceWrapping:\n" 14565 " AfterControlStatement: false", 14566 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 14567 14568 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 14569 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 14570 FormatStyle::RTBS_None); 14571 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 14572 FormatStyle::RTBS_All); 14573 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 14574 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 14575 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 14576 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 14577 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 14578 AlwaysBreakAfterReturnType, 14579 FormatStyle::RTBS_TopLevelDefinitions); 14580 14581 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 14582 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 14583 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 14584 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 14585 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 14586 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 14587 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 14588 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 14589 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 14590 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 14591 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 14592 14593 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 14594 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 14595 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 14596 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 14597 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 14598 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 14599 AlwaysBreakAfterDefinitionReturnType, 14600 FormatStyle::DRTBS_TopLevel); 14601 14602 Style.NamespaceIndentation = FormatStyle::NI_All; 14603 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 14604 FormatStyle::NI_None); 14605 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 14606 FormatStyle::NI_Inner); 14607 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 14608 FormatStyle::NI_All); 14609 14610 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 14611 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 14612 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 14613 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 14614 AllowShortIfStatementsOnASingleLine, 14615 FormatStyle::SIS_WithoutElse); 14616 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 14617 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 14618 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 14619 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 14620 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 14621 AllowShortIfStatementsOnASingleLine, 14622 FormatStyle::SIS_WithoutElse); 14623 14624 Style.IndentExternBlock = FormatStyle::IEBS_NoIndent; 14625 CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock, 14626 FormatStyle::IEBS_AfterExternBlock); 14627 CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock, 14628 FormatStyle::IEBS_Indent); 14629 CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock, 14630 FormatStyle::IEBS_NoIndent); 14631 CHECK_PARSE("IndentExternBlock: true", IndentExternBlock, 14632 FormatStyle::IEBS_Indent); 14633 CHECK_PARSE("IndentExternBlock: false", IndentExternBlock, 14634 FormatStyle::IEBS_NoIndent); 14635 14636 Style.BitFieldColonSpacing = FormatStyle::BFCS_None; 14637 CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing, 14638 FormatStyle::BFCS_Both); 14639 CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing, 14640 FormatStyle::BFCS_None); 14641 CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing, 14642 FormatStyle::BFCS_Before); 14643 CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing, 14644 FormatStyle::BFCS_After); 14645 14646 Style.SortJavaStaticImport = FormatStyle::SJSIO_Before; 14647 CHECK_PARSE("SortJavaStaticImport: After", SortJavaStaticImport, 14648 FormatStyle::SJSIO_After); 14649 CHECK_PARSE("SortJavaStaticImport: Before", SortJavaStaticImport, 14650 FormatStyle::SJSIO_Before); 14651 14652 // FIXME: This is required because parsing a configuration simply overwrites 14653 // the first N elements of the list instead of resetting it. 14654 Style.ForEachMacros.clear(); 14655 std::vector<std::string> BoostForeach; 14656 BoostForeach.push_back("BOOST_FOREACH"); 14657 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 14658 std::vector<std::string> BoostAndQForeach; 14659 BoostAndQForeach.push_back("BOOST_FOREACH"); 14660 BoostAndQForeach.push_back("Q_FOREACH"); 14661 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 14662 BoostAndQForeach); 14663 14664 Style.AttributeMacros.clear(); 14665 CHECK_PARSE("BasedOnStyle: LLVM", AttributeMacros, 14666 std::vector<std::string>{"__capability"}); 14667 CHECK_PARSE("AttributeMacros: [attr1, attr2]", AttributeMacros, 14668 std::vector<std::string>({"attr1", "attr2"})); 14669 14670 Style.StatementMacros.clear(); 14671 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 14672 std::vector<std::string>{"QUNUSED"}); 14673 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 14674 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 14675 14676 Style.NamespaceMacros.clear(); 14677 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 14678 std::vector<std::string>{"TESTSUITE"}); 14679 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 14680 std::vector<std::string>({"TESTSUITE", "SUITE"})); 14681 14682 Style.WhitespaceSensitiveMacros.clear(); 14683 CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]", 14684 WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"}); 14685 CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]", 14686 WhitespaceSensitiveMacros, 14687 std::vector<std::string>({"STRINGIZE", "ASSERT"})); 14688 Style.WhitespaceSensitiveMacros.clear(); 14689 CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']", 14690 WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"}); 14691 CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']", 14692 WhitespaceSensitiveMacros, 14693 std::vector<std::string>({"STRINGIZE", "ASSERT"})); 14694 14695 Style.IncludeStyle.IncludeCategories.clear(); 14696 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 14697 {"abc/.*", 2, 0, false}, {".*", 1, 0, true}}; 14698 CHECK_PARSE("IncludeCategories:\n" 14699 " - Regex: abc/.*\n" 14700 " Priority: 2\n" 14701 " - Regex: .*\n" 14702 " Priority: 1\n" 14703 " CaseSensitive: true\n", 14704 IncludeStyle.IncludeCategories, ExpectedCategories); 14705 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 14706 "abc$"); 14707 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 14708 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 14709 14710 Style.RawStringFormats.clear(); 14711 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 14712 { 14713 FormatStyle::LK_TextProto, 14714 {"pb", "proto"}, 14715 {"PARSE_TEXT_PROTO"}, 14716 /*CanonicalDelimiter=*/"", 14717 "llvm", 14718 }, 14719 { 14720 FormatStyle::LK_Cpp, 14721 {"cc", "cpp"}, 14722 {"C_CODEBLOCK", "CPPEVAL"}, 14723 /*CanonicalDelimiter=*/"cc", 14724 /*BasedOnStyle=*/"", 14725 }, 14726 }; 14727 14728 CHECK_PARSE("RawStringFormats:\n" 14729 " - Language: TextProto\n" 14730 " Delimiters:\n" 14731 " - 'pb'\n" 14732 " - 'proto'\n" 14733 " EnclosingFunctions:\n" 14734 " - 'PARSE_TEXT_PROTO'\n" 14735 " BasedOnStyle: llvm\n" 14736 " - Language: Cpp\n" 14737 " Delimiters:\n" 14738 " - 'cc'\n" 14739 " - 'cpp'\n" 14740 " EnclosingFunctions:\n" 14741 " - 'C_CODEBLOCK'\n" 14742 " - 'CPPEVAL'\n" 14743 " CanonicalDelimiter: 'cc'", 14744 RawStringFormats, ExpectedRawStringFormats); 14745 } 14746 14747 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 14748 FormatStyle Style = {}; 14749 Style.Language = FormatStyle::LK_Cpp; 14750 CHECK_PARSE("Language: Cpp\n" 14751 "IndentWidth: 12", 14752 IndentWidth, 12u); 14753 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 14754 "IndentWidth: 34", 14755 &Style), 14756 ParseError::Unsuitable); 14757 FormatStyle BinPackedTCS = {}; 14758 BinPackedTCS.Language = FormatStyle::LK_JavaScript; 14759 EXPECT_EQ(parseConfiguration("BinPackArguments: true\n" 14760 "InsertTrailingCommas: Wrapped", 14761 &BinPackedTCS), 14762 ParseError::BinPackTrailingCommaConflict); 14763 EXPECT_EQ(12u, Style.IndentWidth); 14764 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 14765 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14766 14767 Style.Language = FormatStyle::LK_JavaScript; 14768 CHECK_PARSE("Language: JavaScript\n" 14769 "IndentWidth: 12", 14770 IndentWidth, 12u); 14771 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 14772 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 14773 "IndentWidth: 34", 14774 &Style), 14775 ParseError::Unsuitable); 14776 EXPECT_EQ(23u, Style.IndentWidth); 14777 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 14778 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14779 14780 CHECK_PARSE("BasedOnStyle: LLVM\n" 14781 "IndentWidth: 67", 14782 IndentWidth, 67u); 14783 14784 CHECK_PARSE("---\n" 14785 "Language: JavaScript\n" 14786 "IndentWidth: 12\n" 14787 "---\n" 14788 "Language: Cpp\n" 14789 "IndentWidth: 34\n" 14790 "...\n", 14791 IndentWidth, 12u); 14792 14793 Style.Language = FormatStyle::LK_Cpp; 14794 CHECK_PARSE("---\n" 14795 "Language: JavaScript\n" 14796 "IndentWidth: 12\n" 14797 "---\n" 14798 "Language: Cpp\n" 14799 "IndentWidth: 34\n" 14800 "...\n", 14801 IndentWidth, 34u); 14802 CHECK_PARSE("---\n" 14803 "IndentWidth: 78\n" 14804 "---\n" 14805 "Language: JavaScript\n" 14806 "IndentWidth: 56\n" 14807 "...\n", 14808 IndentWidth, 78u); 14809 14810 Style.ColumnLimit = 123; 14811 Style.IndentWidth = 234; 14812 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 14813 Style.TabWidth = 345; 14814 EXPECT_FALSE(parseConfiguration("---\n" 14815 "IndentWidth: 456\n" 14816 "BreakBeforeBraces: Allman\n" 14817 "---\n" 14818 "Language: JavaScript\n" 14819 "IndentWidth: 111\n" 14820 "TabWidth: 111\n" 14821 "---\n" 14822 "Language: Cpp\n" 14823 "BreakBeforeBraces: Stroustrup\n" 14824 "TabWidth: 789\n" 14825 "...\n", 14826 &Style)); 14827 EXPECT_EQ(123u, Style.ColumnLimit); 14828 EXPECT_EQ(456u, Style.IndentWidth); 14829 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 14830 EXPECT_EQ(789u, Style.TabWidth); 14831 14832 EXPECT_EQ(parseConfiguration("---\n" 14833 "Language: JavaScript\n" 14834 "IndentWidth: 56\n" 14835 "---\n" 14836 "IndentWidth: 78\n" 14837 "...\n", 14838 &Style), 14839 ParseError::Error); 14840 EXPECT_EQ(parseConfiguration("---\n" 14841 "Language: JavaScript\n" 14842 "IndentWidth: 56\n" 14843 "---\n" 14844 "Language: JavaScript\n" 14845 "IndentWidth: 78\n" 14846 "...\n", 14847 &Style), 14848 ParseError::Error); 14849 14850 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14851 } 14852 14853 #undef CHECK_PARSE 14854 14855 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 14856 FormatStyle Style = {}; 14857 Style.Language = FormatStyle::LK_JavaScript; 14858 Style.BreakBeforeTernaryOperators = true; 14859 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 14860 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14861 14862 Style.BreakBeforeTernaryOperators = true; 14863 EXPECT_EQ(0, parseConfiguration("---\n" 14864 "BasedOnStyle: Google\n" 14865 "---\n" 14866 "Language: JavaScript\n" 14867 "IndentWidth: 76\n" 14868 "...\n", 14869 &Style) 14870 .value()); 14871 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14872 EXPECT_EQ(76u, Style.IndentWidth); 14873 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14874 } 14875 14876 TEST_F(FormatTest, ConfigurationRoundTripTest) { 14877 FormatStyle Style = getLLVMStyle(); 14878 std::string YAML = configurationAsText(Style); 14879 FormatStyle ParsedStyle = {}; 14880 ParsedStyle.Language = FormatStyle::LK_Cpp; 14881 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 14882 EXPECT_EQ(Style, ParsedStyle); 14883 } 14884 14885 TEST_F(FormatTest, WorksFor8bitEncodings) { 14886 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 14887 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 14888 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 14889 "\"\xef\xee\xf0\xf3...\"", 14890 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 14891 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 14892 "\xef\xee\xf0\xf3...\"", 14893 getLLVMStyleWithColumns(12))); 14894 } 14895 14896 TEST_F(FormatTest, HandlesUTF8BOM) { 14897 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 14898 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 14899 format("\xef\xbb\xbf#include <iostream>")); 14900 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 14901 format("\xef\xbb\xbf\n#include <iostream>")); 14902 } 14903 14904 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 14905 #if !defined(_MSC_VER) 14906 14907 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 14908 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 14909 getLLVMStyleWithColumns(35)); 14910 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 14911 getLLVMStyleWithColumns(31)); 14912 verifyFormat("// Однажды в студёную зимнюю пору...", 14913 getLLVMStyleWithColumns(36)); 14914 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 14915 verifyFormat("/* Однажды в студёную зимнюю пору... */", 14916 getLLVMStyleWithColumns(39)); 14917 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 14918 getLLVMStyleWithColumns(35)); 14919 } 14920 14921 TEST_F(FormatTest, SplitsUTF8Strings) { 14922 // Non-printable characters' width is currently considered to be the length in 14923 // bytes in UTF8. The characters can be displayed in very different manner 14924 // (zero-width, single width with a substitution glyph, expanded to their code 14925 // (e.g. "<8d>"), so there's no single correct way to handle them. 14926 EXPECT_EQ("\"aaaaÄ\"\n" 14927 "\"\xc2\x8d\";", 14928 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14929 EXPECT_EQ("\"aaaaaaaÄ\"\n" 14930 "\"\xc2\x8d\";", 14931 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14932 EXPECT_EQ("\"Однажды, в \"\n" 14933 "\"студёную \"\n" 14934 "\"зимнюю \"\n" 14935 "\"пору,\"", 14936 format("\"Однажды, в студёную зимнюю пору,\"", 14937 getLLVMStyleWithColumns(13))); 14938 EXPECT_EQ( 14939 "\"一 二 三 \"\n" 14940 "\"四 五六 \"\n" 14941 "\"七 八 九 \"\n" 14942 "\"十\"", 14943 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 14944 EXPECT_EQ("\"一\t\"\n" 14945 "\"二 \t\"\n" 14946 "\"三 四 \"\n" 14947 "\"五\t\"\n" 14948 "\"六 \t\"\n" 14949 "\"七 \"\n" 14950 "\"八九十\tqq\"", 14951 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 14952 getLLVMStyleWithColumns(11))); 14953 14954 // UTF8 character in an escape sequence. 14955 EXPECT_EQ("\"aaaaaa\"\n" 14956 "\"\\\xC2\x8D\"", 14957 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 14958 } 14959 14960 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 14961 EXPECT_EQ("const char *sssss =\n" 14962 " \"一二三四五六七八\\\n" 14963 " 九 十\";", 14964 format("const char *sssss = \"一二三四五六七八\\\n" 14965 " 九 十\";", 14966 getLLVMStyleWithColumns(30))); 14967 } 14968 14969 TEST_F(FormatTest, SplitsUTF8LineComments) { 14970 EXPECT_EQ("// aaaaÄ\xc2\x8d", 14971 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 14972 EXPECT_EQ("// Я из лесу\n" 14973 "// вышел; был\n" 14974 "// сильный\n" 14975 "// мороз.", 14976 format("// Я из лесу вышел; был сильный мороз.", 14977 getLLVMStyleWithColumns(13))); 14978 EXPECT_EQ("// 一二三\n" 14979 "// 四五六七\n" 14980 "// 八 九\n" 14981 "// 十", 14982 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 14983 } 14984 14985 TEST_F(FormatTest, SplitsUTF8BlockComments) { 14986 EXPECT_EQ("/* Гляжу,\n" 14987 " * поднимается\n" 14988 " * медленно в\n" 14989 " * гору\n" 14990 " * Лошадка,\n" 14991 " * везущая\n" 14992 " * хворосту\n" 14993 " * воз. */", 14994 format("/* Гляжу, поднимается медленно в гору\n" 14995 " * Лошадка, везущая хворосту воз. */", 14996 getLLVMStyleWithColumns(13))); 14997 EXPECT_EQ( 14998 "/* 一二三\n" 14999 " * 四五六七\n" 15000 " * 八 九\n" 15001 " * 十 */", 15002 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 15003 EXPECT_EQ("/* \n" 15004 " * \n" 15005 " * - */", 15006 format("/* - */", getLLVMStyleWithColumns(12))); 15007 } 15008 15009 #endif // _MSC_VER 15010 15011 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 15012 FormatStyle Style = getLLVMStyle(); 15013 15014 Style.ConstructorInitializerIndentWidth = 4; 15015 verifyFormat( 15016 "SomeClass::Constructor()\n" 15017 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 15018 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 15019 Style); 15020 15021 Style.ConstructorInitializerIndentWidth = 2; 15022 verifyFormat( 15023 "SomeClass::Constructor()\n" 15024 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 15025 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 15026 Style); 15027 15028 Style.ConstructorInitializerIndentWidth = 0; 15029 verifyFormat( 15030 "SomeClass::Constructor()\n" 15031 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 15032 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 15033 Style); 15034 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 15035 verifyFormat( 15036 "SomeLongTemplateVariableName<\n" 15037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 15038 Style); 15039 verifyFormat("bool smaller = 1 < " 15040 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 15041 " " 15042 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 15043 Style); 15044 15045 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 15046 verifyFormat("SomeClass::Constructor() :\n" 15047 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 15048 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 15049 Style); 15050 } 15051 15052 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 15053 FormatStyle Style = getLLVMStyle(); 15054 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 15055 Style.ConstructorInitializerIndentWidth = 4; 15056 verifyFormat("SomeClass::Constructor()\n" 15057 " : a(a)\n" 15058 " , b(b)\n" 15059 " , c(c) {}", 15060 Style); 15061 verifyFormat("SomeClass::Constructor()\n" 15062 " : a(a) {}", 15063 Style); 15064 15065 Style.ColumnLimit = 0; 15066 verifyFormat("SomeClass::Constructor()\n" 15067 " : a(a) {}", 15068 Style); 15069 verifyFormat("SomeClass::Constructor() noexcept\n" 15070 " : a(a) {}", 15071 Style); 15072 verifyFormat("SomeClass::Constructor()\n" 15073 " : a(a)\n" 15074 " , b(b)\n" 15075 " , c(c) {}", 15076 Style); 15077 verifyFormat("SomeClass::Constructor()\n" 15078 " : a(a) {\n" 15079 " foo();\n" 15080 " bar();\n" 15081 "}", 15082 Style); 15083 15084 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 15085 verifyFormat("SomeClass::Constructor()\n" 15086 " : a(a)\n" 15087 " , b(b)\n" 15088 " , c(c) {\n}", 15089 Style); 15090 verifyFormat("SomeClass::Constructor()\n" 15091 " : a(a) {\n}", 15092 Style); 15093 15094 Style.ColumnLimit = 80; 15095 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 15096 Style.ConstructorInitializerIndentWidth = 2; 15097 verifyFormat("SomeClass::Constructor()\n" 15098 " : a(a)\n" 15099 " , b(b)\n" 15100 " , c(c) {}", 15101 Style); 15102 15103 Style.ConstructorInitializerIndentWidth = 0; 15104 verifyFormat("SomeClass::Constructor()\n" 15105 ": a(a)\n" 15106 ", b(b)\n" 15107 ", c(c) {}", 15108 Style); 15109 15110 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 15111 Style.ConstructorInitializerIndentWidth = 4; 15112 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 15113 verifyFormat( 15114 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 15115 Style); 15116 verifyFormat( 15117 "SomeClass::Constructor()\n" 15118 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 15119 Style); 15120 Style.ConstructorInitializerIndentWidth = 4; 15121 Style.ColumnLimit = 60; 15122 verifyFormat("SomeClass::Constructor()\n" 15123 " : aaaaaaaa(aaaaaaaa)\n" 15124 " , aaaaaaaa(aaaaaaaa)\n" 15125 " , aaaaaaaa(aaaaaaaa) {}", 15126 Style); 15127 } 15128 15129 TEST_F(FormatTest, Destructors) { 15130 verifyFormat("void F(int &i) { i.~int(); }"); 15131 verifyFormat("void F(int &i) { i->~int(); }"); 15132 } 15133 15134 TEST_F(FormatTest, FormatsWithWebKitStyle) { 15135 FormatStyle Style = getWebKitStyle(); 15136 15137 // Don't indent in outer namespaces. 15138 verifyFormat("namespace outer {\n" 15139 "int i;\n" 15140 "namespace inner {\n" 15141 " int i;\n" 15142 "} // namespace inner\n" 15143 "} // namespace outer\n" 15144 "namespace other_outer {\n" 15145 "int i;\n" 15146 "}", 15147 Style); 15148 15149 // Don't indent case labels. 15150 verifyFormat("switch (variable) {\n" 15151 "case 1:\n" 15152 "case 2:\n" 15153 " doSomething();\n" 15154 " break;\n" 15155 "default:\n" 15156 " ++variable;\n" 15157 "}", 15158 Style); 15159 15160 // Wrap before binary operators. 15161 EXPECT_EQ("void f()\n" 15162 "{\n" 15163 " if (aaaaaaaaaaaaaaaa\n" 15164 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 15165 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 15166 " return;\n" 15167 "}", 15168 format("void f() {\n" 15169 "if (aaaaaaaaaaaaaaaa\n" 15170 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 15171 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 15172 "return;\n" 15173 "}", 15174 Style)); 15175 15176 // Allow functions on a single line. 15177 verifyFormat("void f() { return; }", Style); 15178 15179 // Allow empty blocks on a single line and insert a space in empty blocks. 15180 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 15181 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 15182 // However, don't merge non-empty short loops. 15183 EXPECT_EQ("while (true) {\n" 15184 " continue;\n" 15185 "}", 15186 format("while (true) { continue; }", Style)); 15187 15188 // Constructor initializers are formatted one per line with the "," on the 15189 // new line. 15190 verifyFormat("Constructor()\n" 15191 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 15192 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 15193 " aaaaaaaaaaaaaa)\n" 15194 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 15195 "{\n" 15196 "}", 15197 Style); 15198 verifyFormat("SomeClass::Constructor()\n" 15199 " : a(a)\n" 15200 "{\n" 15201 "}", 15202 Style); 15203 EXPECT_EQ("SomeClass::Constructor()\n" 15204 " : a(a)\n" 15205 "{\n" 15206 "}", 15207 format("SomeClass::Constructor():a(a){}", Style)); 15208 verifyFormat("SomeClass::Constructor()\n" 15209 " : a(a)\n" 15210 " , b(b)\n" 15211 " , c(c)\n" 15212 "{\n" 15213 "}", 15214 Style); 15215 verifyFormat("SomeClass::Constructor()\n" 15216 " : a(a)\n" 15217 "{\n" 15218 " foo();\n" 15219 " bar();\n" 15220 "}", 15221 Style); 15222 15223 // Access specifiers should be aligned left. 15224 verifyFormat("class C {\n" 15225 "public:\n" 15226 " int i;\n" 15227 "};", 15228 Style); 15229 15230 // Do not align comments. 15231 verifyFormat("int a; // Do not\n" 15232 "double b; // align comments.", 15233 Style); 15234 15235 // Do not align operands. 15236 EXPECT_EQ("ASSERT(aaaa\n" 15237 " || bbbb);", 15238 format("ASSERT ( aaaa\n||bbbb);", Style)); 15239 15240 // Accept input's line breaks. 15241 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 15242 " || bbbbbbbbbbbbbbb) {\n" 15243 " i++;\n" 15244 "}", 15245 format("if (aaaaaaaaaaaaaaa\n" 15246 "|| bbbbbbbbbbbbbbb) { i++; }", 15247 Style)); 15248 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 15249 " i++;\n" 15250 "}", 15251 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 15252 15253 // Don't automatically break all macro definitions (llvm.org/PR17842). 15254 verifyFormat("#define aNumber 10", Style); 15255 // However, generally keep the line breaks that the user authored. 15256 EXPECT_EQ("#define aNumber \\\n" 15257 " 10", 15258 format("#define aNumber \\\n" 15259 " 10", 15260 Style)); 15261 15262 // Keep empty and one-element array literals on a single line. 15263 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 15264 " copyItems:YES];", 15265 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 15266 "copyItems:YES];", 15267 Style)); 15268 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 15269 " copyItems:YES];", 15270 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 15271 " copyItems:YES];", 15272 Style)); 15273 // FIXME: This does not seem right, there should be more indentation before 15274 // the array literal's entries. Nested blocks have the same problem. 15275 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 15276 " @\"a\",\n" 15277 " @\"a\"\n" 15278 "]\n" 15279 " copyItems:YES];", 15280 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 15281 " @\"a\",\n" 15282 " @\"a\"\n" 15283 " ]\n" 15284 " copyItems:YES];", 15285 Style)); 15286 EXPECT_EQ( 15287 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 15288 " copyItems:YES];", 15289 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 15290 " copyItems:YES];", 15291 Style)); 15292 15293 verifyFormat("[self.a b:c c:d];", Style); 15294 EXPECT_EQ("[self.a b:c\n" 15295 " c:d];", 15296 format("[self.a b:c\n" 15297 "c:d];", 15298 Style)); 15299 } 15300 15301 TEST_F(FormatTest, FormatsLambdas) { 15302 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 15303 verifyFormat( 15304 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 15305 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 15306 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 15307 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 15308 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 15309 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 15310 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 15311 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 15312 verifyFormat("int x = f(*+[] {});"); 15313 verifyFormat("void f() {\n" 15314 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 15315 "}\n"); 15316 verifyFormat("void f() {\n" 15317 " other(x.begin(), //\n" 15318 " x.end(), //\n" 15319 " [&](int, int) { return 1; });\n" 15320 "}\n"); 15321 verifyFormat("void f() {\n" 15322 " other.other.other.other.other(\n" 15323 " x.begin(), x.end(),\n" 15324 " [something, rather](int, int, int, int, int, int, int) { " 15325 "return 1; });\n" 15326 "}\n"); 15327 verifyFormat( 15328 "void f() {\n" 15329 " other.other.other.other.other(\n" 15330 " x.begin(), x.end(),\n" 15331 " [something, rather](int, int, int, int, int, int, int) {\n" 15332 " //\n" 15333 " });\n" 15334 "}\n"); 15335 verifyFormat("SomeFunction([]() { // A cool function...\n" 15336 " return 43;\n" 15337 "});"); 15338 EXPECT_EQ("SomeFunction([]() {\n" 15339 "#define A a\n" 15340 " return 43;\n" 15341 "});", 15342 format("SomeFunction([](){\n" 15343 "#define A a\n" 15344 "return 43;\n" 15345 "});")); 15346 verifyFormat("void f() {\n" 15347 " SomeFunction([](decltype(x), A *a) {});\n" 15348 " SomeFunction([](typeof(x), A *a) {});\n" 15349 " SomeFunction([](_Atomic(x), A *a) {});\n" 15350 " SomeFunction([](__underlying_type(x), A *a) {});\n" 15351 "}"); 15352 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15353 " [](const aaaaaaaaaa &a) { return a; });"); 15354 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 15355 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 15356 "});"); 15357 verifyFormat("Constructor()\n" 15358 " : Field([] { // comment\n" 15359 " int i;\n" 15360 " }) {}"); 15361 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 15362 " return some_parameter.size();\n" 15363 "};"); 15364 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 15365 " [](const string &s) { return s; };"); 15366 verifyFormat("int i = aaaaaa ? 1 //\n" 15367 " : [] {\n" 15368 " return 2; //\n" 15369 " }();"); 15370 verifyFormat("llvm::errs() << \"number of twos is \"\n" 15371 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 15372 " return x == 2; // force break\n" 15373 " });"); 15374 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15375 " [=](int iiiiiiiiiiii) {\n" 15376 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 15377 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 15378 " });", 15379 getLLVMStyleWithColumns(60)); 15380 verifyFormat("SomeFunction({[&] {\n" 15381 " // comment\n" 15382 " },\n" 15383 " [&] {\n" 15384 " // comment\n" 15385 " }});"); 15386 verifyFormat("SomeFunction({[&] {\n" 15387 " // comment\n" 15388 "}});"); 15389 verifyFormat( 15390 "virtual aaaaaaaaaaaaaaaa(\n" 15391 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 15392 " aaaaa aaaaaaaaa);"); 15393 15394 // Lambdas with return types. 15395 verifyFormat("int c = []() -> int { return 2; }();\n"); 15396 verifyFormat("int c = []() -> int * { return 2; }();\n"); 15397 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 15398 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 15399 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 15400 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 15401 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 15402 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 15403 verifyFormat("[a, a]() -> a<1> {};"); 15404 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 15405 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 15406 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 15407 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 15408 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 15409 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 15410 verifyFormat("[]() -> foo<!5> { return {}; };"); 15411 verifyFormat("[]() -> foo<~5> { return {}; };"); 15412 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 15413 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 15414 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 15415 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 15416 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 15417 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 15418 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 15419 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 15420 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 15421 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 15422 verifyFormat("namespace bar {\n" 15423 "// broken:\n" 15424 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 15425 "} // namespace bar"); 15426 verifyFormat("namespace bar {\n" 15427 "// broken:\n" 15428 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 15429 "} // namespace bar"); 15430 verifyFormat("namespace bar {\n" 15431 "// broken:\n" 15432 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 15433 "} // namespace bar"); 15434 verifyFormat("namespace bar {\n" 15435 "// broken:\n" 15436 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 15437 "} // namespace bar"); 15438 verifyFormat("namespace bar {\n" 15439 "// broken:\n" 15440 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 15441 "} // namespace bar"); 15442 verifyFormat("namespace bar {\n" 15443 "// broken:\n" 15444 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 15445 "} // namespace bar"); 15446 verifyFormat("namespace bar {\n" 15447 "// broken:\n" 15448 "auto foo{[]() -> foo<!5> { return {}; }};\n" 15449 "} // namespace bar"); 15450 verifyFormat("namespace bar {\n" 15451 "// broken:\n" 15452 "auto foo{[]() -> foo<~5> { return {}; }};\n" 15453 "} // namespace bar"); 15454 verifyFormat("namespace bar {\n" 15455 "// broken:\n" 15456 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 15457 "} // namespace bar"); 15458 verifyFormat("namespace bar {\n" 15459 "// broken:\n" 15460 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 15461 "} // namespace bar"); 15462 verifyFormat("namespace bar {\n" 15463 "// broken:\n" 15464 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 15465 "} // namespace bar"); 15466 verifyFormat("namespace bar {\n" 15467 "// broken:\n" 15468 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 15469 "} // namespace bar"); 15470 verifyFormat("namespace bar {\n" 15471 "// broken:\n" 15472 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 15473 "} // namespace bar"); 15474 verifyFormat("namespace bar {\n" 15475 "// broken:\n" 15476 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 15477 "} // namespace bar"); 15478 verifyFormat("namespace bar {\n" 15479 "// broken:\n" 15480 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 15481 "} // namespace bar"); 15482 verifyFormat("namespace bar {\n" 15483 "// broken:\n" 15484 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 15485 "} // namespace bar"); 15486 verifyFormat("namespace bar {\n" 15487 "// broken:\n" 15488 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 15489 "} // namespace bar"); 15490 verifyFormat("namespace bar {\n" 15491 "// broken:\n" 15492 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 15493 "} // namespace bar"); 15494 verifyFormat("[]() -> a<1> {};"); 15495 verifyFormat("[]() -> a<1> { ; };"); 15496 verifyFormat("[]() -> a<1> { ; }();"); 15497 verifyFormat("[a, a]() -> a<true> {};"); 15498 verifyFormat("[]() -> a<true> {};"); 15499 verifyFormat("[]() -> a<true> { ; };"); 15500 verifyFormat("[]() -> a<true> { ; }();"); 15501 verifyFormat("[a, a]() -> a<false> {};"); 15502 verifyFormat("[]() -> a<false> {};"); 15503 verifyFormat("[]() -> a<false> { ; };"); 15504 verifyFormat("[]() -> a<false> { ; }();"); 15505 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 15506 verifyFormat("namespace bar {\n" 15507 "auto foo{[]() -> foo<false> { ; }};\n" 15508 "} // namespace bar"); 15509 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 15510 " int j) -> int {\n" 15511 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 15512 "};"); 15513 verifyFormat( 15514 "aaaaaaaaaaaaaaaaaaaaaa(\n" 15515 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 15516 " return aaaaaaaaaaaaaaaaa;\n" 15517 " });", 15518 getLLVMStyleWithColumns(70)); 15519 verifyFormat("[]() //\n" 15520 " -> int {\n" 15521 " return 1; //\n" 15522 "};"); 15523 verifyFormat("[]() -> Void<T...> {};"); 15524 verifyFormat("[a, b]() -> Tuple<T...> { return {}; };"); 15525 15526 // Lambdas with explicit template argument lists. 15527 verifyFormat( 15528 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 15529 15530 // Multiple lambdas in the same parentheses change indentation rules. These 15531 // lambdas are forced to start on new lines. 15532 verifyFormat("SomeFunction(\n" 15533 " []() {\n" 15534 " //\n" 15535 " },\n" 15536 " []() {\n" 15537 " //\n" 15538 " });"); 15539 15540 // A lambda passed as arg0 is always pushed to the next line. 15541 verifyFormat("SomeFunction(\n" 15542 " [this] {\n" 15543 " //\n" 15544 " },\n" 15545 " 1);\n"); 15546 15547 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 15548 // the arg0 case above. 15549 auto Style = getGoogleStyle(); 15550 Style.BinPackArguments = false; 15551 verifyFormat("SomeFunction(\n" 15552 " a,\n" 15553 " [this] {\n" 15554 " //\n" 15555 " },\n" 15556 " b);\n", 15557 Style); 15558 verifyFormat("SomeFunction(\n" 15559 " a,\n" 15560 " [this] {\n" 15561 " //\n" 15562 " },\n" 15563 " b);\n"); 15564 15565 // A lambda with a very long line forces arg0 to be pushed out irrespective of 15566 // the BinPackArguments value (as long as the code is wide enough). 15567 verifyFormat( 15568 "something->SomeFunction(\n" 15569 " a,\n" 15570 " [this] {\n" 15571 " " 15572 "D0000000000000000000000000000000000000000000000000000000000001();\n" 15573 " },\n" 15574 " b);\n"); 15575 15576 // A multi-line lambda is pulled up as long as the introducer fits on the 15577 // previous line and there are no further args. 15578 verifyFormat("function(1, [this, that] {\n" 15579 " //\n" 15580 "});\n"); 15581 verifyFormat("function([this, that] {\n" 15582 " //\n" 15583 "});\n"); 15584 // FIXME: this format is not ideal and we should consider forcing the first 15585 // arg onto its own line. 15586 verifyFormat("function(a, b, c, //\n" 15587 " d, [this, that] {\n" 15588 " //\n" 15589 " });\n"); 15590 15591 // Multiple lambdas are treated correctly even when there is a short arg0. 15592 verifyFormat("SomeFunction(\n" 15593 " 1,\n" 15594 " [this] {\n" 15595 " //\n" 15596 " },\n" 15597 " [this] {\n" 15598 " //\n" 15599 " },\n" 15600 " 1);\n"); 15601 15602 // More complex introducers. 15603 verifyFormat("return [i, args...] {};"); 15604 15605 // Not lambdas. 15606 verifyFormat("constexpr char hello[]{\"hello\"};"); 15607 verifyFormat("double &operator[](int i) { return 0; }\n" 15608 "int i;"); 15609 verifyFormat("std::unique_ptr<int[]> foo() {}"); 15610 verifyFormat("int i = a[a][a]->f();"); 15611 verifyFormat("int i = (*b)[a]->f();"); 15612 15613 // Other corner cases. 15614 verifyFormat("void f() {\n" 15615 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 15616 " );\n" 15617 "}"); 15618 15619 // Lambdas created through weird macros. 15620 verifyFormat("void f() {\n" 15621 " MACRO((const AA &a) { return 1; });\n" 15622 " MACRO((AA &a) { return 1; });\n" 15623 "}"); 15624 15625 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 15626 " doo_dah();\n" 15627 " doo_dah();\n" 15628 " })) {\n" 15629 "}"); 15630 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 15631 " doo_dah();\n" 15632 " doo_dah();\n" 15633 " })) {\n" 15634 "}"); 15635 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 15636 " doo_dah();\n" 15637 " doo_dah();\n" 15638 " })) {\n" 15639 "}"); 15640 verifyFormat("auto lambda = []() {\n" 15641 " int a = 2\n" 15642 "#if A\n" 15643 " + 2\n" 15644 "#endif\n" 15645 " ;\n" 15646 "};"); 15647 15648 // Lambdas with complex multiline introducers. 15649 verifyFormat( 15650 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15651 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 15652 " -> ::std::unordered_set<\n" 15653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 15654 " //\n" 15655 " });"); 15656 15657 FormatStyle DoNotMerge = getLLVMStyle(); 15658 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 15659 verifyFormat("auto c = []() {\n" 15660 " return b;\n" 15661 "};", 15662 "auto c = []() { return b; };", DoNotMerge); 15663 verifyFormat("auto c = []() {\n" 15664 "};", 15665 " auto c = []() {};", DoNotMerge); 15666 15667 FormatStyle MergeEmptyOnly = getLLVMStyle(); 15668 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 15669 verifyFormat("auto c = []() {\n" 15670 " return b;\n" 15671 "};", 15672 "auto c = []() {\n" 15673 " return b;\n" 15674 " };", 15675 MergeEmptyOnly); 15676 verifyFormat("auto c = []() {};", 15677 "auto c = []() {\n" 15678 "};", 15679 MergeEmptyOnly); 15680 15681 FormatStyle MergeInline = getLLVMStyle(); 15682 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 15683 verifyFormat("auto c = []() {\n" 15684 " return b;\n" 15685 "};", 15686 "auto c = []() { return b; };", MergeInline); 15687 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 15688 MergeInline); 15689 verifyFormat("function([]() { return b; }, a)", 15690 "function([]() { return b; }, a)", MergeInline); 15691 verifyFormat("function(a, []() { return b; })", 15692 "function(a, []() { return b; })", MergeInline); 15693 15694 // Check option "BraceWrapping.BeforeLambdaBody" and different state of 15695 // AllowShortLambdasOnASingleLine 15696 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15697 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15698 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15699 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15700 FormatStyle::ShortLambdaStyle::SLS_None; 15701 verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n" 15702 " []()\n" 15703 " {\n" 15704 " return 17;\n" 15705 " });", 15706 LLVMWithBeforeLambdaBody); 15707 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n" 15708 " []()\n" 15709 " {\n" 15710 " });", 15711 LLVMWithBeforeLambdaBody); 15712 verifyFormat("auto fct_SLS_None = []()\n" 15713 "{\n" 15714 " return 17;\n" 15715 "};", 15716 LLVMWithBeforeLambdaBody); 15717 verifyFormat("TwoNestedLambdas_SLS_None(\n" 15718 " []()\n" 15719 " {\n" 15720 " return Call(\n" 15721 " []()\n" 15722 " {\n" 15723 " return 17;\n" 15724 " });\n" 15725 " });", 15726 LLVMWithBeforeLambdaBody); 15727 verifyFormat("void Fct()\n" 15728 "{\n" 15729 " return {[]()\n" 15730 " {\n" 15731 " return 17;\n" 15732 " }};\n" 15733 "}", 15734 LLVMWithBeforeLambdaBody); 15735 15736 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15737 FormatStyle::ShortLambdaStyle::SLS_Empty; 15738 verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" 15739 " []()\n" 15740 " {\n" 15741 " return 17;\n" 15742 " });", 15743 LLVMWithBeforeLambdaBody); 15744 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});", 15745 LLVMWithBeforeLambdaBody); 15746 verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL" 15747 "ongFunctionName_SLS_Empty(\n" 15748 " []() {});", 15749 LLVMWithBeforeLambdaBody); 15750 verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n" 15751 " []()\n" 15752 " {\n" 15753 " return 17;\n" 15754 " });", 15755 LLVMWithBeforeLambdaBody); 15756 verifyFormat("auto fct_SLS_Empty = []()\n" 15757 "{\n" 15758 " return 17;\n" 15759 "};", 15760 LLVMWithBeforeLambdaBody); 15761 verifyFormat("TwoNestedLambdas_SLS_Empty(\n" 15762 " []()\n" 15763 " {\n" 15764 " return Call([]() {});\n" 15765 " });", 15766 LLVMWithBeforeLambdaBody); 15767 verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n" 15768 " []()\n" 15769 " {\n" 15770 " return Call([]() {});\n" 15771 " });", 15772 LLVMWithBeforeLambdaBody); 15773 verifyFormat( 15774 "FctWithLongLineInLambda_SLS_Empty(\n" 15775 " []()\n" 15776 " {\n" 15777 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15778 " AndShouldNotBeConsiderAsInline,\n" 15779 " LambdaBodyMustBeBreak);\n" 15780 " });", 15781 LLVMWithBeforeLambdaBody); 15782 15783 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15784 FormatStyle::ShortLambdaStyle::SLS_Inline; 15785 verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });", 15786 LLVMWithBeforeLambdaBody); 15787 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});", 15788 LLVMWithBeforeLambdaBody); 15789 verifyFormat("auto fct_SLS_Inline = []()\n" 15790 "{\n" 15791 " return 17;\n" 15792 "};", 15793 LLVMWithBeforeLambdaBody); 15794 verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return " 15795 "17; }); });", 15796 LLVMWithBeforeLambdaBody); 15797 verifyFormat( 15798 "FctWithLongLineInLambda_SLS_Inline(\n" 15799 " []()\n" 15800 " {\n" 15801 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15802 " AndShouldNotBeConsiderAsInline,\n" 15803 " LambdaBodyMustBeBreak);\n" 15804 " });", 15805 LLVMWithBeforeLambdaBody); 15806 verifyFormat("FctWithMultipleParams_SLS_Inline(" 15807 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15808 " []() { return 17; });", 15809 LLVMWithBeforeLambdaBody); 15810 verifyFormat( 15811 "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });", 15812 LLVMWithBeforeLambdaBody); 15813 15814 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15815 FormatStyle::ShortLambdaStyle::SLS_All; 15816 verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });", 15817 LLVMWithBeforeLambdaBody); 15818 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});", 15819 LLVMWithBeforeLambdaBody); 15820 verifyFormat("auto fct_SLS_All = []() { return 17; };", 15821 LLVMWithBeforeLambdaBody); 15822 verifyFormat("FctWithOneParam_SLS_All(\n" 15823 " []()\n" 15824 " {\n" 15825 " // A cool function...\n" 15826 " return 43;\n" 15827 " });", 15828 LLVMWithBeforeLambdaBody); 15829 verifyFormat("FctWithMultipleParams_SLS_All(" 15830 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15831 " []() { return 17; });", 15832 LLVMWithBeforeLambdaBody); 15833 verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });", 15834 LLVMWithBeforeLambdaBody); 15835 verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });", 15836 LLVMWithBeforeLambdaBody); 15837 verifyFormat( 15838 "FctWithLongLineInLambda_SLS_All(\n" 15839 " []()\n" 15840 " {\n" 15841 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15842 " AndShouldNotBeConsiderAsInline,\n" 15843 " LambdaBodyMustBeBreak);\n" 15844 " });", 15845 LLVMWithBeforeLambdaBody); 15846 verifyFormat( 15847 "auto fct_SLS_All = []()\n" 15848 "{\n" 15849 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15850 " AndShouldNotBeConsiderAsInline,\n" 15851 " LambdaBodyMustBeBreak);\n" 15852 "};", 15853 LLVMWithBeforeLambdaBody); 15854 LLVMWithBeforeLambdaBody.BinPackParameters = false; 15855 verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);", 15856 LLVMWithBeforeLambdaBody); 15857 verifyFormat( 15858 "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n" 15859 " FirstParam,\n" 15860 " SecondParam,\n" 15861 " ThirdParam,\n" 15862 " FourthParam);", 15863 LLVMWithBeforeLambdaBody); 15864 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15865 " []() { return " 15866 "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n" 15867 " FirstParam,\n" 15868 " SecondParam,\n" 15869 " ThirdParam,\n" 15870 " FourthParam);", 15871 LLVMWithBeforeLambdaBody); 15872 verifyFormat( 15873 "FctWithLongLineInLambda_SLS_All(FirstParam,\n" 15874 " SecondParam,\n" 15875 " ThirdParam,\n" 15876 " FourthParam,\n" 15877 " []() { return SomeValueNotSoLong; });", 15878 LLVMWithBeforeLambdaBody); 15879 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15880 " []()\n" 15881 " {\n" 15882 " return " 15883 "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB" 15884 "eConsiderAsInline;\n" 15885 " });", 15886 LLVMWithBeforeLambdaBody); 15887 verifyFormat( 15888 "FctWithLongLineInLambda_SLS_All(\n" 15889 " []()\n" 15890 " {\n" 15891 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15892 " AndShouldNotBeConsiderAsInline,\n" 15893 " LambdaBodyMustBeBreak);\n" 15894 " });", 15895 LLVMWithBeforeLambdaBody); 15896 verifyFormat("FctWithTwoParams_SLS_All(\n" 15897 " []()\n" 15898 " {\n" 15899 " // A cool function...\n" 15900 " return 43;\n" 15901 " },\n" 15902 " 87);", 15903 LLVMWithBeforeLambdaBody); 15904 verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);", 15905 LLVMWithBeforeLambdaBody); 15906 verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });", 15907 LLVMWithBeforeLambdaBody); 15908 verifyFormat( 15909 "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });", 15910 LLVMWithBeforeLambdaBody); 15911 verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; " 15912 "}); }, x);", 15913 LLVMWithBeforeLambdaBody); 15914 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15915 " []()\n" 15916 " {\n" 15917 " // A cool function...\n" 15918 " return Call([]() { return 17; });\n" 15919 " });", 15920 LLVMWithBeforeLambdaBody); 15921 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15922 " []()\n" 15923 " {\n" 15924 " return Call(\n" 15925 " []()\n" 15926 " {\n" 15927 " // A cool function...\n" 15928 " return 17;\n" 15929 " });\n" 15930 " });", 15931 LLVMWithBeforeLambdaBody); 15932 } 15933 15934 TEST_F(FormatTest, LambdaWithLineComments) { 15935 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15936 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15937 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15938 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15939 FormatStyle::ShortLambdaStyle::SLS_All; 15940 15941 verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody); 15942 verifyFormat("auto k = []() // comment\n" 15943 "{ return; }", 15944 LLVMWithBeforeLambdaBody); 15945 verifyFormat("auto k = []() /* comment */ { return; }", 15946 LLVMWithBeforeLambdaBody); 15947 verifyFormat("auto k = []() /* comment */ /* comment */ { return; }", 15948 LLVMWithBeforeLambdaBody); 15949 verifyFormat("auto k = []() // X\n" 15950 "{ return; }", 15951 LLVMWithBeforeLambdaBody); 15952 verifyFormat( 15953 "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" 15954 "{ return; }", 15955 LLVMWithBeforeLambdaBody); 15956 } 15957 15958 TEST_F(FormatTest, EmptyLinesInLambdas) { 15959 verifyFormat("auto lambda = []() {\n" 15960 " x(); //\n" 15961 "};", 15962 "auto lambda = []() {\n" 15963 "\n" 15964 " x(); //\n" 15965 "\n" 15966 "};"); 15967 } 15968 15969 TEST_F(FormatTest, FormatsBlocks) { 15970 FormatStyle ShortBlocks = getLLVMStyle(); 15971 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15972 verifyFormat("int (^Block)(int, int);", ShortBlocks); 15973 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 15974 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 15975 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 15976 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 15977 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 15978 15979 verifyFormat("foo(^{ bar(); });", ShortBlocks); 15980 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 15981 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 15982 15983 verifyFormat("[operation setCompletionBlock:^{\n" 15984 " [self onOperationDone];\n" 15985 "}];"); 15986 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 15987 " [self onOperationDone];\n" 15988 "}]};"); 15989 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 15990 " f();\n" 15991 "}];"); 15992 verifyFormat("int a = [operation block:^int(int *i) {\n" 15993 " return 1;\n" 15994 "}];"); 15995 verifyFormat("[myObject doSomethingWith:arg1\n" 15996 " aaa:^int(int *a) {\n" 15997 " return 1;\n" 15998 " }\n" 15999 " bbb:f(a * bbbbbbbb)];"); 16000 16001 verifyFormat("[operation setCompletionBlock:^{\n" 16002 " [self.delegate newDataAvailable];\n" 16003 "}];", 16004 getLLVMStyleWithColumns(60)); 16005 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 16006 " NSString *path = [self sessionFilePath];\n" 16007 " if (path) {\n" 16008 " // ...\n" 16009 " }\n" 16010 "});"); 16011 verifyFormat("[[SessionService sharedService]\n" 16012 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 16013 " if (window) {\n" 16014 " [self windowDidLoad:window];\n" 16015 " } else {\n" 16016 " [self errorLoadingWindow];\n" 16017 " }\n" 16018 " }];"); 16019 verifyFormat("void (^largeBlock)(void) = ^{\n" 16020 " // ...\n" 16021 "};\n", 16022 getLLVMStyleWithColumns(40)); 16023 verifyFormat("[[SessionService sharedService]\n" 16024 " loadWindowWithCompletionBlock: //\n" 16025 " ^(SessionWindow *window) {\n" 16026 " if (window) {\n" 16027 " [self windowDidLoad:window];\n" 16028 " } else {\n" 16029 " [self errorLoadingWindow];\n" 16030 " }\n" 16031 " }];", 16032 getLLVMStyleWithColumns(60)); 16033 verifyFormat("[myObject doSomethingWith:arg1\n" 16034 " firstBlock:^(Foo *a) {\n" 16035 " // ...\n" 16036 " int i;\n" 16037 " }\n" 16038 " secondBlock:^(Bar *b) {\n" 16039 " // ...\n" 16040 " int i;\n" 16041 " }\n" 16042 " thirdBlock:^Foo(Bar *b) {\n" 16043 " // ...\n" 16044 " int i;\n" 16045 " }];"); 16046 verifyFormat("[myObject doSomethingWith:arg1\n" 16047 " firstBlock:-1\n" 16048 " secondBlock:^(Bar *b) {\n" 16049 " // ...\n" 16050 " int i;\n" 16051 " }];"); 16052 16053 verifyFormat("f(^{\n" 16054 " @autoreleasepool {\n" 16055 " if (a) {\n" 16056 " g();\n" 16057 " }\n" 16058 " }\n" 16059 "});"); 16060 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 16061 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 16062 "};"); 16063 16064 FormatStyle FourIndent = getLLVMStyle(); 16065 FourIndent.ObjCBlockIndentWidth = 4; 16066 verifyFormat("[operation setCompletionBlock:^{\n" 16067 " [self onOperationDone];\n" 16068 "}];", 16069 FourIndent); 16070 } 16071 16072 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 16073 FormatStyle ZeroColumn = getLLVMStyle(); 16074 ZeroColumn.ColumnLimit = 0; 16075 16076 verifyFormat("[[SessionService sharedService] " 16077 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 16078 " if (window) {\n" 16079 " [self windowDidLoad:window];\n" 16080 " } else {\n" 16081 " [self errorLoadingWindow];\n" 16082 " }\n" 16083 "}];", 16084 ZeroColumn); 16085 EXPECT_EQ("[[SessionService sharedService]\n" 16086 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 16087 " if (window) {\n" 16088 " [self windowDidLoad:window];\n" 16089 " } else {\n" 16090 " [self errorLoadingWindow];\n" 16091 " }\n" 16092 " }];", 16093 format("[[SessionService sharedService]\n" 16094 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 16095 " if (window) {\n" 16096 " [self windowDidLoad:window];\n" 16097 " } else {\n" 16098 " [self errorLoadingWindow];\n" 16099 " }\n" 16100 "}];", 16101 ZeroColumn)); 16102 verifyFormat("[myObject doSomethingWith:arg1\n" 16103 " firstBlock:^(Foo *a) {\n" 16104 " // ...\n" 16105 " int i;\n" 16106 " }\n" 16107 " secondBlock:^(Bar *b) {\n" 16108 " // ...\n" 16109 " int i;\n" 16110 " }\n" 16111 " thirdBlock:^Foo(Bar *b) {\n" 16112 " // ...\n" 16113 " int i;\n" 16114 " }];", 16115 ZeroColumn); 16116 verifyFormat("f(^{\n" 16117 " @autoreleasepool {\n" 16118 " if (a) {\n" 16119 " g();\n" 16120 " }\n" 16121 " }\n" 16122 "});", 16123 ZeroColumn); 16124 verifyFormat("void (^largeBlock)(void) = ^{\n" 16125 " // ...\n" 16126 "};", 16127 ZeroColumn); 16128 16129 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 16130 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 16131 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 16132 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 16133 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 16134 " int i;\n" 16135 "};", 16136 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 16137 } 16138 16139 TEST_F(FormatTest, SupportsCRLF) { 16140 EXPECT_EQ("int a;\r\n" 16141 "int b;\r\n" 16142 "int c;\r\n", 16143 format("int a;\r\n" 16144 " int b;\r\n" 16145 " int c;\r\n", 16146 getLLVMStyle())); 16147 EXPECT_EQ("int a;\r\n" 16148 "int b;\r\n" 16149 "int c;\r\n", 16150 format("int a;\r\n" 16151 " int b;\n" 16152 " int c;\r\n", 16153 getLLVMStyle())); 16154 EXPECT_EQ("int a;\n" 16155 "int b;\n" 16156 "int c;\n", 16157 format("int a;\r\n" 16158 " int b;\n" 16159 " int c;\n", 16160 getLLVMStyle())); 16161 EXPECT_EQ("\"aaaaaaa \"\r\n" 16162 "\"bbbbbbb\";\r\n", 16163 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 16164 EXPECT_EQ("#define A \\\r\n" 16165 " b; \\\r\n" 16166 " c; \\\r\n" 16167 " d;\r\n", 16168 format("#define A \\\r\n" 16169 " b; \\\r\n" 16170 " c; d; \r\n", 16171 getGoogleStyle())); 16172 16173 EXPECT_EQ("/*\r\n" 16174 "multi line block comments\r\n" 16175 "should not introduce\r\n" 16176 "an extra carriage return\r\n" 16177 "*/\r\n", 16178 format("/*\r\n" 16179 "multi line block comments\r\n" 16180 "should not introduce\r\n" 16181 "an extra carriage return\r\n" 16182 "*/\r\n")); 16183 EXPECT_EQ("/*\r\n" 16184 "\r\n" 16185 "*/", 16186 format("/*\r\n" 16187 " \r\r\r\n" 16188 "*/")); 16189 16190 FormatStyle style = getLLVMStyle(); 16191 16192 style.DeriveLineEnding = true; 16193 style.UseCRLF = false; 16194 EXPECT_EQ("union FooBarBazQux {\n" 16195 " int foo;\n" 16196 " int bar;\n" 16197 " int baz;\n" 16198 "};", 16199 format("union FooBarBazQux {\r\n" 16200 " int foo;\n" 16201 " int bar;\r\n" 16202 " int baz;\n" 16203 "};", 16204 style)); 16205 style.UseCRLF = true; 16206 EXPECT_EQ("union FooBarBazQux {\r\n" 16207 " int foo;\r\n" 16208 " int bar;\r\n" 16209 " int baz;\r\n" 16210 "};", 16211 format("union FooBarBazQux {\r\n" 16212 " int foo;\n" 16213 " int bar;\r\n" 16214 " int baz;\n" 16215 "};", 16216 style)); 16217 16218 style.DeriveLineEnding = false; 16219 style.UseCRLF = false; 16220 EXPECT_EQ("union FooBarBazQux {\n" 16221 " int foo;\n" 16222 " int bar;\n" 16223 " int baz;\n" 16224 " int qux;\n" 16225 "};", 16226 format("union FooBarBazQux {\r\n" 16227 " int foo;\n" 16228 " int bar;\r\n" 16229 " int baz;\n" 16230 " int qux;\r\n" 16231 "};", 16232 style)); 16233 style.UseCRLF = true; 16234 EXPECT_EQ("union FooBarBazQux {\r\n" 16235 " int foo;\r\n" 16236 " int bar;\r\n" 16237 " int baz;\r\n" 16238 " int qux;\r\n" 16239 "};", 16240 format("union FooBarBazQux {\r\n" 16241 " int foo;\n" 16242 " int bar;\r\n" 16243 " int baz;\n" 16244 " int qux;\n" 16245 "};", 16246 style)); 16247 16248 style.DeriveLineEnding = true; 16249 style.UseCRLF = false; 16250 EXPECT_EQ("union FooBarBazQux {\r\n" 16251 " int foo;\r\n" 16252 " int bar;\r\n" 16253 " int baz;\r\n" 16254 " int qux;\r\n" 16255 "};", 16256 format("union FooBarBazQux {\r\n" 16257 " int foo;\n" 16258 " int bar;\r\n" 16259 " int baz;\n" 16260 " int qux;\r\n" 16261 "};", 16262 style)); 16263 style.UseCRLF = true; 16264 EXPECT_EQ("union FooBarBazQux {\n" 16265 " int foo;\n" 16266 " int bar;\n" 16267 " int baz;\n" 16268 " int qux;\n" 16269 "};", 16270 format("union FooBarBazQux {\r\n" 16271 " int foo;\n" 16272 " int bar;\r\n" 16273 " int baz;\n" 16274 " int qux;\n" 16275 "};", 16276 style)); 16277 } 16278 16279 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 16280 verifyFormat("MY_CLASS(C) {\n" 16281 " int i;\n" 16282 " int j;\n" 16283 "};"); 16284 } 16285 16286 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 16287 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 16288 TwoIndent.ContinuationIndentWidth = 2; 16289 16290 EXPECT_EQ("int i =\n" 16291 " longFunction(\n" 16292 " arg);", 16293 format("int i = longFunction(arg);", TwoIndent)); 16294 16295 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 16296 SixIndent.ContinuationIndentWidth = 6; 16297 16298 EXPECT_EQ("int i =\n" 16299 " longFunction(\n" 16300 " arg);", 16301 format("int i = longFunction(arg);", SixIndent)); 16302 } 16303 16304 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 16305 FormatStyle Style = getLLVMStyle(); 16306 verifyFormat("int Foo::getter(\n" 16307 " //\n" 16308 ") const {\n" 16309 " return foo;\n" 16310 "}", 16311 Style); 16312 verifyFormat("void Foo::setter(\n" 16313 " //\n" 16314 ") {\n" 16315 " foo = 1;\n" 16316 "}", 16317 Style); 16318 } 16319 16320 TEST_F(FormatTest, SpacesInAngles) { 16321 FormatStyle Spaces = getLLVMStyle(); 16322 Spaces.SpacesInAngles = true; 16323 16324 verifyFormat("static_cast< int >(arg);", Spaces); 16325 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 16326 verifyFormat("f< int, float >();", Spaces); 16327 verifyFormat("template <> g() {}", Spaces); 16328 verifyFormat("template < std::vector< int > > f() {}", Spaces); 16329 verifyFormat("std::function< void(int, int) > fct;", Spaces); 16330 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 16331 Spaces); 16332 16333 Spaces.Standard = FormatStyle::LS_Cpp03; 16334 Spaces.SpacesInAngles = true; 16335 verifyFormat("A< A< int > >();", Spaces); 16336 16337 Spaces.SpacesInAngles = false; 16338 verifyFormat("A<A<int> >();", Spaces); 16339 16340 Spaces.Standard = FormatStyle::LS_Cpp11; 16341 Spaces.SpacesInAngles = true; 16342 verifyFormat("A< A< int > >();", Spaces); 16343 16344 Spaces.SpacesInAngles = false; 16345 verifyFormat("A<A<int>>();", Spaces); 16346 } 16347 16348 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 16349 FormatStyle Style = getLLVMStyle(); 16350 Style.SpaceAfterTemplateKeyword = false; 16351 verifyFormat("template<int> void foo();", Style); 16352 } 16353 16354 TEST_F(FormatTest, TripleAngleBrackets) { 16355 verifyFormat("f<<<1, 1>>>();"); 16356 verifyFormat("f<<<1, 1, 1, s>>>();"); 16357 verifyFormat("f<<<a, b, c, d>>>();"); 16358 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 16359 verifyFormat("f<param><<<1, 1>>>();"); 16360 verifyFormat("f<1><<<1, 1>>>();"); 16361 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 16362 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16363 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 16364 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 16365 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 16366 } 16367 16368 TEST_F(FormatTest, MergeLessLessAtEnd) { 16369 verifyFormat("<<"); 16370 EXPECT_EQ("< < <", format("\\\n<<<")); 16371 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16372 "aaallvm::outs() <<"); 16373 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16374 "aaaallvm::outs()\n <<"); 16375 } 16376 16377 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 16378 std::string code = "#if A\n" 16379 "#if B\n" 16380 "a.\n" 16381 "#endif\n" 16382 " a = 1;\n" 16383 "#else\n" 16384 "#endif\n" 16385 "#if C\n" 16386 "#else\n" 16387 "#endif\n"; 16388 EXPECT_EQ(code, format(code)); 16389 } 16390 16391 TEST_F(FormatTest, HandleConflictMarkers) { 16392 // Git/SVN conflict markers. 16393 EXPECT_EQ("int a;\n" 16394 "void f() {\n" 16395 " callme(some(parameter1,\n" 16396 "<<<<<<< text by the vcs\n" 16397 " parameter2),\n" 16398 "||||||| text by the vcs\n" 16399 " parameter2),\n" 16400 " parameter3,\n" 16401 "======= text by the vcs\n" 16402 " parameter2, parameter3),\n" 16403 ">>>>>>> text by the vcs\n" 16404 " otherparameter);\n", 16405 format("int a;\n" 16406 "void f() {\n" 16407 " callme(some(parameter1,\n" 16408 "<<<<<<< text by the vcs\n" 16409 " parameter2),\n" 16410 "||||||| text by the vcs\n" 16411 " parameter2),\n" 16412 " parameter3,\n" 16413 "======= text by the vcs\n" 16414 " parameter2,\n" 16415 " parameter3),\n" 16416 ">>>>>>> text by the vcs\n" 16417 " otherparameter);\n")); 16418 16419 // Perforce markers. 16420 EXPECT_EQ("void f() {\n" 16421 " function(\n" 16422 ">>>> text by the vcs\n" 16423 " parameter,\n" 16424 "==== text by the vcs\n" 16425 " parameter,\n" 16426 "==== text by the vcs\n" 16427 " parameter,\n" 16428 "<<<< text by the vcs\n" 16429 " parameter);\n", 16430 format("void f() {\n" 16431 " function(\n" 16432 ">>>> text by the vcs\n" 16433 " parameter,\n" 16434 "==== text by the vcs\n" 16435 " parameter,\n" 16436 "==== text by the vcs\n" 16437 " parameter,\n" 16438 "<<<< text by the vcs\n" 16439 " parameter);\n")); 16440 16441 EXPECT_EQ("<<<<<<<\n" 16442 "|||||||\n" 16443 "=======\n" 16444 ">>>>>>>", 16445 format("<<<<<<<\n" 16446 "|||||||\n" 16447 "=======\n" 16448 ">>>>>>>")); 16449 16450 EXPECT_EQ("<<<<<<<\n" 16451 "|||||||\n" 16452 "int i;\n" 16453 "=======\n" 16454 ">>>>>>>", 16455 format("<<<<<<<\n" 16456 "|||||||\n" 16457 "int i;\n" 16458 "=======\n" 16459 ">>>>>>>")); 16460 16461 // FIXME: Handle parsing of macros around conflict markers correctly: 16462 EXPECT_EQ("#define Macro \\\n" 16463 "<<<<<<<\n" 16464 "Something \\\n" 16465 "|||||||\n" 16466 "Else \\\n" 16467 "=======\n" 16468 "Other \\\n" 16469 ">>>>>>>\n" 16470 " End int i;\n", 16471 format("#define Macro \\\n" 16472 "<<<<<<<\n" 16473 " Something \\\n" 16474 "|||||||\n" 16475 " Else \\\n" 16476 "=======\n" 16477 " Other \\\n" 16478 ">>>>>>>\n" 16479 " End\n" 16480 "int i;\n")); 16481 } 16482 16483 TEST_F(FormatTest, DisableRegions) { 16484 EXPECT_EQ("int i;\n" 16485 "// clang-format off\n" 16486 " int j;\n" 16487 "// clang-format on\n" 16488 "int k;", 16489 format(" int i;\n" 16490 " // clang-format off\n" 16491 " int j;\n" 16492 " // clang-format on\n" 16493 " int k;")); 16494 EXPECT_EQ("int i;\n" 16495 "/* clang-format off */\n" 16496 " int j;\n" 16497 "/* clang-format on */\n" 16498 "int k;", 16499 format(" int i;\n" 16500 " /* clang-format off */\n" 16501 " int j;\n" 16502 " /* clang-format on */\n" 16503 " int k;")); 16504 16505 // Don't reflow comments within disabled regions. 16506 EXPECT_EQ("// clang-format off\n" 16507 "// long long long long long long line\n" 16508 "/* clang-format on */\n" 16509 "/* long long long\n" 16510 " * long long long\n" 16511 " * line */\n" 16512 "int i;\n" 16513 "/* clang-format off */\n" 16514 "/* long long long long long long line */\n", 16515 format("// clang-format off\n" 16516 "// long long long long long long line\n" 16517 "/* clang-format on */\n" 16518 "/* long long long long long long line */\n" 16519 "int i;\n" 16520 "/* clang-format off */\n" 16521 "/* long long long long long long line */\n", 16522 getLLVMStyleWithColumns(20))); 16523 } 16524 16525 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 16526 format("? ) ="); 16527 verifyNoCrash("#define a\\\n /**/}"); 16528 } 16529 16530 TEST_F(FormatTest, FormatsTableGenCode) { 16531 FormatStyle Style = getLLVMStyle(); 16532 Style.Language = FormatStyle::LK_TableGen; 16533 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 16534 } 16535 16536 TEST_F(FormatTest, ArrayOfTemplates) { 16537 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 16538 format("auto a = new unique_ptr<int > [ 10];")); 16539 16540 FormatStyle Spaces = getLLVMStyle(); 16541 Spaces.SpacesInSquareBrackets = true; 16542 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 16543 format("auto a = new unique_ptr<int > [10];", Spaces)); 16544 } 16545 16546 TEST_F(FormatTest, ArrayAsTemplateType) { 16547 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 16548 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 16549 16550 FormatStyle Spaces = getLLVMStyle(); 16551 Spaces.SpacesInSquareBrackets = true; 16552 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 16553 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 16554 } 16555 16556 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 16557 16558 TEST(FormatStyle, GetStyleWithEmptyFileName) { 16559 llvm::vfs::InMemoryFileSystem FS; 16560 auto Style1 = getStyle("file", "", "Google", "", &FS); 16561 ASSERT_TRUE((bool)Style1); 16562 ASSERT_EQ(*Style1, getGoogleStyle()); 16563 } 16564 16565 TEST(FormatStyle, GetStyleOfFile) { 16566 llvm::vfs::InMemoryFileSystem FS; 16567 // Test 1: format file in the same directory. 16568 ASSERT_TRUE( 16569 FS.addFile("/a/.clang-format", 0, 16570 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 16571 ASSERT_TRUE( 16572 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16573 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 16574 ASSERT_TRUE((bool)Style1); 16575 ASSERT_EQ(*Style1, getLLVMStyle()); 16576 16577 // Test 2.1: fallback to default. 16578 ASSERT_TRUE( 16579 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16580 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 16581 ASSERT_TRUE((bool)Style2); 16582 ASSERT_EQ(*Style2, getMozillaStyle()); 16583 16584 // Test 2.2: no format on 'none' fallback style. 16585 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 16586 ASSERT_TRUE((bool)Style2); 16587 ASSERT_EQ(*Style2, getNoStyle()); 16588 16589 // Test 2.3: format if config is found with no based style while fallback is 16590 // 'none'. 16591 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 16592 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 16593 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 16594 ASSERT_TRUE((bool)Style2); 16595 ASSERT_EQ(*Style2, getLLVMStyle()); 16596 16597 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 16598 Style2 = getStyle("{}", "a.h", "none", "", &FS); 16599 ASSERT_TRUE((bool)Style2); 16600 ASSERT_EQ(*Style2, getLLVMStyle()); 16601 16602 // Test 3: format file in parent directory. 16603 ASSERT_TRUE( 16604 FS.addFile("/c/.clang-format", 0, 16605 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 16606 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 16607 llvm::MemoryBuffer::getMemBuffer("int i;"))); 16608 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 16609 ASSERT_TRUE((bool)Style3); 16610 ASSERT_EQ(*Style3, getGoogleStyle()); 16611 16612 // Test 4: error on invalid fallback style 16613 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 16614 ASSERT_FALSE((bool)Style4); 16615 llvm::consumeError(Style4.takeError()); 16616 16617 // Test 5: error on invalid yaml on command line 16618 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 16619 ASSERT_FALSE((bool)Style5); 16620 llvm::consumeError(Style5.takeError()); 16621 16622 // Test 6: error on invalid style 16623 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 16624 ASSERT_FALSE((bool)Style6); 16625 llvm::consumeError(Style6.takeError()); 16626 16627 // Test 7: found config file, error on parsing it 16628 ASSERT_TRUE( 16629 FS.addFile("/d/.clang-format", 0, 16630 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 16631 "InvalidKey: InvalidValue"))); 16632 ASSERT_TRUE( 16633 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16634 auto Style7a = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 16635 ASSERT_FALSE((bool)Style7a); 16636 llvm::consumeError(Style7a.takeError()); 16637 16638 auto Style7b = getStyle("file", "/d/.clang-format", "LLVM", "", &FS, true); 16639 ASSERT_TRUE((bool)Style7b); 16640 16641 // Test 8: inferred per-language defaults apply. 16642 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 16643 ASSERT_TRUE((bool)StyleTd); 16644 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 16645 } 16646 16647 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 16648 // Column limit is 20. 16649 std::string Code = "Type *a =\n" 16650 " new Type();\n" 16651 "g(iiiii, 0, jjjjj,\n" 16652 " 0, kkkkk, 0, mm);\n" 16653 "int bad = format ;"; 16654 std::string Expected = "auto a = new Type();\n" 16655 "g(iiiii, nullptr,\n" 16656 " jjjjj, nullptr,\n" 16657 " kkkkk, nullptr,\n" 16658 " mm);\n" 16659 "int bad = format ;"; 16660 FileID ID = Context.createInMemoryFile("format.cpp", Code); 16661 tooling::Replacements Replaces = toReplacements( 16662 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 16663 "auto "), 16664 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 16665 "nullptr"), 16666 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 16667 "nullptr"), 16668 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 16669 "nullptr")}); 16670 16671 format::FormatStyle Style = format::getLLVMStyle(); 16672 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 16673 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 16674 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 16675 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 16676 auto Result = applyAllReplacements(Code, *FormattedReplaces); 16677 EXPECT_TRUE(static_cast<bool>(Result)); 16678 EXPECT_EQ(Expected, *Result); 16679 } 16680 16681 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 16682 std::string Code = "#include \"a.h\"\n" 16683 "#include \"c.h\"\n" 16684 "\n" 16685 "int main() {\n" 16686 " return 0;\n" 16687 "}"; 16688 std::string Expected = "#include \"a.h\"\n" 16689 "#include \"b.h\"\n" 16690 "#include \"c.h\"\n" 16691 "\n" 16692 "int main() {\n" 16693 " return 0;\n" 16694 "}"; 16695 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 16696 tooling::Replacements Replaces = toReplacements( 16697 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 16698 "#include \"b.h\"\n")}); 16699 16700 format::FormatStyle Style = format::getLLVMStyle(); 16701 Style.SortIncludes = true; 16702 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 16703 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 16704 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 16705 auto Result = applyAllReplacements(Code, *FormattedReplaces); 16706 EXPECT_TRUE(static_cast<bool>(Result)); 16707 EXPECT_EQ(Expected, *Result); 16708 } 16709 16710 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 16711 EXPECT_EQ("using std::cin;\n" 16712 "using std::cout;", 16713 format("using std::cout;\n" 16714 "using std::cin;", 16715 getGoogleStyle())); 16716 } 16717 16718 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 16719 format::FormatStyle Style = format::getLLVMStyle(); 16720 Style.Standard = FormatStyle::LS_Cpp03; 16721 // cpp03 recognize this string as identifier u8 and literal character 'a' 16722 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 16723 } 16724 16725 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 16726 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 16727 // all modes, including C++11, C++14 and C++17 16728 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 16729 } 16730 16731 TEST_F(FormatTest, DoNotFormatLikelyXml) { 16732 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 16733 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 16734 } 16735 16736 TEST_F(FormatTest, StructuredBindings) { 16737 // Structured bindings is a C++17 feature. 16738 // all modes, including C++11, C++14 and C++17 16739 verifyFormat("auto [a, b] = f();"); 16740 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 16741 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 16742 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 16743 EXPECT_EQ("auto const volatile [a, b] = f();", 16744 format("auto const volatile[a, b] = f();")); 16745 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 16746 EXPECT_EQ("auto &[a, b, c] = f();", 16747 format("auto &[ a , b,c ] = f();")); 16748 EXPECT_EQ("auto &&[a, b, c] = f();", 16749 format("auto &&[ a , b,c ] = f();")); 16750 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 16751 EXPECT_EQ("auto const volatile &&[a, b] = f();", 16752 format("auto const volatile &&[a, b] = f();")); 16753 EXPECT_EQ("auto const &&[a, b] = f();", 16754 format("auto const && [a, b] = f();")); 16755 EXPECT_EQ("const auto &[a, b] = f();", 16756 format("const auto & [a, b] = f();")); 16757 EXPECT_EQ("const auto volatile &&[a, b] = f();", 16758 format("const auto volatile &&[a, b] = f();")); 16759 EXPECT_EQ("volatile const auto &&[a, b] = f();", 16760 format("volatile const auto &&[a, b] = f();")); 16761 EXPECT_EQ("const auto &&[a, b] = f();", 16762 format("const auto && [a, b] = f();")); 16763 16764 // Make sure we don't mistake structured bindings for lambdas. 16765 FormatStyle PointerMiddle = getLLVMStyle(); 16766 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 16767 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 16768 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 16769 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 16770 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 16771 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 16772 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 16773 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 16774 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 16775 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 16776 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 16777 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 16778 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 16779 16780 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 16781 format("for (const auto && [a, b] : some_range) {\n}")); 16782 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 16783 format("for (const auto & [a, b] : some_range) {\n}")); 16784 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 16785 format("for (const auto[a, b] : some_range) {\n}")); 16786 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 16787 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 16788 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 16789 EXPECT_EQ("auto const &[x, y](expr);", 16790 format("auto const & [x,y] (expr);")); 16791 EXPECT_EQ("auto const &&[x, y](expr);", 16792 format("auto const && [x,y] (expr);")); 16793 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 16794 EXPECT_EQ("auto const &[x, y]{expr};", 16795 format("auto const & [x,y] {expr};")); 16796 EXPECT_EQ("auto const &&[x, y]{expr};", 16797 format("auto const && [x,y] {expr};")); 16798 16799 format::FormatStyle Spaces = format::getLLVMStyle(); 16800 Spaces.SpacesInSquareBrackets = true; 16801 verifyFormat("auto [ a, b ] = f();", Spaces); 16802 verifyFormat("auto &&[ a, b ] = f();", Spaces); 16803 verifyFormat("auto &[ a, b ] = f();", Spaces); 16804 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 16805 verifyFormat("auto const &[ a, b ] = f();", Spaces); 16806 } 16807 16808 TEST_F(FormatTest, FileAndCode) { 16809 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 16810 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 16811 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 16812 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 16813 EXPECT_EQ(FormatStyle::LK_ObjC, 16814 guessLanguage("foo.h", "@interface Foo\n@end\n")); 16815 EXPECT_EQ( 16816 FormatStyle::LK_ObjC, 16817 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 16818 EXPECT_EQ(FormatStyle::LK_ObjC, 16819 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 16820 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 16821 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 16822 EXPECT_EQ(FormatStyle::LK_ObjC, 16823 guessLanguage("foo", "@interface Foo\n@end\n")); 16824 EXPECT_EQ(FormatStyle::LK_ObjC, 16825 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 16826 EXPECT_EQ( 16827 FormatStyle::LK_ObjC, 16828 guessLanguage("foo.h", 16829 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 16830 EXPECT_EQ( 16831 FormatStyle::LK_Cpp, 16832 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 16833 } 16834 16835 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 16836 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 16837 EXPECT_EQ(FormatStyle::LK_ObjC, 16838 guessLanguage("foo.h", "array[[calculator getIndex]];")); 16839 EXPECT_EQ(FormatStyle::LK_Cpp, 16840 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 16841 EXPECT_EQ( 16842 FormatStyle::LK_Cpp, 16843 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 16844 EXPECT_EQ(FormatStyle::LK_ObjC, 16845 guessLanguage("foo.h", "[[noreturn foo] bar];")); 16846 EXPECT_EQ(FormatStyle::LK_Cpp, 16847 guessLanguage("foo.h", "[[clang::fallthrough]];")); 16848 EXPECT_EQ(FormatStyle::LK_ObjC, 16849 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 16850 EXPECT_EQ(FormatStyle::LK_Cpp, 16851 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 16852 EXPECT_EQ(FormatStyle::LK_Cpp, 16853 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 16854 EXPECT_EQ(FormatStyle::LK_ObjC, 16855 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 16856 EXPECT_EQ(FormatStyle::LK_Cpp, 16857 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 16858 EXPECT_EQ( 16859 FormatStyle::LK_Cpp, 16860 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 16861 EXPECT_EQ( 16862 FormatStyle::LK_Cpp, 16863 guessLanguage("foo.h", 16864 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 16865 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 16866 } 16867 16868 TEST_F(FormatTest, GuessLanguageWithCaret) { 16869 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 16870 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 16871 EXPECT_EQ(FormatStyle::LK_ObjC, 16872 guessLanguage("foo.h", "int(^)(char, float);")); 16873 EXPECT_EQ(FormatStyle::LK_ObjC, 16874 guessLanguage("foo.h", "int(^foo)(char, float);")); 16875 EXPECT_EQ(FormatStyle::LK_ObjC, 16876 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 16877 EXPECT_EQ(FormatStyle::LK_ObjC, 16878 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 16879 EXPECT_EQ( 16880 FormatStyle::LK_ObjC, 16881 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 16882 } 16883 16884 TEST_F(FormatTest, GuessLanguageWithPragmas) { 16885 EXPECT_EQ(FormatStyle::LK_Cpp, 16886 guessLanguage("foo.h", "__pragma(warning(disable:))")); 16887 EXPECT_EQ(FormatStyle::LK_Cpp, 16888 guessLanguage("foo.h", "#pragma(warning(disable:))")); 16889 EXPECT_EQ(FormatStyle::LK_Cpp, 16890 guessLanguage("foo.h", "_Pragma(warning(disable:))")); 16891 } 16892 16893 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) { 16894 // ASM symbolic names are identifiers that must be surrounded by [] without 16895 // space in between: 16896 // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands 16897 16898 // Example from https://bugs.llvm.org/show_bug.cgi?id=45108. 16899 verifyFormat(R"(// 16900 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result)); 16901 )"); 16902 16903 // A list of several ASM symbolic names. 16904 verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)"); 16905 16906 // ASM symbolic names in inline ASM with inputs and outputs. 16907 verifyFormat(R"(// 16908 asm("cmoveq %1, %2, %[result]" 16909 : [result] "=r"(result) 16910 : "r"(test), "r"(new), "[result]"(old)); 16911 )"); 16912 16913 // ASM symbolic names in inline ASM with no outputs. 16914 verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)"); 16915 } 16916 16917 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 16918 EXPECT_EQ(FormatStyle::LK_Cpp, 16919 guessLanguage("foo.h", "void f() {\n" 16920 " asm (\"mov %[e], %[d]\"\n" 16921 " : [d] \"=rm\" (d)\n" 16922 " [e] \"rm\" (*e));\n" 16923 "}")); 16924 EXPECT_EQ(FormatStyle::LK_Cpp, 16925 guessLanguage("foo.h", "void f() {\n" 16926 " _asm (\"mov %[e], %[d]\"\n" 16927 " : [d] \"=rm\" (d)\n" 16928 " [e] \"rm\" (*e));\n" 16929 "}")); 16930 EXPECT_EQ(FormatStyle::LK_Cpp, 16931 guessLanguage("foo.h", "void f() {\n" 16932 " __asm (\"mov %[e], %[d]\"\n" 16933 " : [d] \"=rm\" (d)\n" 16934 " [e] \"rm\" (*e));\n" 16935 "}")); 16936 EXPECT_EQ(FormatStyle::LK_Cpp, 16937 guessLanguage("foo.h", "void f() {\n" 16938 " __asm__ (\"mov %[e], %[d]\"\n" 16939 " : [d] \"=rm\" (d)\n" 16940 " [e] \"rm\" (*e));\n" 16941 "}")); 16942 EXPECT_EQ(FormatStyle::LK_Cpp, 16943 guessLanguage("foo.h", "void f() {\n" 16944 " asm (\"mov %[e], %[d]\"\n" 16945 " : [d] \"=rm\" (d),\n" 16946 " [e] \"rm\" (*e));\n" 16947 "}")); 16948 EXPECT_EQ(FormatStyle::LK_Cpp, 16949 guessLanguage("foo.h", "void f() {\n" 16950 " asm volatile (\"mov %[e], %[d]\"\n" 16951 " : [d] \"=rm\" (d)\n" 16952 " [e] \"rm\" (*e));\n" 16953 "}")); 16954 } 16955 16956 TEST_F(FormatTest, GuessLanguageWithChildLines) { 16957 EXPECT_EQ(FormatStyle::LK_Cpp, 16958 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 16959 EXPECT_EQ(FormatStyle::LK_ObjC, 16960 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 16961 EXPECT_EQ( 16962 FormatStyle::LK_Cpp, 16963 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 16964 EXPECT_EQ( 16965 FormatStyle::LK_ObjC, 16966 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 16967 } 16968 16969 TEST_F(FormatTest, TypenameMacros) { 16970 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 16971 16972 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 16973 FormatStyle Google = getGoogleStyleWithColumns(0); 16974 Google.TypenameMacros = TypenameMacros; 16975 verifyFormat("struct foo {\n" 16976 " int bar;\n" 16977 " TAILQ_ENTRY(a) bleh;\n" 16978 "};", 16979 Google); 16980 16981 FormatStyle Macros = getLLVMStyle(); 16982 Macros.TypenameMacros = TypenameMacros; 16983 16984 verifyFormat("STACK_OF(int) a;", Macros); 16985 verifyFormat("STACK_OF(int) *a;", Macros); 16986 verifyFormat("STACK_OF(int const *) *a;", Macros); 16987 verifyFormat("STACK_OF(int *const) *a;", Macros); 16988 verifyFormat("STACK_OF(int, string) a;", Macros); 16989 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 16990 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 16991 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 16992 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 16993 verifyFormat("vector<LIST(uint64_t) *attr> x;", Macros); 16994 verifyFormat("vector<LIST(uint64_t) *const> f(LIST(uint64_t) *arg);", Macros); 16995 16996 Macros.PointerAlignment = FormatStyle::PAS_Left; 16997 verifyFormat("STACK_OF(int)* a;", Macros); 16998 verifyFormat("STACK_OF(int*)* a;", Macros); 16999 verifyFormat("x = (STACK_OF(uint64_t))*a;", Macros); 17000 verifyFormat("x = (STACK_OF(uint64_t))&a;", Macros); 17001 verifyFormat("vector<STACK_OF(uint64_t)* attr> x;", Macros); 17002 } 17003 17004 TEST_F(FormatTest, AtomicQualifier) { 17005 // Check that we treate _Atomic as a type and not a function call 17006 FormatStyle Google = getGoogleStyleWithColumns(0); 17007 verifyFormat("struct foo {\n" 17008 " int a1;\n" 17009 " _Atomic(a) a2;\n" 17010 " _Atomic(_Atomic(int) *const) a3;\n" 17011 "};", 17012 Google); 17013 verifyFormat("_Atomic(uint64_t) a;"); 17014 verifyFormat("_Atomic(uint64_t) *a;"); 17015 verifyFormat("_Atomic(uint64_t const *) *a;"); 17016 verifyFormat("_Atomic(uint64_t *const) *a;"); 17017 verifyFormat("_Atomic(const uint64_t *) *a;"); 17018 verifyFormat("_Atomic(uint64_t) a;"); 17019 verifyFormat("_Atomic(_Atomic(uint64_t)) a;"); 17020 verifyFormat("_Atomic(_Atomic(uint64_t)) a, b;"); 17021 verifyFormat("for (_Atomic(uint64_t) *a = NULL; a;) {\n}"); 17022 verifyFormat("_Atomic(uint64_t) f(_Atomic(uint64_t) *arg);"); 17023 17024 verifyFormat("_Atomic(uint64_t) *s(InitValue);"); 17025 verifyFormat("_Atomic(uint64_t) *s{InitValue};"); 17026 FormatStyle Style = getLLVMStyle(); 17027 Style.PointerAlignment = FormatStyle::PAS_Left; 17028 verifyFormat("_Atomic(uint64_t)* s(InitValue);", Style); 17029 verifyFormat("_Atomic(uint64_t)* s{InitValue};", Style); 17030 verifyFormat("_Atomic(int)* a;", Style); 17031 verifyFormat("_Atomic(int*)* a;", Style); 17032 verifyFormat("vector<_Atomic(uint64_t)* attr> x;", Style); 17033 17034 Style.SpacesInCStyleCastParentheses = true; 17035 Style.SpacesInParentheses = false; 17036 verifyFormat("x = ( _Atomic(uint64_t) )*a;", Style); 17037 Style.SpacesInCStyleCastParentheses = false; 17038 Style.SpacesInParentheses = true; 17039 verifyFormat("x = (_Atomic( uint64_t ))*a;", Style); 17040 verifyFormat("x = (_Atomic( uint64_t ))&a;", Style); 17041 } 17042 17043 TEST_F(FormatTest, AmbersandInLamda) { 17044 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 17045 FormatStyle AlignStyle = getLLVMStyle(); 17046 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 17047 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 17048 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 17049 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 17050 } 17051 17052 TEST_F(FormatTest, SpacesInConditionalStatement) { 17053 FormatStyle Spaces = getLLVMStyle(); 17054 Spaces.SpacesInConditionalStatement = true; 17055 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 17056 verifyFormat("if ( !a )\n return;", Spaces); 17057 verifyFormat("if ( a )\n return;", Spaces); 17058 verifyFormat("if constexpr ( a )\n return;", Spaces); 17059 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 17060 verifyFormat("while ( a )\n return;", Spaces); 17061 verifyFormat("while ( (a && b) )\n return;", Spaces); 17062 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 17063 verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces); 17064 // Check that space on the left of "::" is inserted as expected at beginning 17065 // of condition. 17066 verifyFormat("while ( ::func() )\n return;", Spaces); 17067 } 17068 17069 TEST_F(FormatTest, AlternativeOperators) { 17070 // Test case for ensuring alternate operators are not 17071 // combined with their right most neighbour. 17072 verifyFormat("int a and b;"); 17073 verifyFormat("int a and_eq b;"); 17074 verifyFormat("int a bitand b;"); 17075 verifyFormat("int a bitor b;"); 17076 verifyFormat("int a compl b;"); 17077 verifyFormat("int a not b;"); 17078 verifyFormat("int a not_eq b;"); 17079 verifyFormat("int a or b;"); 17080 verifyFormat("int a xor b;"); 17081 verifyFormat("int a xor_eq b;"); 17082 verifyFormat("return this not_eq bitand other;"); 17083 verifyFormat("bool operator not_eq(const X bitand other)"); 17084 17085 verifyFormat("int a and 5;"); 17086 verifyFormat("int a and_eq 5;"); 17087 verifyFormat("int a bitand 5;"); 17088 verifyFormat("int a bitor 5;"); 17089 verifyFormat("int a compl 5;"); 17090 verifyFormat("int a not 5;"); 17091 verifyFormat("int a not_eq 5;"); 17092 verifyFormat("int a or 5;"); 17093 verifyFormat("int a xor 5;"); 17094 verifyFormat("int a xor_eq 5;"); 17095 17096 verifyFormat("int a compl(5);"); 17097 verifyFormat("int a not(5);"); 17098 17099 /* FIXME handle alternate tokens 17100 * https://en.cppreference.com/w/cpp/language/operator_alternative 17101 // alternative tokens 17102 verifyFormat("compl foo();"); // ~foo(); 17103 verifyFormat("foo() <%%>;"); // foo(); 17104 verifyFormat("void foo() <%%>;"); // void foo(){} 17105 verifyFormat("int a <:1:>;"); // int a[1];[ 17106 verifyFormat("%:define ABC abc"); // #define ABC abc 17107 verifyFormat("%:%:"); // ## 17108 */ 17109 } 17110 17111 TEST_F(FormatTest, STLWhileNotDefineChed) { 17112 verifyFormat("#if defined(while)\n" 17113 "#define while EMIT WARNING C4005\n" 17114 "#endif // while"); 17115 } 17116 17117 TEST_F(FormatTest, OperatorSpacing) { 17118 FormatStyle Style = getLLVMStyle(); 17119 Style.PointerAlignment = FormatStyle::PAS_Right; 17120 verifyFormat("Foo::operator*();", Style); 17121 verifyFormat("Foo::operator void *();", Style); 17122 verifyFormat("Foo::operator void **();", Style); 17123 verifyFormat("Foo::operator void *&();", Style); 17124 verifyFormat("Foo::operator void *&&();", Style); 17125 verifyFormat("Foo::operator()(void *);", Style); 17126 verifyFormat("Foo::operator*(void *);", Style); 17127 verifyFormat("Foo::operator*();", Style); 17128 verifyFormat("Foo::operator**();", Style); 17129 verifyFormat("Foo::operator&();", Style); 17130 verifyFormat("Foo::operator<int> *();", Style); 17131 verifyFormat("Foo::operator<Foo> *();", Style); 17132 verifyFormat("Foo::operator<int> **();", Style); 17133 verifyFormat("Foo::operator<Foo> **();", Style); 17134 verifyFormat("Foo::operator<int> &();", Style); 17135 verifyFormat("Foo::operator<Foo> &();", Style); 17136 verifyFormat("Foo::operator<int> &&();", Style); 17137 verifyFormat("Foo::operator<Foo> &&();", Style); 17138 verifyFormat("Foo::operator<int> *&();", Style); 17139 verifyFormat("Foo::operator<Foo> *&();", Style); 17140 verifyFormat("Foo::operator<int> *&&();", Style); 17141 verifyFormat("Foo::operator<Foo> *&&();", Style); 17142 verifyFormat("operator*(int (*)(), class Foo);", Style); 17143 17144 verifyFormat("Foo::operator&();", Style); 17145 verifyFormat("Foo::operator void &();", Style); 17146 verifyFormat("Foo::operator()(void &);", Style); 17147 verifyFormat("Foo::operator&(void &);", Style); 17148 verifyFormat("Foo::operator&();", Style); 17149 verifyFormat("operator&(int (&)(), class Foo);", Style); 17150 17151 verifyFormat("Foo::operator&&();", Style); 17152 verifyFormat("Foo::operator**();", Style); 17153 verifyFormat("Foo::operator void &&();", Style); 17154 verifyFormat("Foo::operator()(void &&);", Style); 17155 verifyFormat("Foo::operator&&(void &&);", Style); 17156 verifyFormat("Foo::operator&&();", Style); 17157 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 17158 verifyFormat("operator const nsTArrayRight<E> &()", Style); 17159 verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()", 17160 Style); 17161 verifyFormat("operator void **()", Style); 17162 verifyFormat("operator const FooRight<Object> &()", Style); 17163 verifyFormat("operator const FooRight<Object> *()", Style); 17164 verifyFormat("operator const FooRight<Object> **()", Style); 17165 verifyFormat("operator const FooRight<Object> *&()", Style); 17166 verifyFormat("operator const FooRight<Object> *&&()", Style); 17167 17168 Style.PointerAlignment = FormatStyle::PAS_Left; 17169 verifyFormat("Foo::operator*();", Style); 17170 verifyFormat("Foo::operator**();", Style); 17171 verifyFormat("Foo::operator void*();", Style); 17172 verifyFormat("Foo::operator void**();", Style); 17173 verifyFormat("Foo::operator void*&();", Style); 17174 verifyFormat("Foo::operator/*comment*/ void*();", Style); 17175 verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); 17176 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); 17177 verifyFormat("Foo::operator()(void*);", Style); 17178 verifyFormat("Foo::operator*(void*);", Style); 17179 verifyFormat("Foo::operator*();", Style); 17180 verifyFormat("Foo::operator<int>*();", Style); 17181 verifyFormat("Foo::operator<Foo>*();", Style); 17182 verifyFormat("Foo::operator<int>**();", Style); 17183 verifyFormat("Foo::operator<Foo>**();", Style); 17184 verifyFormat("Foo::operator<Foo>*&();", Style); 17185 verifyFormat("Foo::operator<int>&();", Style); 17186 verifyFormat("Foo::operator<Foo>&();", Style); 17187 verifyFormat("Foo::operator<int>&&();", Style); 17188 verifyFormat("Foo::operator<Foo>&&();", Style); 17189 verifyFormat("Foo::operator<int>*&();", Style); 17190 verifyFormat("Foo::operator<Foo>*&();", Style); 17191 verifyFormat("operator*(int (*)(), class Foo);", Style); 17192 17193 verifyFormat("Foo::operator&();", Style); 17194 verifyFormat("Foo::operator void&();", Style); 17195 verifyFormat("Foo::operator/*comment*/ void&();", Style); 17196 verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); 17197 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); 17198 verifyFormat("Foo::operator()(void&);", Style); 17199 verifyFormat("Foo::operator&(void&);", Style); 17200 verifyFormat("Foo::operator&();", Style); 17201 verifyFormat("operator&(int (&)(), class Foo);", Style); 17202 17203 verifyFormat("Foo::operator&&();", Style); 17204 verifyFormat("Foo::operator void&&();", Style); 17205 verifyFormat("Foo::operator/*comment*/ void&&();", Style); 17206 verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); 17207 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); 17208 verifyFormat("Foo::operator()(void&&);", Style); 17209 verifyFormat("Foo::operator&&(void&&);", Style); 17210 verifyFormat("Foo::operator&&();", Style); 17211 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 17212 verifyFormat("operator const nsTArrayLeft<E>&()", Style); 17213 verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()", 17214 Style); 17215 verifyFormat("operator void**()", Style); 17216 verifyFormat("operator const FooLeft<Object>&()", Style); 17217 verifyFormat("operator const FooLeft<Object>*()", Style); 17218 verifyFormat("operator const FooLeft<Object>**()", Style); 17219 verifyFormat("operator const FooLeft<Object>*&()", Style); 17220 verifyFormat("operator const FooLeft<Object>*&&()", Style); 17221 17222 // PR45107 17223 verifyFormat("operator Vector<String>&();", Style); 17224 verifyFormat("operator const Vector<String>&();", Style); 17225 verifyFormat("operator foo::Bar*();", Style); 17226 verifyFormat("operator const Foo<X>::Bar<Y>*();", Style); 17227 verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();", 17228 Style); 17229 17230 Style.PointerAlignment = FormatStyle::PAS_Middle; 17231 verifyFormat("Foo::operator*();", Style); 17232 verifyFormat("Foo::operator void *();", Style); 17233 verifyFormat("Foo::operator()(void *);", Style); 17234 verifyFormat("Foo::operator*(void *);", Style); 17235 verifyFormat("Foo::operator*();", Style); 17236 verifyFormat("operator*(int (*)(), class Foo);", Style); 17237 17238 verifyFormat("Foo::operator&();", Style); 17239 verifyFormat("Foo::operator void &();", Style); 17240 verifyFormat("Foo::operator()(void &);", Style); 17241 verifyFormat("Foo::operator&(void &);", Style); 17242 verifyFormat("Foo::operator&();", Style); 17243 verifyFormat("operator&(int (&)(), class Foo);", Style); 17244 17245 verifyFormat("Foo::operator&&();", Style); 17246 verifyFormat("Foo::operator void &&();", Style); 17247 verifyFormat("Foo::operator()(void &&);", Style); 17248 verifyFormat("Foo::operator&&(void &&);", Style); 17249 verifyFormat("Foo::operator&&();", Style); 17250 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 17251 } 17252 17253 TEST_F(FormatTest, OperatorPassedAsAFunctionPtr) { 17254 FormatStyle Style = getLLVMStyle(); 17255 // PR46157 17256 verifyFormat("foo(operator+, -42);", Style); 17257 verifyFormat("foo(operator++, -42);", Style); 17258 verifyFormat("foo(operator--, -42);", Style); 17259 verifyFormat("foo(-42, operator--);", Style); 17260 verifyFormat("foo(-42, operator, );", Style); 17261 verifyFormat("foo(operator, , -42);", Style); 17262 } 17263 17264 TEST_F(FormatTest, WhitespaceSensitiveMacros) { 17265 FormatStyle Style = getLLVMStyle(); 17266 Style.WhitespaceSensitiveMacros.push_back("FOO"); 17267 17268 // Don't use the helpers here, since 'mess up' will change the whitespace 17269 // and these are all whitespace sensitive by definition 17270 EXPECT_EQ("FOO(String-ized&Messy+But(: :Still)=Intentional);", 17271 format("FOO(String-ized&Messy+But(: :Still)=Intentional);", Style)); 17272 EXPECT_EQ( 17273 "FOO(String-ized&Messy+But\\(: :Still)=Intentional);", 17274 format("FOO(String-ized&Messy+But\\(: :Still)=Intentional);", Style)); 17275 EXPECT_EQ("FOO(String-ized&Messy+But,: :Still=Intentional);", 17276 format("FOO(String-ized&Messy+But,: :Still=Intentional);", Style)); 17277 EXPECT_EQ("FOO(String-ized&Messy+But,: :\n" 17278 " Still=Intentional);", 17279 format("FOO(String-ized&Messy+But,: :\n" 17280 " Still=Intentional);", 17281 Style)); 17282 Style.AlignConsecutiveAssignments = true; 17283 EXPECT_EQ("FOO(String-ized=&Messy+But,: :\n" 17284 " Still=Intentional);", 17285 format("FOO(String-ized=&Messy+But,: :\n" 17286 " Still=Intentional);", 17287 Style)); 17288 17289 Style.ColumnLimit = 21; 17290 EXPECT_EQ("FOO(String-ized&Messy+But: :Still=Intentional);", 17291 format("FOO(String-ized&Messy+But: :Still=Intentional);", Style)); 17292 } 17293 17294 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) { 17295 // These tests are not in NamespaceFixer because that doesn't 17296 // test its interaction with line wrapping 17297 FormatStyle Style = getLLVMStyle(); 17298 Style.ColumnLimit = 80; 17299 verifyFormat("namespace {\n" 17300 "int i;\n" 17301 "int j;\n" 17302 "} // namespace", 17303 Style); 17304 17305 verifyFormat("namespace AAA {\n" 17306 "int i;\n" 17307 "int j;\n" 17308 "} // namespace AAA", 17309 Style); 17310 17311 EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n" 17312 "int i;\n" 17313 "int j;\n" 17314 "} // namespace Averyveryveryverylongnamespace", 17315 format("namespace Averyveryveryverylongnamespace {\n" 17316 "int i;\n" 17317 "int j;\n" 17318 "}", 17319 Style)); 17320 17321 EXPECT_EQ( 17322 "namespace " 17323 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 17324 " went::mad::now {\n" 17325 "int i;\n" 17326 "int j;\n" 17327 "} // namespace\n" 17328 " // " 17329 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 17330 "went::mad::now", 17331 format("namespace " 17332 "would::it::save::you::a::lot::of::time::if_::i::" 17333 "just::gave::up::and_::went::mad::now {\n" 17334 "int i;\n" 17335 "int j;\n" 17336 "}", 17337 Style)); 17338 17339 // This used to duplicate the comment again and again on subsequent runs 17340 EXPECT_EQ( 17341 "namespace " 17342 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 17343 " went::mad::now {\n" 17344 "int i;\n" 17345 "int j;\n" 17346 "} // namespace\n" 17347 " // " 17348 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 17349 "went::mad::now", 17350 format("namespace " 17351 "would::it::save::you::a::lot::of::time::if_::i::" 17352 "just::gave::up::and_::went::mad::now {\n" 17353 "int i;\n" 17354 "int j;\n" 17355 "} // namespace\n" 17356 " // " 17357 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::" 17358 "and_::went::mad::now", 17359 Style)); 17360 } 17361 17362 TEST_F(FormatTest, LikelyUnlikely) { 17363 FormatStyle Style = getLLVMStyle(); 17364 17365 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17366 " return 29;\n" 17367 "}", 17368 Style); 17369 17370 verifyFormat("if (argc > 5) [[likely]] {\n" 17371 " return 29;\n" 17372 "}", 17373 Style); 17374 17375 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17376 " return 29;\n" 17377 "} else [[likely]] {\n" 17378 " return 42;\n" 17379 "}\n", 17380 Style); 17381 17382 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17383 " return 29;\n" 17384 "} else if (argc > 10) [[likely]] {\n" 17385 " return 99;\n" 17386 "} else {\n" 17387 " return 42;\n" 17388 "}\n", 17389 Style); 17390 17391 verifyFormat("if (argc > 5) [[gnu::unused]] {\n" 17392 " return 29;\n" 17393 "}", 17394 Style); 17395 } 17396 17397 TEST_F(FormatTest, PenaltyIndentedWhitespace) { 17398 verifyFormat("Constructor()\n" 17399 " : aaaaaa(aaaaaa), aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 17400 " aaaa(aaaaaaaaaaaaaaaaaa, " 17401 "aaaaaaaaaaaaaaaaaat))"); 17402 verifyFormat("Constructor()\n" 17403 " : aaaaaaaaaaaaa(aaaaaa), " 17404 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa)"); 17405 17406 FormatStyle StyleWithWhitespacePenalty = getLLVMStyle(); 17407 StyleWithWhitespacePenalty.PenaltyIndentedWhitespace = 5; 17408 verifyFormat("Constructor()\n" 17409 " : aaaaaa(aaaaaa),\n" 17410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 17411 " aaaa(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaat))", 17412 StyleWithWhitespacePenalty); 17413 verifyFormat("Constructor()\n" 17414 " : aaaaaaaaaaaaa(aaaaaa), " 17415 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa)", 17416 StyleWithWhitespacePenalty); 17417 } 17418 17419 TEST_F(FormatTest, LLVMDefaultStyle) { 17420 FormatStyle Style = getLLVMStyle(); 17421 verifyFormat("extern \"C\" {\n" 17422 "int foo();\n" 17423 "}", 17424 Style); 17425 } 17426 TEST_F(FormatTest, GNUDefaultStyle) { 17427 FormatStyle Style = getGNUStyle(); 17428 verifyFormat("extern \"C\"\n" 17429 "{\n" 17430 " int foo ();\n" 17431 "}", 17432 Style); 17433 } 17434 TEST_F(FormatTest, MozillaDefaultStyle) { 17435 FormatStyle Style = getMozillaStyle(); 17436 verifyFormat("extern \"C\"\n" 17437 "{\n" 17438 " int foo();\n" 17439 "}", 17440 Style); 17441 } 17442 TEST_F(FormatTest, GoogleDefaultStyle) { 17443 FormatStyle Style = getGoogleStyle(); 17444 verifyFormat("extern \"C\" {\n" 17445 "int foo();\n" 17446 "}", 17447 Style); 17448 } 17449 TEST_F(FormatTest, ChromiumDefaultStyle) { 17450 FormatStyle Style = getChromiumStyle(FormatStyle::LanguageKind::LK_Cpp); 17451 verifyFormat("extern \"C\" {\n" 17452 "int foo();\n" 17453 "}", 17454 Style); 17455 } 17456 TEST_F(FormatTest, MicrosoftDefaultStyle) { 17457 FormatStyle Style = getMicrosoftStyle(FormatStyle::LanguageKind::LK_Cpp); 17458 verifyFormat("extern \"C\"\n" 17459 "{\n" 17460 " int foo();\n" 17461 "}", 17462 Style); 17463 } 17464 TEST_F(FormatTest, WebKitDefaultStyle) { 17465 FormatStyle Style = getWebKitStyle(); 17466 verifyFormat("extern \"C\" {\n" 17467 "int foo();\n" 17468 "}", 17469 Style); 17470 } 17471 17472 TEST_F(FormatTest, ConceptsAndRequires) { 17473 FormatStyle Style = getLLVMStyle(); 17474 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 17475 17476 verifyFormat("template <typename T>\n" 17477 "concept Hashable = requires(T a) {\n" 17478 " { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n" 17479 "};", 17480 Style); 17481 verifyFormat("template <typename T>\n" 17482 "concept EqualityComparable = requires(T a, T b) {\n" 17483 " { a == b } -> bool;\n" 17484 "};", 17485 Style); 17486 verifyFormat("template <typename T>\n" 17487 "concept EqualityComparable = requires(T a, T b) {\n" 17488 " { a == b } -> bool;\n" 17489 " { a != b } -> bool;\n" 17490 "};", 17491 Style); 17492 verifyFormat("template <typename T>\n" 17493 "concept EqualityComparable = requires(T a, T b) {\n" 17494 " { a == b } -> bool;\n" 17495 " { a != b } -> bool;\n" 17496 "};", 17497 Style); 17498 17499 verifyFormat("template <typename It>\n" 17500 "requires Iterator<It>\n" 17501 "void sort(It begin, It end) {\n" 17502 " //....\n" 17503 "}", 17504 Style); 17505 17506 verifyFormat("template <typename T>\n" 17507 "concept Large = sizeof(T) > 10;", 17508 Style); 17509 17510 verifyFormat("template <typename T, typename U>\n" 17511 "concept FooableWith = requires(T t, U u) {\n" 17512 " typename T::foo_type;\n" 17513 " { t.foo(u) } -> typename T::foo_type;\n" 17514 " t++;\n" 17515 "};\n" 17516 "void doFoo(FooableWith<int> auto t) {\n" 17517 " t.foo(3);\n" 17518 "}", 17519 Style); 17520 verifyFormat("template <typename T>\n" 17521 "concept Context = sizeof(T) == 1;", 17522 Style); 17523 verifyFormat("template <typename T>\n" 17524 "concept Context = is_specialization_of_v<context, T>;", 17525 Style); 17526 verifyFormat("template <typename T>\n" 17527 "concept Node = std::is_object_v<T>;", 17528 Style); 17529 verifyFormat("template <typename T>\n" 17530 "concept Tree = true;", 17531 Style); 17532 17533 verifyFormat("template <typename T> int g(T i) requires Concept1<I> {\n" 17534 " //...\n" 17535 "}", 17536 Style); 17537 17538 verifyFormat( 17539 "template <typename T> int g(T i) requires Concept1<I> && Concept2<I> {\n" 17540 " //...\n" 17541 "}", 17542 Style); 17543 17544 verifyFormat( 17545 "template <typename T> int g(T i) requires Concept1<I> || Concept2<I> {\n" 17546 " //...\n" 17547 "}", 17548 Style); 17549 17550 verifyFormat("template <typename T>\n" 17551 "veryveryvery_long_return_type g(T i) requires Concept1<I> || " 17552 "Concept2<I> {\n" 17553 " //...\n" 17554 "}", 17555 Style); 17556 17557 verifyFormat("template <typename T>\n" 17558 "veryveryvery_long_return_type g(T i) requires Concept1<I> && " 17559 "Concept2<I> {\n" 17560 " //...\n" 17561 "}", 17562 Style); 17563 17564 verifyFormat( 17565 "template <typename T>\n" 17566 "veryveryvery_long_return_type g(T i) requires Concept1 && Concept2 {\n" 17567 " //...\n" 17568 "}", 17569 Style); 17570 17571 verifyFormat( 17572 "template <typename T>\n" 17573 "veryveryvery_long_return_type g(T i) requires Concept1 || Concept2 {\n" 17574 " //...\n" 17575 "}", 17576 Style); 17577 17578 verifyFormat("template <typename It>\n" 17579 "requires Foo<It>() && Bar<It> {\n" 17580 " //....\n" 17581 "}", 17582 Style); 17583 17584 verifyFormat("template <typename It>\n" 17585 "requires Foo<Bar<It>>() && Bar<Foo<It, It>> {\n" 17586 " //....\n" 17587 "}", 17588 Style); 17589 17590 verifyFormat("template <typename It>\n" 17591 "requires Foo<Bar<It, It>>() && Bar<Foo<It, It>> {\n" 17592 " //....\n" 17593 "}", 17594 Style); 17595 17596 verifyFormat( 17597 "template <typename It>\n" 17598 "requires Foo<Bar<It>, Baz<It>>() && Bar<Foo<It>, Baz<It, It>> {\n" 17599 " //....\n" 17600 "}", 17601 Style); 17602 17603 Style.IndentRequires = true; 17604 verifyFormat("template <typename It>\n" 17605 " requires Iterator<It>\n" 17606 "void sort(It begin, It end) {\n" 17607 " //....\n" 17608 "}", 17609 Style); 17610 verifyFormat("template <std::size index_>\n" 17611 " requires(index_ < sizeof...(Children_))\n" 17612 "Tree auto &child() {\n" 17613 " // ...\n" 17614 "}", 17615 Style); 17616 17617 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 17618 verifyFormat("template <typename T>\n" 17619 "concept Hashable = requires (T a) {\n" 17620 " { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n" 17621 "};", 17622 Style); 17623 17624 verifyFormat("template <class T = void>\n" 17625 " requires EqualityComparable<T> || Same<T, void>\n" 17626 "struct equal_to;", 17627 Style); 17628 17629 verifyFormat("template <class T>\n" 17630 " requires requires {\n" 17631 " T{};\n" 17632 " T (int);\n" 17633 " }\n", 17634 Style); 17635 17636 Style.ColumnLimit = 78; 17637 verifyFormat("template <typename T>\n" 17638 "concept Context = Traits<typename T::traits_type> and\n" 17639 " Interface<typename T::interface_type> and\n" 17640 " Request<typename T::request_type> and\n" 17641 " Response<typename T::response_type> and\n" 17642 " ContextExtension<typename T::extension_type> and\n" 17643 " ::std::is_copy_constructable<T> and " 17644 "::std::is_move_constructable<T> and\n" 17645 " requires (T c) {\n" 17646 " { c.response; } -> Response;\n" 17647 "} and requires (T c) {\n" 17648 " { c.request; } -> Request;\n" 17649 "}\n", 17650 Style); 17651 17652 verifyFormat("template <typename T>\n" 17653 "concept Context = Traits<typename T::traits_type> or\n" 17654 " Interface<typename T::interface_type> or\n" 17655 " Request<typename T::request_type> or\n" 17656 " Response<typename T::response_type> or\n" 17657 " ContextExtension<typename T::extension_type> or\n" 17658 " ::std::is_copy_constructable<T> or " 17659 "::std::is_move_constructable<T> or\n" 17660 " requires (T c) {\n" 17661 " { c.response; } -> Response;\n" 17662 "} or requires (T c) {\n" 17663 " { c.request; } -> Request;\n" 17664 "}\n", 17665 Style); 17666 17667 verifyFormat("template <typename T>\n" 17668 "concept Context = Traits<typename T::traits_type> &&\n" 17669 " Interface<typename T::interface_type> &&\n" 17670 " Request<typename T::request_type> &&\n" 17671 " Response<typename T::response_type> &&\n" 17672 " ContextExtension<typename T::extension_type> &&\n" 17673 " ::std::is_copy_constructable<T> && " 17674 "::std::is_move_constructable<T> &&\n" 17675 " requires (T c) {\n" 17676 " { c.response; } -> Response;\n" 17677 "} && requires (T c) {\n" 17678 " { c.request; } -> Request;\n" 17679 "}\n", 17680 Style); 17681 17682 verifyFormat("template <typename T>\nconcept someConcept = Constraint1<T> && " 17683 "Constraint2<T>;"); 17684 17685 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 17686 Style.BraceWrapping.AfterFunction = true; 17687 Style.BraceWrapping.AfterClass = true; 17688 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 17689 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 17690 verifyFormat("void Foo () requires (std::copyable<T>)\n" 17691 "{\n" 17692 " return\n" 17693 "}\n", 17694 Style); 17695 17696 verifyFormat("void Foo () requires std::copyable<T>\n" 17697 "{\n" 17698 " return\n" 17699 "}\n", 17700 Style); 17701 17702 verifyFormat("template <std::semiregular F, std::semiregular... Args>\n" 17703 " requires (std::invocable<F, std::invoke_result_t<Args>...>)\n" 17704 "struct constant;", 17705 Style); 17706 17707 verifyFormat("template <std::semiregular F, std::semiregular... Args>\n" 17708 " requires std::invocable<F, std::invoke_result_t<Args>...>\n" 17709 "struct constant;", 17710 Style); 17711 17712 verifyFormat("template <class T>\n" 17713 "class plane_with_very_very_very_long_name\n" 17714 "{\n" 17715 " constexpr plane_with_very_very_very_long_name () requires " 17716 "std::copyable<T>\n" 17717 " : plane_with_very_very_very_long_name (1)\n" 17718 " {\n" 17719 " }\n" 17720 "}\n", 17721 Style); 17722 17723 verifyFormat("template <class T>\n" 17724 "class plane_with_long_name\n" 17725 "{\n" 17726 " constexpr plane_with_long_name () requires std::copyable<T>\n" 17727 " : plane_with_long_name (1)\n" 17728 " {\n" 17729 " }\n" 17730 "}\n", 17731 Style); 17732 17733 Style.BreakBeforeConceptDeclarations = false; 17734 verifyFormat("template <typename T> concept Tree = true;", Style); 17735 17736 Style.IndentRequires = false; 17737 verifyFormat("template <std::semiregular F, std::semiregular... Args>\n" 17738 "requires (std::invocable<F, std::invoke_result_t<Args>...>) " 17739 "struct constant;", 17740 Style); 17741 } 17742 17743 TEST_F(FormatTest, IndentPragmas) { 17744 FormatStyle Style = getLLVMStyle(); 17745 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 17746 17747 Style.IndentPragmas = false; 17748 verifyFormat("#pragma once", Style); 17749 verifyFormat("#pragma omp simd\n" 17750 "for (int i = 0; i < 10; i++) {\n" 17751 "}", 17752 Style); 17753 verifyFormat("void foo() {\n" 17754 "#pragma omp simd\n" 17755 " for (int i = 0; i < 10; i++) {\n" 17756 " }\n" 17757 "}", 17758 Style); 17759 verifyFormat("void foo() {\n" 17760 "// outer loop\n" 17761 "#pragma omp simd\n" 17762 " for (int k = 0; k < 10; k++) {\n" 17763 "// inner loop\n" 17764 "#pragma omp simd\n" 17765 " for (int j = 0; j < 10; j++) {\n" 17766 " }\n" 17767 " }\n" 17768 "}", 17769 Style); 17770 17771 verifyFormat("void foo() {\n" 17772 "// outer loop\n" 17773 "#if 1\n" 17774 "#pragma omp simd\n" 17775 " for (int k = 0; k < 10; k++) {\n" 17776 "// inner loop\n" 17777 "#pragma omp simd\n" 17778 " for (int j = 0; j < 10; j++) {\n" 17779 " }\n" 17780 " }\n" 17781 "#endif\n" 17782 "}", 17783 Style); 17784 17785 Style.IndentPragmas = true; 17786 verifyFormat("#pragma once", Style); 17787 verifyFormat("#pragma omp simd\n" 17788 "for (int i = 0; i < 10; i++) {\n" 17789 "}", 17790 Style); 17791 verifyFormat("void foo() {\n" 17792 " #pragma omp simd\n" 17793 " for (int i = 0; i < 10; i++) {\n" 17794 " }\n" 17795 "}", 17796 Style); 17797 verifyFormat("void foo() {\n" 17798 " #pragma omp simd\n" 17799 " for (int i = 0; i < 10; i++) {\n" 17800 " #pragma omp simd\n" 17801 " for (int j = 0; j < 10; j++) {\n" 17802 " }\n" 17803 " }\n" 17804 "}", 17805 Style); 17806 17807 verifyFormat("void foo() {\n" 17808 " #pragma omp simd\n" 17809 " for (...) {\n" 17810 " #pragma omp simd\n" 17811 " for (...) {\n" 17812 " }\n" 17813 " }\n" 17814 "}", 17815 Style); 17816 17817 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 17818 17819 verifyFormat("void foo() {\n" 17820 "# pragma omp simd\n" 17821 " for (int i = 0; i < 10; i++) {\n" 17822 "# pragma omp simd\n" 17823 " for (int j = 0; j < 10; j++) {\n" 17824 " }\n" 17825 " }\n" 17826 "}", 17827 Style); 17828 17829 verifyFormat("void foo() {\n" 17830 "#if 1\n" 17831 "# pragma omp simd\n" 17832 " for (int k = 0; k < 10; k++) {\n" 17833 "# pragma omp simd\n" 17834 " for (int j = 0; j < 10; j++) {\n" 17835 " }\n" 17836 " }\n" 17837 "#endif\n" 17838 "}", 17839 Style); 17840 17841 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 17842 EXPECT_EQ("void foo() {\n" 17843 "#if 1\n" 17844 " #pragma omp simd\n" 17845 " for (int k = 0; k < 10; k++) {\n" 17846 " #pragma omp simd\n" 17847 " for (int j = 0; j < 10; j++) {\n" 17848 " }\n" 17849 " }\n" 17850 "#endif\n" 17851 "}", 17852 format("void foo() {\n" 17853 "#if 1\n" 17854 " #pragma omp simd\n" 17855 " for (int k = 0; k < 10; k++) {\n" 17856 " #pragma omp simd\n" 17857 " for (int j = 0; j < 10; j++) {\n" 17858 " }\n" 17859 " }\n" 17860 "#endif\n" 17861 "}", 17862 Style)); 17863 } 17864 17865 } // namespace 17866 } // namespace format 17867 } // namespace clang 17868