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 2731 // Incomplete try-catch blocks. 2732 verifyIncompleteFormat("try {} catch ("); 2733 } 2734 2735 TEST_F(FormatTest, FormatTryAsAVariable) { 2736 verifyFormat("int try;"); 2737 verifyFormat("int try, size;"); 2738 verifyFormat("try = foo();"); 2739 verifyFormat("if (try < size) {\n return true;\n}"); 2740 2741 verifyFormat("int catch;"); 2742 verifyFormat("int catch, size;"); 2743 verifyFormat("catch = foo();"); 2744 verifyFormat("if (catch < size) {\n return true;\n}"); 2745 2746 FormatStyle Style = getLLVMStyle(); 2747 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2748 Style.BraceWrapping.AfterFunction = true; 2749 Style.BraceWrapping.BeforeCatch = true; 2750 verifyFormat("try {\n" 2751 " int bar = 1;\n" 2752 "}\n" 2753 "catch (...) {\n" 2754 " int bar = 1;\n" 2755 "}", 2756 Style); 2757 verifyFormat("#if NO_EX\n" 2758 "try\n" 2759 "#endif\n" 2760 "{\n" 2761 "}\n" 2762 "#if NO_EX\n" 2763 "catch (...) {\n" 2764 "}", 2765 Style); 2766 verifyFormat("try /* abc */ {\n" 2767 " int bar = 1;\n" 2768 "}\n" 2769 "catch (...) {\n" 2770 " int bar = 1;\n" 2771 "}", 2772 Style); 2773 verifyFormat("try\n" 2774 "// abc\n" 2775 "{\n" 2776 " int bar = 1;\n" 2777 "}\n" 2778 "catch (...) {\n" 2779 " int bar = 1;\n" 2780 "}", 2781 Style); 2782 } 2783 2784 TEST_F(FormatTest, FormatSEHTryCatch) { 2785 verifyFormat("__try {\n" 2786 " int a = b * c;\n" 2787 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2788 " // Do nothing.\n" 2789 "}"); 2790 2791 verifyFormat("__try {\n" 2792 " int a = b * c;\n" 2793 "} __finally {\n" 2794 " // Do nothing.\n" 2795 "}"); 2796 2797 verifyFormat("DEBUG({\n" 2798 " __try {\n" 2799 " } __finally {\n" 2800 " }\n" 2801 "});\n"); 2802 } 2803 2804 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2805 verifyFormat("try {\n" 2806 " f();\n" 2807 "} catch {\n" 2808 " g();\n" 2809 "}"); 2810 verifyFormat("try {\n" 2811 " f();\n" 2812 "} catch (A a) MACRO(x) {\n" 2813 " g();\n" 2814 "} catch (B b) MACRO(x) {\n" 2815 " g();\n" 2816 "}"); 2817 } 2818 2819 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2820 FormatStyle Style = getLLVMStyle(); 2821 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2822 FormatStyle::BS_WebKit}) { 2823 Style.BreakBeforeBraces = BraceStyle; 2824 verifyFormat("try {\n" 2825 " // something\n" 2826 "} catch (...) {\n" 2827 " // something\n" 2828 "}", 2829 Style); 2830 } 2831 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2832 verifyFormat("try {\n" 2833 " // something\n" 2834 "}\n" 2835 "catch (...) {\n" 2836 " // something\n" 2837 "}", 2838 Style); 2839 verifyFormat("__try {\n" 2840 " // something\n" 2841 "}\n" 2842 "__finally {\n" 2843 " // something\n" 2844 "}", 2845 Style); 2846 verifyFormat("@try {\n" 2847 " // something\n" 2848 "}\n" 2849 "@finally {\n" 2850 " // something\n" 2851 "}", 2852 Style); 2853 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2854 verifyFormat("try\n" 2855 "{\n" 2856 " // something\n" 2857 "}\n" 2858 "catch (...)\n" 2859 "{\n" 2860 " // something\n" 2861 "}", 2862 Style); 2863 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2864 verifyFormat("try\n" 2865 " {\n" 2866 " // something white\n" 2867 " }\n" 2868 "catch (...)\n" 2869 " {\n" 2870 " // something white\n" 2871 " }", 2872 Style); 2873 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2874 verifyFormat("try\n" 2875 " {\n" 2876 " // something\n" 2877 " }\n" 2878 "catch (...)\n" 2879 " {\n" 2880 " // something\n" 2881 " }", 2882 Style); 2883 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2884 Style.BraceWrapping.BeforeCatch = true; 2885 verifyFormat("try {\n" 2886 " // something\n" 2887 "}\n" 2888 "catch (...) {\n" 2889 " // something\n" 2890 "}", 2891 Style); 2892 } 2893 2894 TEST_F(FormatTest, StaticInitializers) { 2895 verifyFormat("static SomeClass SC = {1, 'a'};"); 2896 2897 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2898 " 100000000, " 2899 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2900 2901 // Here, everything other than the "}" would fit on a line. 2902 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2903 " 10000000000000000000000000};"); 2904 EXPECT_EQ("S s = {a,\n" 2905 "\n" 2906 " b};", 2907 format("S s = {\n" 2908 " a,\n" 2909 "\n" 2910 " b\n" 2911 "};")); 2912 2913 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2914 // line. However, the formatting looks a bit off and this probably doesn't 2915 // happen often in practice. 2916 verifyFormat("static int Variable[1] = {\n" 2917 " {1000000000000000000000000000000000000}};", 2918 getLLVMStyleWithColumns(40)); 2919 } 2920 2921 TEST_F(FormatTest, DesignatedInitializers) { 2922 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2923 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2924 " .bbbbbbbbbb = 2,\n" 2925 " .cccccccccc = 3,\n" 2926 " .dddddddddd = 4,\n" 2927 " .eeeeeeeeee = 5};"); 2928 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2929 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2930 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2931 " .ccccccccccccccccccccccccccc = 3,\n" 2932 " .ddddddddddddddddddddddddddd = 4,\n" 2933 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2934 2935 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2936 2937 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2938 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2939 " [2] = bbbbbbbbbb,\n" 2940 " [3] = cccccccccc,\n" 2941 " [4] = dddddddddd,\n" 2942 " [5] = eeeeeeeeee};"); 2943 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2944 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2945 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2946 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2947 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2948 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2949 } 2950 2951 TEST_F(FormatTest, NestedStaticInitializers) { 2952 verifyFormat("static A x = {{{}}};\n"); 2953 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2954 " {init1, init2, init3, init4}}};", 2955 getLLVMStyleWithColumns(50)); 2956 2957 verifyFormat("somes Status::global_reps[3] = {\n" 2958 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2959 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2960 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2961 getLLVMStyleWithColumns(60)); 2962 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2963 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2964 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2965 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2966 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2967 " {rect.fRight - rect.fLeft, rect.fBottom - " 2968 "rect.fTop}};"); 2969 2970 verifyFormat( 2971 "SomeArrayOfSomeType a = {\n" 2972 " {{1, 2, 3},\n" 2973 " {1, 2, 3},\n" 2974 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2975 " 333333333333333333333333333333},\n" 2976 " {1, 2, 3},\n" 2977 " {1, 2, 3}}};"); 2978 verifyFormat( 2979 "SomeArrayOfSomeType a = {\n" 2980 " {{1, 2, 3}},\n" 2981 " {{1, 2, 3}},\n" 2982 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2983 " 333333333333333333333333333333}},\n" 2984 " {{1, 2, 3}},\n" 2985 " {{1, 2, 3}}};"); 2986 2987 verifyFormat("struct {\n" 2988 " unsigned bit;\n" 2989 " const char *const name;\n" 2990 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2991 " {kOsWin, \"Windows\"},\n" 2992 " {kOsLinux, \"Linux\"},\n" 2993 " {kOsCrOS, \"Chrome OS\"}};"); 2994 verifyFormat("struct {\n" 2995 " unsigned bit;\n" 2996 " const char *const name;\n" 2997 "} kBitsToOs[] = {\n" 2998 " {kOsMac, \"Mac\"},\n" 2999 " {kOsWin, \"Windows\"},\n" 3000 " {kOsLinux, \"Linux\"},\n" 3001 " {kOsCrOS, \"Chrome OS\"},\n" 3002 "};"); 3003 } 3004 3005 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 3006 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3007 " \\\n" 3008 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 3009 } 3010 3011 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 3012 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 3013 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 3014 3015 // Do break defaulted and deleted functions. 3016 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 3017 " default;", 3018 getLLVMStyleWithColumns(40)); 3019 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 3020 " delete;", 3021 getLLVMStyleWithColumns(40)); 3022 } 3023 3024 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 3025 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 3026 getLLVMStyleWithColumns(40)); 3027 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 3028 getLLVMStyleWithColumns(40)); 3029 EXPECT_EQ("#define Q \\\n" 3030 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 3031 " \"aaaaaaaa.cpp\"", 3032 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 3033 getLLVMStyleWithColumns(40))); 3034 } 3035 3036 TEST_F(FormatTest, UnderstandsLinePPDirective) { 3037 EXPECT_EQ("# 123 \"A string literal\"", 3038 format(" # 123 \"A string literal\"")); 3039 } 3040 3041 TEST_F(FormatTest, LayoutUnknownPPDirective) { 3042 EXPECT_EQ("#;", format("#;")); 3043 verifyFormat("#\n;\n;\n;"); 3044 } 3045 3046 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 3047 EXPECT_EQ("#line 42 \"test\"\n", 3048 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 3049 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 3050 getLLVMStyleWithColumns(12))); 3051 } 3052 3053 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 3054 EXPECT_EQ("#line 42 \"test\"", 3055 format("# \\\n line \\\n 42 \\\n \"test\"")); 3056 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 3057 } 3058 3059 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 3060 verifyFormat("#define A \\x20"); 3061 verifyFormat("#define A \\ x20"); 3062 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 3063 verifyFormat("#define A ''"); 3064 verifyFormat("#define A ''qqq"); 3065 verifyFormat("#define A `qqq"); 3066 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 3067 EXPECT_EQ("const char *c = STRINGIFY(\n" 3068 "\\na : b);", 3069 format("const char * c = STRINGIFY(\n" 3070 "\\na : b);")); 3071 3072 verifyFormat("a\r\\"); 3073 verifyFormat("a\v\\"); 3074 verifyFormat("a\f\\"); 3075 } 3076 3077 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 3078 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 3079 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 3080 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 3081 // FIXME: We never break before the macro name. 3082 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 3083 3084 verifyFormat("#define A A\n#define A A"); 3085 verifyFormat("#define A(X) A\n#define A A"); 3086 3087 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 3088 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 3089 } 3090 3091 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 3092 EXPECT_EQ("// somecomment\n" 3093 "#include \"a.h\"\n" 3094 "#define A( \\\n" 3095 " A, B)\n" 3096 "#include \"b.h\"\n" 3097 "// somecomment\n", 3098 format(" // somecomment\n" 3099 " #include \"a.h\"\n" 3100 "#define A(A,\\\n" 3101 " B)\n" 3102 " #include \"b.h\"\n" 3103 " // somecomment\n", 3104 getLLVMStyleWithColumns(13))); 3105 } 3106 3107 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 3108 3109 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 3110 EXPECT_EQ("#define A \\\n" 3111 " c; \\\n" 3112 " e;\n" 3113 "f;", 3114 format("#define A c; e;\n" 3115 "f;", 3116 getLLVMStyleWithColumns(14))); 3117 } 3118 3119 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 3120 3121 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 3122 EXPECT_EQ("int x,\n" 3123 "#define A\n" 3124 " y;", 3125 format("int x,\n#define A\ny;")); 3126 } 3127 3128 TEST_F(FormatTest, HashInMacroDefinition) { 3129 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 3130 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 3131 verifyFormat("#define A \\\n" 3132 " { \\\n" 3133 " f(#c); \\\n" 3134 " }", 3135 getLLVMStyleWithColumns(11)); 3136 3137 verifyFormat("#define A(X) \\\n" 3138 " void function##X()", 3139 getLLVMStyleWithColumns(22)); 3140 3141 verifyFormat("#define A(a, b, c) \\\n" 3142 " void a##b##c()", 3143 getLLVMStyleWithColumns(22)); 3144 3145 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 3146 } 3147 3148 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 3149 EXPECT_EQ("#define A (x)", format("#define A (x)")); 3150 EXPECT_EQ("#define A(x)", format("#define A(x)")); 3151 3152 FormatStyle Style = getLLVMStyle(); 3153 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 3154 verifyFormat("#define true ((foo)1)", Style); 3155 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 3156 verifyFormat("#define false((foo)0)", Style); 3157 } 3158 3159 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 3160 EXPECT_EQ("#define A b;", format("#define A \\\n" 3161 " \\\n" 3162 " b;", 3163 getLLVMStyleWithColumns(25))); 3164 EXPECT_EQ("#define A \\\n" 3165 " \\\n" 3166 " a; \\\n" 3167 " b;", 3168 format("#define A \\\n" 3169 " \\\n" 3170 " a; \\\n" 3171 " b;", 3172 getLLVMStyleWithColumns(11))); 3173 EXPECT_EQ("#define A \\\n" 3174 " a; \\\n" 3175 " \\\n" 3176 " b;", 3177 format("#define A \\\n" 3178 " a; \\\n" 3179 " \\\n" 3180 " b;", 3181 getLLVMStyleWithColumns(11))); 3182 } 3183 3184 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 3185 verifyIncompleteFormat("#define A :"); 3186 verifyFormat("#define SOMECASES \\\n" 3187 " case 1: \\\n" 3188 " case 2\n", 3189 getLLVMStyleWithColumns(20)); 3190 verifyFormat("#define MACRO(a) \\\n" 3191 " if (a) \\\n" 3192 " f(); \\\n" 3193 " else \\\n" 3194 " g()", 3195 getLLVMStyleWithColumns(18)); 3196 verifyFormat("#define A template <typename T>"); 3197 verifyIncompleteFormat("#define STR(x) #x\n" 3198 "f(STR(this_is_a_string_literal{));"); 3199 verifyFormat("#pragma omp threadprivate( \\\n" 3200 " y)), // expected-warning", 3201 getLLVMStyleWithColumns(28)); 3202 verifyFormat("#d, = };"); 3203 verifyFormat("#if \"a"); 3204 verifyIncompleteFormat("({\n" 3205 "#define b \\\n" 3206 " } \\\n" 3207 " a\n" 3208 "a", 3209 getLLVMStyleWithColumns(15)); 3210 verifyFormat("#define A \\\n" 3211 " { \\\n" 3212 " {\n" 3213 "#define B \\\n" 3214 " } \\\n" 3215 " }", 3216 getLLVMStyleWithColumns(15)); 3217 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 3218 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 3219 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 3220 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 3221 } 3222 3223 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 3224 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 3225 EXPECT_EQ("class A : public QObject {\n" 3226 " Q_OBJECT\n" 3227 "\n" 3228 " A() {}\n" 3229 "};", 3230 format("class A : public QObject {\n" 3231 " Q_OBJECT\n" 3232 "\n" 3233 " A() {\n}\n" 3234 "} ;")); 3235 EXPECT_EQ("MACRO\n" 3236 "/*static*/ int i;", 3237 format("MACRO\n" 3238 " /*static*/ int i;")); 3239 EXPECT_EQ("SOME_MACRO\n" 3240 "namespace {\n" 3241 "void f();\n" 3242 "} // namespace", 3243 format("SOME_MACRO\n" 3244 " namespace {\n" 3245 "void f( );\n" 3246 "} // namespace")); 3247 // Only if the identifier contains at least 5 characters. 3248 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 3249 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 3250 // Only if everything is upper case. 3251 EXPECT_EQ("class A : public QObject {\n" 3252 " Q_Object A() {}\n" 3253 "};", 3254 format("class A : public QObject {\n" 3255 " Q_Object\n" 3256 " A() {\n}\n" 3257 "} ;")); 3258 3259 // Only if the next line can actually start an unwrapped line. 3260 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 3261 format("SOME_WEIRD_LOG_MACRO\n" 3262 "<< SomeThing;")); 3263 3264 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 3265 "(n, buffers))\n", 3266 getChromiumStyle(FormatStyle::LK_Cpp)); 3267 3268 // See PR41483 3269 EXPECT_EQ("/**/ FOO(a)\n" 3270 "FOO(b)", 3271 format("/**/ FOO(a)\n" 3272 "FOO(b)")); 3273 } 3274 3275 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 3276 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3277 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3278 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3279 "class X {};\n" 3280 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3281 "int *createScopDetectionPass() { return 0; }", 3282 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3283 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3284 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3285 " class X {};\n" 3286 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3287 " int *createScopDetectionPass() { return 0; }")); 3288 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 3289 // braces, so that inner block is indented one level more. 3290 EXPECT_EQ("int q() {\n" 3291 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3292 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3293 " IPC_END_MESSAGE_MAP()\n" 3294 "}", 3295 format("int q() {\n" 3296 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3297 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3298 " IPC_END_MESSAGE_MAP()\n" 3299 "}")); 3300 3301 // Same inside macros. 3302 EXPECT_EQ("#define LIST(L) \\\n" 3303 " L(A) \\\n" 3304 " L(B) \\\n" 3305 " L(C)", 3306 format("#define LIST(L) \\\n" 3307 " L(A) \\\n" 3308 " L(B) \\\n" 3309 " L(C)", 3310 getGoogleStyle())); 3311 3312 // These must not be recognized as macros. 3313 EXPECT_EQ("int q() {\n" 3314 " f(x);\n" 3315 " f(x) {}\n" 3316 " f(x)->g();\n" 3317 " f(x)->*g();\n" 3318 " f(x).g();\n" 3319 " f(x) = x;\n" 3320 " f(x) += x;\n" 3321 " f(x) -= x;\n" 3322 " f(x) *= x;\n" 3323 " f(x) /= x;\n" 3324 " f(x) %= x;\n" 3325 " f(x) &= x;\n" 3326 " f(x) |= x;\n" 3327 " f(x) ^= x;\n" 3328 " f(x) >>= x;\n" 3329 " f(x) <<= x;\n" 3330 " f(x)[y].z();\n" 3331 " LOG(INFO) << x;\n" 3332 " ifstream(x) >> x;\n" 3333 "}\n", 3334 format("int q() {\n" 3335 " f(x)\n;\n" 3336 " f(x)\n {}\n" 3337 " f(x)\n->g();\n" 3338 " f(x)\n->*g();\n" 3339 " f(x)\n.g();\n" 3340 " f(x)\n = x;\n" 3341 " f(x)\n += x;\n" 3342 " f(x)\n -= x;\n" 3343 " f(x)\n *= x;\n" 3344 " f(x)\n /= x;\n" 3345 " f(x)\n %= x;\n" 3346 " f(x)\n &= x;\n" 3347 " f(x)\n |= x;\n" 3348 " f(x)\n ^= x;\n" 3349 " f(x)\n >>= x;\n" 3350 " f(x)\n <<= x;\n" 3351 " f(x)\n[y].z();\n" 3352 " LOG(INFO)\n << x;\n" 3353 " ifstream(x)\n >> x;\n" 3354 "}\n")); 3355 EXPECT_EQ("int q() {\n" 3356 " F(x)\n" 3357 " if (1) {\n" 3358 " }\n" 3359 " F(x)\n" 3360 " while (1) {\n" 3361 " }\n" 3362 " F(x)\n" 3363 " G(x);\n" 3364 " F(x)\n" 3365 " try {\n" 3366 " Q();\n" 3367 " } catch (...) {\n" 3368 " }\n" 3369 "}\n", 3370 format("int q() {\n" 3371 "F(x)\n" 3372 "if (1) {}\n" 3373 "F(x)\n" 3374 "while (1) {}\n" 3375 "F(x)\n" 3376 "G(x);\n" 3377 "F(x)\n" 3378 "try { Q(); } catch (...) {}\n" 3379 "}\n")); 3380 EXPECT_EQ("class A {\n" 3381 " A() : t(0) {}\n" 3382 " A(int i) noexcept() : {}\n" 3383 " A(X x)\n" // FIXME: function-level try blocks are broken. 3384 " try : t(0) {\n" 3385 " } catch (...) {\n" 3386 " }\n" 3387 "};", 3388 format("class A {\n" 3389 " A()\n : t(0) {}\n" 3390 " A(int i)\n noexcept() : {}\n" 3391 " A(X x)\n" 3392 " try : t(0) {} catch (...) {}\n" 3393 "};")); 3394 FormatStyle Style = getLLVMStyle(); 3395 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3396 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3397 Style.BraceWrapping.AfterFunction = true; 3398 EXPECT_EQ("void f()\n" 3399 "try\n" 3400 "{\n" 3401 "}", 3402 format("void f() try {\n" 3403 "}", 3404 Style)); 3405 EXPECT_EQ("class SomeClass {\n" 3406 "public:\n" 3407 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3408 "};", 3409 format("class SomeClass {\n" 3410 "public:\n" 3411 " SomeClass()\n" 3412 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3413 "};")); 3414 EXPECT_EQ("class SomeClass {\n" 3415 "public:\n" 3416 " SomeClass()\n" 3417 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3418 "};", 3419 format("class SomeClass {\n" 3420 "public:\n" 3421 " SomeClass()\n" 3422 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3423 "};", 3424 getLLVMStyleWithColumns(40))); 3425 3426 verifyFormat("MACRO(>)"); 3427 3428 // Some macros contain an implicit semicolon. 3429 Style = getLLVMStyle(); 3430 Style.StatementMacros.push_back("FOO"); 3431 verifyFormat("FOO(a) int b = 0;"); 3432 verifyFormat("FOO(a)\n" 3433 "int b = 0;", 3434 Style); 3435 verifyFormat("FOO(a);\n" 3436 "int b = 0;", 3437 Style); 3438 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3439 "int b = 0;", 3440 Style); 3441 verifyFormat("FOO()\n" 3442 "int b = 0;", 3443 Style); 3444 verifyFormat("FOO\n" 3445 "int b = 0;", 3446 Style); 3447 verifyFormat("void f() {\n" 3448 " FOO(a)\n" 3449 " return a;\n" 3450 "}", 3451 Style); 3452 verifyFormat("FOO(a)\n" 3453 "FOO(b)", 3454 Style); 3455 verifyFormat("int a = 0;\n" 3456 "FOO(b)\n" 3457 "int c = 0;", 3458 Style); 3459 verifyFormat("int a = 0;\n" 3460 "int x = FOO(a)\n" 3461 "int b = 0;", 3462 Style); 3463 verifyFormat("void foo(int a) { FOO(a) }\n" 3464 "uint32_t bar() {}", 3465 Style); 3466 } 3467 3468 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3469 verifyFormat("#define A \\\n" 3470 " f({ \\\n" 3471 " g(); \\\n" 3472 " });", 3473 getLLVMStyleWithColumns(11)); 3474 } 3475 3476 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3477 FormatStyle Style = getLLVMStyle(); 3478 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3479 Style.ColumnLimit = 40; 3480 verifyFormat("#ifdef _WIN32\n" 3481 "#define A 0\n" 3482 "#ifdef VAR2\n" 3483 "#define B 1\n" 3484 "#include <someheader.h>\n" 3485 "#define MACRO \\\n" 3486 " some_very_long_func_aaaaaaaaaa();\n" 3487 "#endif\n" 3488 "#else\n" 3489 "#define A 1\n" 3490 "#endif", 3491 Style); 3492 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3493 verifyFormat("#ifdef _WIN32\n" 3494 "# define A 0\n" 3495 "# ifdef VAR2\n" 3496 "# define B 1\n" 3497 "# include <someheader.h>\n" 3498 "# define MACRO \\\n" 3499 " some_very_long_func_aaaaaaaaaa();\n" 3500 "# endif\n" 3501 "#else\n" 3502 "# define A 1\n" 3503 "#endif", 3504 Style); 3505 verifyFormat("#if A\n" 3506 "# define MACRO \\\n" 3507 " void a(int x) { \\\n" 3508 " b(); \\\n" 3509 " c(); \\\n" 3510 " d(); \\\n" 3511 " e(); \\\n" 3512 " f(); \\\n" 3513 " }\n" 3514 "#endif", 3515 Style); 3516 // Comments before include guard. 3517 verifyFormat("// file comment\n" 3518 "// file comment\n" 3519 "#ifndef HEADER_H\n" 3520 "#define HEADER_H\n" 3521 "code();\n" 3522 "#endif", 3523 Style); 3524 // Test with include guards. 3525 verifyFormat("#ifndef HEADER_H\n" 3526 "#define HEADER_H\n" 3527 "code();\n" 3528 "#endif", 3529 Style); 3530 // Include guards must have a #define with the same variable immediately 3531 // after #ifndef. 3532 verifyFormat("#ifndef NOT_GUARD\n" 3533 "# define FOO\n" 3534 "code();\n" 3535 "#endif", 3536 Style); 3537 3538 // Include guards must cover the entire file. 3539 verifyFormat("code();\n" 3540 "code();\n" 3541 "#ifndef NOT_GUARD\n" 3542 "# define NOT_GUARD\n" 3543 "code();\n" 3544 "#endif", 3545 Style); 3546 verifyFormat("#ifndef NOT_GUARD\n" 3547 "# define NOT_GUARD\n" 3548 "code();\n" 3549 "#endif\n" 3550 "code();", 3551 Style); 3552 // Test with trailing blank lines. 3553 verifyFormat("#ifndef HEADER_H\n" 3554 "#define HEADER_H\n" 3555 "code();\n" 3556 "#endif\n", 3557 Style); 3558 // Include guards don't have #else. 3559 verifyFormat("#ifndef NOT_GUARD\n" 3560 "# define NOT_GUARD\n" 3561 "code();\n" 3562 "#else\n" 3563 "#endif", 3564 Style); 3565 verifyFormat("#ifndef NOT_GUARD\n" 3566 "# define NOT_GUARD\n" 3567 "code();\n" 3568 "#elif FOO\n" 3569 "#endif", 3570 Style); 3571 // Non-identifier #define after potential include guard. 3572 verifyFormat("#ifndef FOO\n" 3573 "# define 1\n" 3574 "#endif\n", 3575 Style); 3576 // #if closes past last non-preprocessor line. 3577 verifyFormat("#ifndef FOO\n" 3578 "#define FOO\n" 3579 "#if 1\n" 3580 "int i;\n" 3581 "# define A 0\n" 3582 "#endif\n" 3583 "#endif\n", 3584 Style); 3585 // Don't crash if there is an #elif directive without a condition. 3586 verifyFormat("#if 1\n" 3587 "int x;\n" 3588 "#elif\n" 3589 "int y;\n" 3590 "#else\n" 3591 "int z;\n" 3592 "#endif", 3593 Style); 3594 // FIXME: This doesn't handle the case where there's code between the 3595 // #ifndef and #define but all other conditions hold. This is because when 3596 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3597 // previous code line yet, so we can't detect it. 3598 EXPECT_EQ("#ifndef NOT_GUARD\n" 3599 "code();\n" 3600 "#define NOT_GUARD\n" 3601 "code();\n" 3602 "#endif", 3603 format("#ifndef NOT_GUARD\n" 3604 "code();\n" 3605 "# define NOT_GUARD\n" 3606 "code();\n" 3607 "#endif", 3608 Style)); 3609 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3610 // be outside an include guard. Examples are #pragma once and 3611 // #pragma GCC diagnostic, or anything else that does not change the meaning 3612 // of the file if it's included multiple times. 3613 EXPECT_EQ("#ifdef WIN32\n" 3614 "# pragma once\n" 3615 "#endif\n" 3616 "#ifndef HEADER_H\n" 3617 "# define HEADER_H\n" 3618 "code();\n" 3619 "#endif", 3620 format("#ifdef WIN32\n" 3621 "# pragma once\n" 3622 "#endif\n" 3623 "#ifndef HEADER_H\n" 3624 "#define HEADER_H\n" 3625 "code();\n" 3626 "#endif", 3627 Style)); 3628 // FIXME: This does not detect when there is a single non-preprocessor line 3629 // in front of an include-guard-like structure where other conditions hold 3630 // because ScopedLineState hides the line. 3631 EXPECT_EQ("code();\n" 3632 "#ifndef HEADER_H\n" 3633 "#define HEADER_H\n" 3634 "code();\n" 3635 "#endif", 3636 format("code();\n" 3637 "#ifndef HEADER_H\n" 3638 "# define HEADER_H\n" 3639 "code();\n" 3640 "#endif", 3641 Style)); 3642 // Keep comments aligned with #, otherwise indent comments normally. These 3643 // tests cannot use verifyFormat because messUp manipulates leading 3644 // whitespace. 3645 { 3646 const char *Expected = "" 3647 "void f() {\n" 3648 "#if 1\n" 3649 "// Preprocessor aligned.\n" 3650 "# define A 0\n" 3651 " // Code. Separated by blank line.\n" 3652 "\n" 3653 "# define B 0\n" 3654 " // Code. Not aligned with #\n" 3655 "# define C 0\n" 3656 "#endif"; 3657 const char *ToFormat = "" 3658 "void f() {\n" 3659 "#if 1\n" 3660 "// Preprocessor aligned.\n" 3661 "# define A 0\n" 3662 "// Code. Separated by blank line.\n" 3663 "\n" 3664 "# define B 0\n" 3665 " // Code. Not aligned with #\n" 3666 "# define C 0\n" 3667 "#endif"; 3668 EXPECT_EQ(Expected, format(ToFormat, Style)); 3669 EXPECT_EQ(Expected, format(Expected, Style)); 3670 } 3671 // Keep block quotes aligned. 3672 { 3673 const char *Expected = "" 3674 "void f() {\n" 3675 "#if 1\n" 3676 "/* Preprocessor aligned. */\n" 3677 "# define A 0\n" 3678 " /* Code. Separated by blank line. */\n" 3679 "\n" 3680 "# define B 0\n" 3681 " /* Code. Not aligned with # */\n" 3682 "# define C 0\n" 3683 "#endif"; 3684 const char *ToFormat = "" 3685 "void f() {\n" 3686 "#if 1\n" 3687 "/* Preprocessor aligned. */\n" 3688 "# define A 0\n" 3689 "/* Code. Separated by blank line. */\n" 3690 "\n" 3691 "# define B 0\n" 3692 " /* Code. Not aligned with # */\n" 3693 "# define C 0\n" 3694 "#endif"; 3695 EXPECT_EQ(Expected, format(ToFormat, Style)); 3696 EXPECT_EQ(Expected, format(Expected, Style)); 3697 } 3698 // Keep comments aligned with un-indented directives. 3699 { 3700 const char *Expected = "" 3701 "void f() {\n" 3702 "// Preprocessor aligned.\n" 3703 "#define A 0\n" 3704 " // Code. Separated by blank line.\n" 3705 "\n" 3706 "#define B 0\n" 3707 " // Code. Not aligned with #\n" 3708 "#define C 0\n"; 3709 const char *ToFormat = "" 3710 "void f() {\n" 3711 "// Preprocessor aligned.\n" 3712 "#define A 0\n" 3713 "// Code. Separated by blank line.\n" 3714 "\n" 3715 "#define B 0\n" 3716 " // Code. Not aligned with #\n" 3717 "#define C 0\n"; 3718 EXPECT_EQ(Expected, format(ToFormat, Style)); 3719 EXPECT_EQ(Expected, format(Expected, Style)); 3720 } 3721 // Test AfterHash with tabs. 3722 { 3723 FormatStyle Tabbed = Style; 3724 Tabbed.UseTab = FormatStyle::UT_Always; 3725 Tabbed.IndentWidth = 8; 3726 Tabbed.TabWidth = 8; 3727 verifyFormat("#ifdef _WIN32\n" 3728 "#\tdefine A 0\n" 3729 "#\tifdef VAR2\n" 3730 "#\t\tdefine B 1\n" 3731 "#\t\tinclude <someheader.h>\n" 3732 "#\t\tdefine MACRO \\\n" 3733 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3734 "#\tendif\n" 3735 "#else\n" 3736 "#\tdefine A 1\n" 3737 "#endif", 3738 Tabbed); 3739 } 3740 3741 // Regression test: Multiline-macro inside include guards. 3742 verifyFormat("#ifndef HEADER_H\n" 3743 "#define HEADER_H\n" 3744 "#define A() \\\n" 3745 " int i; \\\n" 3746 " int j;\n" 3747 "#endif // HEADER_H", 3748 getLLVMStyleWithColumns(20)); 3749 3750 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3751 // Basic before hash indent tests 3752 verifyFormat("#ifdef _WIN32\n" 3753 " #define A 0\n" 3754 " #ifdef VAR2\n" 3755 " #define B 1\n" 3756 " #include <someheader.h>\n" 3757 " #define MACRO \\\n" 3758 " some_very_long_func_aaaaaaaaaa();\n" 3759 " #endif\n" 3760 "#else\n" 3761 " #define A 1\n" 3762 "#endif", 3763 Style); 3764 verifyFormat("#if A\n" 3765 " #define MACRO \\\n" 3766 " void a(int x) { \\\n" 3767 " b(); \\\n" 3768 " c(); \\\n" 3769 " d(); \\\n" 3770 " e(); \\\n" 3771 " f(); \\\n" 3772 " }\n" 3773 "#endif", 3774 Style); 3775 // Keep comments aligned with indented directives. These 3776 // tests cannot use verifyFormat because messUp manipulates leading 3777 // whitespace. 3778 { 3779 const char *Expected = "void f() {\n" 3780 "// Aligned to preprocessor.\n" 3781 "#if 1\n" 3782 " // Aligned to code.\n" 3783 " int a;\n" 3784 " #if 1\n" 3785 " // Aligned to preprocessor.\n" 3786 " #define A 0\n" 3787 " // Aligned to code.\n" 3788 " int b;\n" 3789 " #endif\n" 3790 "#endif\n" 3791 "}"; 3792 const char *ToFormat = "void f() {\n" 3793 "// Aligned to preprocessor.\n" 3794 "#if 1\n" 3795 "// Aligned to code.\n" 3796 "int a;\n" 3797 "#if 1\n" 3798 "// Aligned to preprocessor.\n" 3799 "#define A 0\n" 3800 "// Aligned to code.\n" 3801 "int b;\n" 3802 "#endif\n" 3803 "#endif\n" 3804 "}"; 3805 EXPECT_EQ(Expected, format(ToFormat, Style)); 3806 EXPECT_EQ(Expected, format(Expected, Style)); 3807 } 3808 { 3809 const char *Expected = "void f() {\n" 3810 "/* Aligned to preprocessor. */\n" 3811 "#if 1\n" 3812 " /* Aligned to code. */\n" 3813 " int a;\n" 3814 " #if 1\n" 3815 " /* Aligned to preprocessor. */\n" 3816 " #define A 0\n" 3817 " /* Aligned to code. */\n" 3818 " int b;\n" 3819 " #endif\n" 3820 "#endif\n" 3821 "}"; 3822 const char *ToFormat = "void f() {\n" 3823 "/* Aligned to preprocessor. */\n" 3824 "#if 1\n" 3825 "/* Aligned to code. */\n" 3826 "int a;\n" 3827 "#if 1\n" 3828 "/* Aligned to preprocessor. */\n" 3829 "#define A 0\n" 3830 "/* Aligned to code. */\n" 3831 "int b;\n" 3832 "#endif\n" 3833 "#endif\n" 3834 "}"; 3835 EXPECT_EQ(Expected, format(ToFormat, Style)); 3836 EXPECT_EQ(Expected, format(Expected, Style)); 3837 } 3838 3839 // Test single comment before preprocessor 3840 verifyFormat("// Comment\n" 3841 "\n" 3842 "#if 1\n" 3843 "#endif", 3844 Style); 3845 } 3846 3847 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3848 verifyFormat("{\n { a #c; }\n}"); 3849 } 3850 3851 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3852 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3853 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3854 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3855 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3856 } 3857 3858 TEST_F(FormatTest, EscapedNewlines) { 3859 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3860 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3861 format("#define A \\\nint i;\\\n int j;", Narrow)); 3862 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3863 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3864 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3865 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3866 3867 FormatStyle AlignLeft = getLLVMStyle(); 3868 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3869 EXPECT_EQ("#define MACRO(x) \\\n" 3870 "private: \\\n" 3871 " int x(int a);\n", 3872 format("#define MACRO(x) \\\n" 3873 "private: \\\n" 3874 " int x(int a);\n", 3875 AlignLeft)); 3876 3877 // CRLF line endings 3878 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3879 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3880 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3881 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3882 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3883 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3884 EXPECT_EQ("#define MACRO(x) \\\r\n" 3885 "private: \\\r\n" 3886 " int x(int a);\r\n", 3887 format("#define MACRO(x) \\\r\n" 3888 "private: \\\r\n" 3889 " int x(int a);\r\n", 3890 AlignLeft)); 3891 3892 FormatStyle DontAlign = getLLVMStyle(); 3893 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3894 DontAlign.MaxEmptyLinesToKeep = 3; 3895 // FIXME: can't use verifyFormat here because the newline before 3896 // "public:" is not inserted the first time it's reformatted 3897 EXPECT_EQ("#define A \\\n" 3898 " class Foo { \\\n" 3899 " void bar(); \\\n" 3900 "\\\n" 3901 "\\\n" 3902 "\\\n" 3903 " public: \\\n" 3904 " void baz(); \\\n" 3905 " };", 3906 format("#define A \\\n" 3907 " class Foo { \\\n" 3908 " void bar(); \\\n" 3909 "\\\n" 3910 "\\\n" 3911 "\\\n" 3912 " public: \\\n" 3913 " void baz(); \\\n" 3914 " };", 3915 DontAlign)); 3916 } 3917 3918 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3919 verifyFormat("#define A \\\n" 3920 " int v( \\\n" 3921 " a); \\\n" 3922 " int i;", 3923 getLLVMStyleWithColumns(11)); 3924 } 3925 3926 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3927 EXPECT_EQ( 3928 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3929 " \\\n" 3930 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3931 "\n" 3932 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3933 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3934 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3935 "\\\n" 3936 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3937 " \n" 3938 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3939 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3940 } 3941 3942 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3943 EXPECT_EQ("int\n" 3944 "#define A\n" 3945 " a;", 3946 format("int\n#define A\na;")); 3947 verifyFormat("functionCallTo(\n" 3948 " someOtherFunction(\n" 3949 " withSomeParameters, whichInSequence,\n" 3950 " areLongerThanALine(andAnotherCall,\n" 3951 "#define A B\n" 3952 " withMoreParamters,\n" 3953 " whichStronglyInfluenceTheLayout),\n" 3954 " andMoreParameters),\n" 3955 " trailing);", 3956 getLLVMStyleWithColumns(69)); 3957 verifyFormat("Foo::Foo()\n" 3958 "#ifdef BAR\n" 3959 " : baz(0)\n" 3960 "#endif\n" 3961 "{\n" 3962 "}"); 3963 verifyFormat("void f() {\n" 3964 " if (true)\n" 3965 "#ifdef A\n" 3966 " f(42);\n" 3967 " x();\n" 3968 "#else\n" 3969 " g();\n" 3970 " x();\n" 3971 "#endif\n" 3972 "}"); 3973 verifyFormat("void f(param1, param2,\n" 3974 " param3,\n" 3975 "#ifdef A\n" 3976 " param4(param5,\n" 3977 "#ifdef A1\n" 3978 " param6,\n" 3979 "#ifdef A2\n" 3980 " param7),\n" 3981 "#else\n" 3982 " param8),\n" 3983 " param9,\n" 3984 "#endif\n" 3985 " param10,\n" 3986 "#endif\n" 3987 " param11)\n" 3988 "#else\n" 3989 " param12)\n" 3990 "#endif\n" 3991 "{\n" 3992 " x();\n" 3993 "}", 3994 getLLVMStyleWithColumns(28)); 3995 verifyFormat("#if 1\n" 3996 "int i;"); 3997 verifyFormat("#if 1\n" 3998 "#endif\n" 3999 "#if 1\n" 4000 "#else\n" 4001 "#endif\n"); 4002 verifyFormat("DEBUG({\n" 4003 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4004 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 4005 "});\n" 4006 "#if a\n" 4007 "#else\n" 4008 "#endif"); 4009 4010 verifyIncompleteFormat("void f(\n" 4011 "#if A\n" 4012 ");\n" 4013 "#else\n" 4014 "#endif"); 4015 } 4016 4017 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 4018 verifyFormat("#endif\n" 4019 "#if B"); 4020 } 4021 4022 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 4023 FormatStyle SingleLine = getLLVMStyle(); 4024 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 4025 verifyFormat("#if 0\n" 4026 "#elif 1\n" 4027 "#endif\n" 4028 "void foo() {\n" 4029 " if (test) foo2();\n" 4030 "}", 4031 SingleLine); 4032 } 4033 4034 TEST_F(FormatTest, LayoutBlockInsideParens) { 4035 verifyFormat("functionCall({ int i; });"); 4036 verifyFormat("functionCall({\n" 4037 " int i;\n" 4038 " int j;\n" 4039 "});"); 4040 verifyFormat("functionCall(\n" 4041 " {\n" 4042 " int i;\n" 4043 " int j;\n" 4044 " },\n" 4045 " aaaa, bbbb, cccc);"); 4046 verifyFormat("functionA(functionB({\n" 4047 " int i;\n" 4048 " int j;\n" 4049 " }),\n" 4050 " aaaa, bbbb, cccc);"); 4051 verifyFormat("functionCall(\n" 4052 " {\n" 4053 " int i;\n" 4054 " int j;\n" 4055 " },\n" 4056 " aaaa, bbbb, // comment\n" 4057 " cccc);"); 4058 verifyFormat("functionA(functionB({\n" 4059 " int i;\n" 4060 " int j;\n" 4061 " }),\n" 4062 " aaaa, bbbb, // comment\n" 4063 " cccc);"); 4064 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 4065 verifyFormat("functionCall(aaaa, bbbb, {\n" 4066 " int i;\n" 4067 " int j;\n" 4068 "});"); 4069 verifyFormat( 4070 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 4071 " {\n" 4072 " int i; // break\n" 4073 " },\n" 4074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 4075 " ccccccccccccccccc));"); 4076 verifyFormat("DEBUG({\n" 4077 " if (a)\n" 4078 " f();\n" 4079 "});"); 4080 } 4081 4082 TEST_F(FormatTest, LayoutBlockInsideStatement) { 4083 EXPECT_EQ("SOME_MACRO { int i; }\n" 4084 "int i;", 4085 format(" SOME_MACRO {int i;} int i;")); 4086 } 4087 4088 TEST_F(FormatTest, LayoutNestedBlocks) { 4089 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 4090 " struct s {\n" 4091 " int i;\n" 4092 " };\n" 4093 " s kBitsToOs[] = {{10}};\n" 4094 " for (int i = 0; i < 10; ++i)\n" 4095 " return;\n" 4096 "}"); 4097 verifyFormat("call(parameter, {\n" 4098 " something();\n" 4099 " // Comment using all columns.\n" 4100 " somethingelse();\n" 4101 "});", 4102 getLLVMStyleWithColumns(40)); 4103 verifyFormat("DEBUG( //\n" 4104 " { f(); }, a);"); 4105 verifyFormat("DEBUG( //\n" 4106 " {\n" 4107 " f(); //\n" 4108 " },\n" 4109 " a);"); 4110 4111 EXPECT_EQ("call(parameter, {\n" 4112 " something();\n" 4113 " // Comment too\n" 4114 " // looooooooooong.\n" 4115 " somethingElse();\n" 4116 "});", 4117 format("call(parameter, {\n" 4118 " something();\n" 4119 " // Comment too looooooooooong.\n" 4120 " somethingElse();\n" 4121 "});", 4122 getLLVMStyleWithColumns(29))); 4123 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 4124 EXPECT_EQ("DEBUG({ // comment\n" 4125 " int i;\n" 4126 "});", 4127 format("DEBUG({ // comment\n" 4128 "int i;\n" 4129 "});")); 4130 EXPECT_EQ("DEBUG({\n" 4131 " int i;\n" 4132 "\n" 4133 " // comment\n" 4134 " int j;\n" 4135 "});", 4136 format("DEBUG({\n" 4137 " int i;\n" 4138 "\n" 4139 " // comment\n" 4140 " int j;\n" 4141 "});")); 4142 4143 verifyFormat("DEBUG({\n" 4144 " if (a)\n" 4145 " return;\n" 4146 "});"); 4147 verifyGoogleFormat("DEBUG({\n" 4148 " if (a) return;\n" 4149 "});"); 4150 FormatStyle Style = getGoogleStyle(); 4151 Style.ColumnLimit = 45; 4152 verifyFormat("Debug(\n" 4153 " aaaaa,\n" 4154 " {\n" 4155 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 4156 " },\n" 4157 " a);", 4158 Style); 4159 4160 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 4161 4162 verifyNoCrash("^{v^{a}}"); 4163 } 4164 4165 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 4166 EXPECT_EQ("#define MACRO() \\\n" 4167 " Debug(aaa, /* force line break */ \\\n" 4168 " { \\\n" 4169 " int i; \\\n" 4170 " int j; \\\n" 4171 " })", 4172 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 4173 " { int i; int j; })", 4174 getGoogleStyle())); 4175 4176 EXPECT_EQ("#define A \\\n" 4177 " [] { \\\n" 4178 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4179 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 4180 " }", 4181 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4182 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 4183 getGoogleStyle())); 4184 } 4185 4186 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 4187 EXPECT_EQ("{}", format("{}")); 4188 verifyFormat("enum E {};"); 4189 verifyFormat("enum E {}"); 4190 FormatStyle Style = getLLVMStyle(); 4191 Style.SpaceInEmptyBlock = true; 4192 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 4193 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 4194 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 4195 } 4196 4197 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 4198 FormatStyle Style = getLLVMStyle(); 4199 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 4200 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 4201 verifyFormat("FOO_BEGIN\n" 4202 " FOO_ENTRY\n" 4203 "FOO_END", 4204 Style); 4205 verifyFormat("FOO_BEGIN\n" 4206 " NESTED_FOO_BEGIN\n" 4207 " NESTED_FOO_ENTRY\n" 4208 " NESTED_FOO_END\n" 4209 "FOO_END", 4210 Style); 4211 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 4212 " int x;\n" 4213 " x = 1;\n" 4214 "FOO_END(Baz)", 4215 Style); 4216 } 4217 4218 //===----------------------------------------------------------------------===// 4219 // Line break tests. 4220 //===----------------------------------------------------------------------===// 4221 4222 TEST_F(FormatTest, PreventConfusingIndents) { 4223 verifyFormat( 4224 "void f() {\n" 4225 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 4226 " parameter, parameter, parameter)),\n" 4227 " SecondLongCall(parameter));\n" 4228 "}"); 4229 verifyFormat( 4230 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4231 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4232 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4233 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 4234 verifyFormat( 4235 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4236 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 4237 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 4238 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 4239 verifyFormat( 4240 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 4241 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 4242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 4243 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 4244 verifyFormat("int a = bbbb && ccc &&\n" 4245 " fffff(\n" 4246 "#define A Just forcing a new line\n" 4247 " ddd);"); 4248 } 4249 4250 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 4251 verifyFormat( 4252 "bool aaaaaaa =\n" 4253 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 4254 " bbbbbbbb();"); 4255 verifyFormat( 4256 "bool aaaaaaa =\n" 4257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 4258 " bbbbbbbb();"); 4259 4260 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 4262 " ccccccccc == ddddddddddd;"); 4263 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 4265 " ccccccccc == ddddddddddd;"); 4266 verifyFormat( 4267 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 4268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 4269 " ccccccccc == ddddddddddd;"); 4270 4271 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4272 " aaaaaa) &&\n" 4273 " bbbbbb && cccccc;"); 4274 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4275 " aaaaaa) >>\n" 4276 " bbbbbb;"); 4277 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 4278 " SourceMgr.getSpellingColumnNumber(\n" 4279 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 4280 " 1);"); 4281 4282 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4283 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 4284 " cccccc) {\n}"); 4285 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4286 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4287 " cccccc) {\n}"); 4288 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4289 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4290 " cccccc) {\n}"); 4291 verifyFormat("b = a &&\n" 4292 " // Comment\n" 4293 " b.c && d;"); 4294 4295 // If the LHS of a comparison is not a binary expression itself, the 4296 // additional linebreak confuses many people. 4297 verifyFormat( 4298 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 4300 "}"); 4301 verifyFormat( 4302 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4304 "}"); 4305 verifyFormat( 4306 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 4307 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4308 "}"); 4309 verifyFormat( 4310 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4311 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 4312 "}"); 4313 // Even explicit parentheses stress the precedence enough to make the 4314 // additional break unnecessary. 4315 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4317 "}"); 4318 // This cases is borderline, but with the indentation it is still readable. 4319 verifyFormat( 4320 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4321 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4323 "}", 4324 getLLVMStyleWithColumns(75)); 4325 4326 // If the LHS is a binary expression, we should still use the additional break 4327 // as otherwise the formatting hides the operator precedence. 4328 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4329 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4330 " 5) {\n" 4331 "}"); 4332 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4333 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4334 " 5) {\n" 4335 "}"); 4336 4337 FormatStyle OnePerLine = getLLVMStyle(); 4338 OnePerLine.BinPackParameters = false; 4339 verifyFormat( 4340 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4343 OnePerLine); 4344 4345 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4346 " .aaa(aaaaaaaaaaaaa) *\n" 4347 " aaaaaaa +\n" 4348 " aaaaaaa;", 4349 getLLVMStyleWithColumns(40)); 4350 } 4351 4352 TEST_F(FormatTest, ExpressionIndentation) { 4353 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4355 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4357 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4358 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4359 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4360 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4361 " ccccccccccccccccccccccccccccccccccccccccc;"); 4362 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4363 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4365 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4366 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4367 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4369 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4370 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4371 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4373 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4374 verifyFormat("if () {\n" 4375 "} else if (aaaaa && bbbbb > // break\n" 4376 " ccccc) {\n" 4377 "}"); 4378 verifyFormat("if () {\n" 4379 "} else if constexpr (aaaaa && bbbbb > // break\n" 4380 " ccccc) {\n" 4381 "}"); 4382 verifyFormat("if () {\n" 4383 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4384 " ccccc) {\n" 4385 "}"); 4386 verifyFormat("if () {\n" 4387 "} else if (aaaaa &&\n" 4388 " bbbbb > // break\n" 4389 " ccccc &&\n" 4390 " ddddd) {\n" 4391 "}"); 4392 4393 // Presence of a trailing comment used to change indentation of b. 4394 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4395 " b;\n" 4396 "return aaaaaaaaaaaaaaaaaaa +\n" 4397 " b; //", 4398 getLLVMStyleWithColumns(30)); 4399 } 4400 4401 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4402 // Not sure what the best system is here. Like this, the LHS can be found 4403 // immediately above an operator (everything with the same or a higher 4404 // indent). The RHS is aligned right of the operator and so compasses 4405 // everything until something with the same indent as the operator is found. 4406 // FIXME: Is this a good system? 4407 FormatStyle Style = getLLVMStyle(); 4408 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4409 verifyFormat( 4410 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4411 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4412 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4413 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4414 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4415 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4416 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4417 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4418 " > ccccccccccccccccccccccccccccccccccccccccc;", 4419 Style); 4420 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4421 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4422 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4423 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4424 Style); 4425 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4426 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4427 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4428 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4429 Style); 4430 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4431 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4432 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4433 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4434 Style); 4435 verifyFormat("if () {\n" 4436 "} else if (aaaaa\n" 4437 " && bbbbb // break\n" 4438 " > ccccc) {\n" 4439 "}", 4440 Style); 4441 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4442 " && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4443 Style); 4444 verifyFormat("return (a)\n" 4445 " // comment\n" 4446 " + b;", 4447 Style); 4448 verifyFormat( 4449 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4450 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4451 " + cc;", 4452 Style); 4453 4454 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4455 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4456 Style); 4457 4458 // Forced by comments. 4459 verifyFormat( 4460 "unsigned ContentSize =\n" 4461 " sizeof(int16_t) // DWARF ARange version number\n" 4462 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4463 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4464 " + sizeof(int8_t); // Segment Size (in bytes)"); 4465 4466 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4467 " == boost::fusion::at_c<1>(iiii).second;", 4468 Style); 4469 4470 Style.ColumnLimit = 60; 4471 verifyFormat("zzzzzzzzzz\n" 4472 " = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4473 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4474 Style); 4475 4476 Style.ColumnLimit = 80; 4477 Style.IndentWidth = 4; 4478 Style.TabWidth = 4; 4479 Style.UseTab = FormatStyle::UT_Always; 4480 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4481 Style.AlignOperands = FormatStyle::OAS_DontAlign; 4482 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4483 "\t&& (someOtherLongishConditionPart1\n" 4484 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4485 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4486 "(someOtherLongishConditionPart1 || " 4487 "someOtherEvenLongerNestedConditionPart2);", 4488 Style)); 4489 } 4490 4491 TEST_F(FormatTest, ExpressionIndentationStrictAlign) { 4492 FormatStyle Style = getLLVMStyle(); 4493 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4494 Style.AlignOperands = FormatStyle::OAS_AlignAfterOperator; 4495 4496 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4497 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4498 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4499 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4500 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4501 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4502 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4503 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4504 " > ccccccccccccccccccccccccccccccccccccccccc;", 4505 Style); 4506 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4507 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4508 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4509 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4510 Style); 4511 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4512 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4513 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4514 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4515 Style); 4516 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4517 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4518 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4519 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4520 Style); 4521 verifyFormat("if () {\n" 4522 "} else if (aaaaa\n" 4523 " && bbbbb // break\n" 4524 " > ccccc) {\n" 4525 "}", 4526 Style); 4527 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4528 " && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4529 Style); 4530 verifyFormat("return (a)\n" 4531 " // comment\n" 4532 " + b;", 4533 Style); 4534 verifyFormat( 4535 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4536 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4537 " + cc;", 4538 Style); 4539 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 4540 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 4541 " : 3333333333333333;", 4542 Style); 4543 verifyFormat( 4544 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 4545 " : ccccccccccccccc ? dddddddddddddddddd\n" 4546 " : eeeeeeeeeeeeeeeeee)\n" 4547 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 4548 " : 3333333333333333;", 4549 Style); 4550 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4551 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4552 Style); 4553 4554 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4555 " == boost::fusion::at_c<1>(iiii).second;", 4556 Style); 4557 4558 Style.ColumnLimit = 60; 4559 verifyFormat("zzzzzzzzzzzzz\n" 4560 " = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4561 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4562 Style); 4563 4564 // Forced by comments. 4565 Style.ColumnLimit = 80; 4566 verifyFormat( 4567 "unsigned ContentSize\n" 4568 " = sizeof(int16_t) // DWARF ARange version number\n" 4569 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4570 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4571 " + sizeof(int8_t); // Segment Size (in bytes)", 4572 Style); 4573 4574 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4575 verifyFormat( 4576 "unsigned ContentSize =\n" 4577 " sizeof(int16_t) // DWARF ARange version number\n" 4578 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4579 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4580 " + sizeof(int8_t); // Segment Size (in bytes)", 4581 Style); 4582 4583 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4584 verifyFormat( 4585 "unsigned ContentSize =\n" 4586 " sizeof(int16_t) // DWARF ARange version number\n" 4587 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4588 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4589 " + sizeof(int8_t); // Segment Size (in bytes)", 4590 Style); 4591 } 4592 4593 TEST_F(FormatTest, EnforcedOperatorWraps) { 4594 // Here we'd like to wrap after the || operators, but a comment is forcing an 4595 // earlier wrap. 4596 verifyFormat("bool x = aaaaa //\n" 4597 " || bbbbb\n" 4598 " //\n" 4599 " || cccc;"); 4600 } 4601 4602 TEST_F(FormatTest, NoOperandAlignment) { 4603 FormatStyle Style = getLLVMStyle(); 4604 Style.AlignOperands = FormatStyle::OAS_DontAlign; 4605 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4606 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4608 Style); 4609 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4610 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4611 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4612 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4613 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4614 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4615 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4616 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4617 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4618 " > ccccccccccccccccccccccccccccccccccccccccc;", 4619 Style); 4620 4621 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4622 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4623 " + cc;", 4624 Style); 4625 verifyFormat("int a = aa\n" 4626 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4627 " * cccccccccccccccccccccccccccccccccccc;\n", 4628 Style); 4629 4630 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4631 verifyFormat("return (a > b\n" 4632 " // comment1\n" 4633 " // comment2\n" 4634 " || c);", 4635 Style); 4636 } 4637 4638 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4639 FormatStyle Style = getLLVMStyle(); 4640 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4641 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4642 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4643 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4644 Style); 4645 } 4646 4647 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4648 FormatStyle Style = getLLVMStyle(); 4649 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4650 Style.BinPackArguments = false; 4651 Style.ColumnLimit = 40; 4652 verifyFormat("void test() {\n" 4653 " someFunction(\n" 4654 " this + argument + is + quite\n" 4655 " + long + so + it + gets + wrapped\n" 4656 " + but + remains + bin - packed);\n" 4657 "}", 4658 Style); 4659 verifyFormat("void test() {\n" 4660 " someFunction(arg1,\n" 4661 " this + argument + is\n" 4662 " + quite + long + so\n" 4663 " + it + gets + wrapped\n" 4664 " + but + remains + bin\n" 4665 " - packed,\n" 4666 " arg3);\n" 4667 "}", 4668 Style); 4669 verifyFormat("void test() {\n" 4670 " someFunction(\n" 4671 " arg1,\n" 4672 " this + argument + has\n" 4673 " + anotherFunc(nested,\n" 4674 " calls + whose\n" 4675 " + arguments\n" 4676 " + are + also\n" 4677 " + wrapped,\n" 4678 " in + addition)\n" 4679 " + to + being + bin - packed,\n" 4680 " arg3);\n" 4681 "}", 4682 Style); 4683 4684 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4685 verifyFormat("void test() {\n" 4686 " someFunction(\n" 4687 " arg1,\n" 4688 " this + argument + has +\n" 4689 " anotherFunc(nested,\n" 4690 " calls + whose +\n" 4691 " arguments +\n" 4692 " are + also +\n" 4693 " wrapped,\n" 4694 " in + addition) +\n" 4695 " to + being + bin - packed,\n" 4696 " arg3);\n" 4697 "}", 4698 Style); 4699 } 4700 4701 TEST_F(FormatTest, ConstructorInitializers) { 4702 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4703 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4704 getLLVMStyleWithColumns(45)); 4705 verifyFormat("Constructor()\n" 4706 " : Inttializer(FitsOnTheLine) {}", 4707 getLLVMStyleWithColumns(44)); 4708 verifyFormat("Constructor()\n" 4709 " : Inttializer(FitsOnTheLine) {}", 4710 getLLVMStyleWithColumns(43)); 4711 4712 verifyFormat("template <typename T>\n" 4713 "Constructor() : Initializer(FitsOnTheLine) {}", 4714 getLLVMStyleWithColumns(45)); 4715 4716 verifyFormat( 4717 "SomeClass::Constructor()\n" 4718 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4719 4720 verifyFormat( 4721 "SomeClass::Constructor()\n" 4722 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4723 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4724 verifyFormat( 4725 "SomeClass::Constructor()\n" 4726 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4727 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4728 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4729 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4730 " : aaaaaaaaaa(aaaaaa) {}"); 4731 4732 verifyFormat("Constructor()\n" 4733 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4734 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4735 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4736 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4737 4738 verifyFormat("Constructor()\n" 4739 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4741 4742 verifyFormat("Constructor(int Parameter = 0)\n" 4743 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4744 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4745 verifyFormat("Constructor()\n" 4746 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4747 "}", 4748 getLLVMStyleWithColumns(60)); 4749 verifyFormat("Constructor()\n" 4750 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4751 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4752 4753 // Here a line could be saved by splitting the second initializer onto two 4754 // lines, but that is not desirable. 4755 verifyFormat("Constructor()\n" 4756 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4757 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4758 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4759 4760 FormatStyle OnePerLine = getLLVMStyle(); 4761 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4762 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4763 verifyFormat("SomeClass::Constructor()\n" 4764 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4765 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4766 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4767 OnePerLine); 4768 verifyFormat("SomeClass::Constructor()\n" 4769 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4770 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4771 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4772 OnePerLine); 4773 verifyFormat("MyClass::MyClass(int var)\n" 4774 " : some_var_(var), // 4 space indent\n" 4775 " some_other_var_(var + 1) { // lined up\n" 4776 "}", 4777 OnePerLine); 4778 verifyFormat("Constructor()\n" 4779 " : aaaaa(aaaaaa),\n" 4780 " aaaaa(aaaaaa),\n" 4781 " aaaaa(aaaaaa),\n" 4782 " aaaaa(aaaaaa),\n" 4783 " aaaaa(aaaaaa) {}", 4784 OnePerLine); 4785 verifyFormat("Constructor()\n" 4786 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4787 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4788 OnePerLine); 4789 OnePerLine.BinPackParameters = false; 4790 verifyFormat( 4791 "Constructor()\n" 4792 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4793 " aaaaaaaaaaa().aaa(),\n" 4794 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4795 OnePerLine); 4796 OnePerLine.ColumnLimit = 60; 4797 verifyFormat("Constructor()\n" 4798 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4799 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4800 OnePerLine); 4801 4802 EXPECT_EQ("Constructor()\n" 4803 " : // Comment forcing unwanted break.\n" 4804 " aaaa(aaaa) {}", 4805 format("Constructor() :\n" 4806 " // Comment forcing unwanted break.\n" 4807 " aaaa(aaaa) {}")); 4808 } 4809 4810 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4811 FormatStyle Style = getLLVMStyle(); 4812 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4813 Style.ColumnLimit = 60; 4814 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4815 Style.AllowAllConstructorInitializersOnNextLine = true; 4816 Style.BinPackParameters = false; 4817 4818 for (int i = 0; i < 4; ++i) { 4819 // Test all combinations of parameters that should not have an effect. 4820 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4821 Style.AllowAllArgumentsOnNextLine = i & 2; 4822 4823 Style.AllowAllConstructorInitializersOnNextLine = true; 4824 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4825 verifyFormat("Constructor()\n" 4826 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4827 Style); 4828 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4829 4830 Style.AllowAllConstructorInitializersOnNextLine = false; 4831 verifyFormat("Constructor()\n" 4832 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4833 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4834 Style); 4835 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4836 4837 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4838 Style.AllowAllConstructorInitializersOnNextLine = true; 4839 verifyFormat("Constructor()\n" 4840 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4841 Style); 4842 4843 Style.AllowAllConstructorInitializersOnNextLine = false; 4844 verifyFormat("Constructor()\n" 4845 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4846 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4847 Style); 4848 4849 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4850 Style.AllowAllConstructorInitializersOnNextLine = true; 4851 verifyFormat("Constructor() :\n" 4852 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4853 Style); 4854 4855 Style.AllowAllConstructorInitializersOnNextLine = false; 4856 verifyFormat("Constructor() :\n" 4857 " aaaaaaaaaaaaaaaaaa(a),\n" 4858 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4859 Style); 4860 } 4861 4862 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4863 // AllowAllConstructorInitializersOnNextLine in all 4864 // BreakConstructorInitializers modes 4865 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4866 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4867 Style.AllowAllConstructorInitializersOnNextLine = false; 4868 verifyFormat("SomeClassWithALongName::Constructor(\n" 4869 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4870 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4871 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4872 Style); 4873 4874 Style.AllowAllConstructorInitializersOnNextLine = true; 4875 verifyFormat("SomeClassWithALongName::Constructor(\n" 4876 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4877 " int bbbbbbbbbbbbb,\n" 4878 " int cccccccccccccccc)\n" 4879 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4880 Style); 4881 4882 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4883 Style.AllowAllConstructorInitializersOnNextLine = false; 4884 verifyFormat("SomeClassWithALongName::Constructor(\n" 4885 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4886 " int bbbbbbbbbbbbb)\n" 4887 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4888 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4889 Style); 4890 4891 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4892 4893 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4894 verifyFormat("SomeClassWithALongName::Constructor(\n" 4895 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4896 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4897 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4898 Style); 4899 4900 Style.AllowAllConstructorInitializersOnNextLine = true; 4901 verifyFormat("SomeClassWithALongName::Constructor(\n" 4902 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4903 " int bbbbbbbbbbbbb,\n" 4904 " int cccccccccccccccc)\n" 4905 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4906 Style); 4907 4908 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4909 Style.AllowAllConstructorInitializersOnNextLine = false; 4910 verifyFormat("SomeClassWithALongName::Constructor(\n" 4911 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4912 " int bbbbbbbbbbbbb)\n" 4913 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4914 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4915 Style); 4916 4917 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4918 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4919 verifyFormat("SomeClassWithALongName::Constructor(\n" 4920 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4921 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4922 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4923 Style); 4924 4925 Style.AllowAllConstructorInitializersOnNextLine = true; 4926 verifyFormat("SomeClassWithALongName::Constructor(\n" 4927 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4928 " int bbbbbbbbbbbbb,\n" 4929 " int cccccccccccccccc) :\n" 4930 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4931 Style); 4932 4933 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4934 Style.AllowAllConstructorInitializersOnNextLine = false; 4935 verifyFormat("SomeClassWithALongName::Constructor(\n" 4936 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4937 " int bbbbbbbbbbbbb) :\n" 4938 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4939 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4940 Style); 4941 } 4942 4943 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4944 FormatStyle Style = getLLVMStyle(); 4945 Style.ColumnLimit = 60; 4946 Style.BinPackArguments = false; 4947 for (int i = 0; i < 4; ++i) { 4948 // Test all combinations of parameters that should not have an effect. 4949 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4950 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4951 4952 Style.AllowAllArgumentsOnNextLine = true; 4953 verifyFormat("void foo() {\n" 4954 " FunctionCallWithReallyLongName(\n" 4955 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4956 "}", 4957 Style); 4958 Style.AllowAllArgumentsOnNextLine = false; 4959 verifyFormat("void foo() {\n" 4960 " FunctionCallWithReallyLongName(\n" 4961 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4962 " bbbbbbbbbbbb);\n" 4963 "}", 4964 Style); 4965 4966 Style.AllowAllArgumentsOnNextLine = true; 4967 verifyFormat("void foo() {\n" 4968 " auto VariableWithReallyLongName = {\n" 4969 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4970 "}", 4971 Style); 4972 Style.AllowAllArgumentsOnNextLine = false; 4973 verifyFormat("void foo() {\n" 4974 " auto VariableWithReallyLongName = {\n" 4975 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4976 " bbbbbbbbbbbb};\n" 4977 "}", 4978 Style); 4979 } 4980 4981 // This parameter should not affect declarations. 4982 Style.BinPackParameters = false; 4983 Style.AllowAllArgumentsOnNextLine = false; 4984 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4985 verifyFormat("void FunctionCallWithReallyLongName(\n" 4986 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4987 Style); 4988 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4989 verifyFormat("void FunctionCallWithReallyLongName(\n" 4990 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4991 " int bbbbbbbbbbbb);", 4992 Style); 4993 } 4994 4995 TEST_F(FormatTest, AllowAllArgumentsOnNextLineDontAlign) { 4996 // Check that AllowAllArgumentsOnNextLine is respected for both BAS_DontAlign 4997 // and BAS_Align. 4998 auto Style = getLLVMStyle(); 4999 Style.ColumnLimit = 35; 5000 StringRef Input = "functionCall(paramA, paramB, paramC);\n" 5001 "void functionDecl(int A, int B, int C);"; 5002 Style.AllowAllArgumentsOnNextLine = false; 5003 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5004 EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n" 5005 " paramC);\n" 5006 "void functionDecl(int A, int B,\n" 5007 " int C);"), 5008 format(Input, Style)); 5009 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5010 EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n" 5011 " paramC);\n" 5012 "void functionDecl(int A, int B,\n" 5013 " int C);"), 5014 format(Input, Style)); 5015 // However, BAS_AlwaysBreak should take precedence over 5016 // AllowAllArgumentsOnNextLine. 5017 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5018 EXPECT_EQ(StringRef("functionCall(\n" 5019 " paramA, paramB, paramC);\n" 5020 "void functionDecl(\n" 5021 " int A, int B, int C);"), 5022 format(Input, Style)); 5023 5024 // When AllowAllArgumentsOnNextLine is set, we prefer breaking before the 5025 // first argument. 5026 Style.AllowAllArgumentsOnNextLine = true; 5027 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5028 EXPECT_EQ(StringRef("functionCall(\n" 5029 " paramA, paramB, paramC);\n" 5030 "void functionDecl(\n" 5031 " int A, int B, int C);"), 5032 format(Input, Style)); 5033 // It wouldn't fit on one line with aligned parameters so this setting 5034 // doesn't change anything for BAS_Align. 5035 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5036 EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n" 5037 " paramC);\n" 5038 "void functionDecl(int A, int B,\n" 5039 " int C);"), 5040 format(Input, Style)); 5041 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5042 EXPECT_EQ(StringRef("functionCall(\n" 5043 " paramA, paramB, paramC);\n" 5044 "void functionDecl(\n" 5045 " int A, int B, int C);"), 5046 format(Input, Style)); 5047 } 5048 5049 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 5050 FormatStyle Style = getLLVMStyle(); 5051 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 5052 5053 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 5054 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 5055 getStyleWithColumns(Style, 45)); 5056 verifyFormat("Constructor() :\n" 5057 " Initializer(FitsOnTheLine) {}", 5058 getStyleWithColumns(Style, 44)); 5059 verifyFormat("Constructor() :\n" 5060 " Initializer(FitsOnTheLine) {}", 5061 getStyleWithColumns(Style, 43)); 5062 5063 verifyFormat("template <typename T>\n" 5064 "Constructor() : Initializer(FitsOnTheLine) {}", 5065 getStyleWithColumns(Style, 50)); 5066 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5067 verifyFormat( 5068 "SomeClass::Constructor() :\n" 5069 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5070 Style); 5071 5072 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 5073 verifyFormat( 5074 "SomeClass::Constructor() :\n" 5075 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5076 Style); 5077 5078 verifyFormat( 5079 "SomeClass::Constructor() :\n" 5080 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5081 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5082 Style); 5083 verifyFormat( 5084 "SomeClass::Constructor() :\n" 5085 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5086 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5087 Style); 5088 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5089 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5090 " aaaaaaaaaa(aaaaaa) {}", 5091 Style); 5092 5093 verifyFormat("Constructor() :\n" 5094 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5095 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5096 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5097 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 5098 Style); 5099 5100 verifyFormat("Constructor() :\n" 5101 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5102 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5103 Style); 5104 5105 verifyFormat("Constructor(int Parameter = 0) :\n" 5106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 5107 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 5108 Style); 5109 verifyFormat("Constructor() :\n" 5110 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 5111 "}", 5112 getStyleWithColumns(Style, 60)); 5113 verifyFormat("Constructor() :\n" 5114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5115 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 5116 Style); 5117 5118 // Here a line could be saved by splitting the second initializer onto two 5119 // lines, but that is not desirable. 5120 verifyFormat("Constructor() :\n" 5121 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 5122 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 5123 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5124 Style); 5125 5126 FormatStyle OnePerLine = Style; 5127 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5128 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 5129 verifyFormat("SomeClass::Constructor() :\n" 5130 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5131 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5132 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5133 OnePerLine); 5134 verifyFormat("SomeClass::Constructor() :\n" 5135 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 5136 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5137 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5138 OnePerLine); 5139 verifyFormat("MyClass::MyClass(int var) :\n" 5140 " some_var_(var), // 4 space indent\n" 5141 " some_other_var_(var + 1) { // lined up\n" 5142 "}", 5143 OnePerLine); 5144 verifyFormat("Constructor() :\n" 5145 " aaaaa(aaaaaa),\n" 5146 " aaaaa(aaaaaa),\n" 5147 " aaaaa(aaaaaa),\n" 5148 " aaaaa(aaaaaa),\n" 5149 " aaaaa(aaaaaa) {}", 5150 OnePerLine); 5151 verifyFormat("Constructor() :\n" 5152 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 5153 " aaaaaaaaaaaaaaaaaaaaaa) {}", 5154 OnePerLine); 5155 OnePerLine.BinPackParameters = false; 5156 verifyFormat("Constructor() :\n" 5157 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5158 " aaaaaaaaaaa().aaa(),\n" 5159 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5160 OnePerLine); 5161 OnePerLine.ColumnLimit = 60; 5162 verifyFormat("Constructor() :\n" 5163 " aaaaaaaaaaaaaaaaaaaa(a),\n" 5164 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 5165 OnePerLine); 5166 5167 EXPECT_EQ("Constructor() :\n" 5168 " // Comment forcing unwanted break.\n" 5169 " aaaa(aaaa) {}", 5170 format("Constructor() :\n" 5171 " // Comment forcing unwanted break.\n" 5172 " aaaa(aaaa) {}", 5173 Style)); 5174 5175 Style.ColumnLimit = 0; 5176 verifyFormat("SomeClass::Constructor() :\n" 5177 " a(a) {}", 5178 Style); 5179 verifyFormat("SomeClass::Constructor() noexcept :\n" 5180 " a(a) {}", 5181 Style); 5182 verifyFormat("SomeClass::Constructor() :\n" 5183 " a(a), b(b), c(c) {}", 5184 Style); 5185 verifyFormat("SomeClass::Constructor() :\n" 5186 " a(a) {\n" 5187 " foo();\n" 5188 " bar();\n" 5189 "}", 5190 Style); 5191 5192 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 5193 verifyFormat("SomeClass::Constructor() :\n" 5194 " a(a), b(b), c(c) {\n" 5195 "}", 5196 Style); 5197 verifyFormat("SomeClass::Constructor() :\n" 5198 " a(a) {\n" 5199 "}", 5200 Style); 5201 5202 Style.ColumnLimit = 80; 5203 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 5204 Style.ConstructorInitializerIndentWidth = 2; 5205 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 5206 verifyFormat("SomeClass::Constructor() :\n" 5207 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5208 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 5209 Style); 5210 5211 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 5212 // well 5213 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 5214 verifyFormat( 5215 "class SomeClass\n" 5216 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5217 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5218 Style); 5219 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 5220 verifyFormat( 5221 "class SomeClass\n" 5222 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5223 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5224 Style); 5225 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 5226 verifyFormat( 5227 "class SomeClass :\n" 5228 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5229 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5230 Style); 5231 } 5232 5233 #ifndef EXPENSIVE_CHECKS 5234 // Expensive checks enables libstdc++ checking which includes validating the 5235 // state of ranges used in std::priority_queue - this blows out the 5236 // runtime/scalability of the function and makes this test unacceptably slow. 5237 TEST_F(FormatTest, MemoizationTests) { 5238 // This breaks if the memoization lookup does not take \c Indent and 5239 // \c LastSpace into account. 5240 verifyFormat( 5241 "extern CFRunLoopTimerRef\n" 5242 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 5243 " CFTimeInterval interval, CFOptionFlags flags,\n" 5244 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 5245 " CFRunLoopTimerContext *context) {}"); 5246 5247 // Deep nesting somewhat works around our memoization. 5248 verifyFormat( 5249 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5250 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5251 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5252 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5253 " aaaaa())))))))))))))))))))))))))))))))))))))));", 5254 getLLVMStyleWithColumns(65)); 5255 verifyFormat( 5256 "aaaaa(\n" 5257 " aaaaa,\n" 5258 " aaaaa(\n" 5259 " aaaaa,\n" 5260 " aaaaa(\n" 5261 " aaaaa,\n" 5262 " aaaaa(\n" 5263 " aaaaa,\n" 5264 " aaaaa(\n" 5265 " aaaaa,\n" 5266 " aaaaa(\n" 5267 " aaaaa,\n" 5268 " aaaaa(\n" 5269 " aaaaa,\n" 5270 " aaaaa(\n" 5271 " aaaaa,\n" 5272 " aaaaa(\n" 5273 " aaaaa,\n" 5274 " aaaaa(\n" 5275 " aaaaa,\n" 5276 " aaaaa(\n" 5277 " aaaaa,\n" 5278 " aaaaa(\n" 5279 " aaaaa,\n" 5280 " aaaaa))))))))))));", 5281 getLLVMStyleWithColumns(65)); 5282 verifyFormat( 5283 "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" 5284 " a),\n" 5285 " a),\n" 5286 " a),\n" 5287 " a),\n" 5288 " a),\n" 5289 " a),\n" 5290 " a),\n" 5291 " a),\n" 5292 " a),\n" 5293 " a),\n" 5294 " a),\n" 5295 " a),\n" 5296 " a),\n" 5297 " a),\n" 5298 " a),\n" 5299 " a),\n" 5300 " a)", 5301 getLLVMStyleWithColumns(65)); 5302 5303 // This test takes VERY long when memoization is broken. 5304 FormatStyle OnePerLine = getLLVMStyle(); 5305 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5306 OnePerLine.BinPackParameters = false; 5307 std::string input = "Constructor()\n" 5308 " : aaaa(a,\n"; 5309 for (unsigned i = 0, e = 80; i != e; ++i) { 5310 input += " a,\n"; 5311 } 5312 input += " a) {}"; 5313 verifyFormat(input, OnePerLine); 5314 } 5315 #endif 5316 5317 TEST_F(FormatTest, BreaksAsHighAsPossible) { 5318 verifyFormat( 5319 "void f() {\n" 5320 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 5321 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 5322 " f();\n" 5323 "}"); 5324 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 5325 " Intervals[i - 1].getRange().getLast()) {\n}"); 5326 } 5327 5328 TEST_F(FormatTest, BreaksFunctionDeclarations) { 5329 // Principially, we break function declarations in a certain order: 5330 // 1) break amongst arguments. 5331 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 5332 " Cccccccccccccc cccccccccccccc);"); 5333 verifyFormat("template <class TemplateIt>\n" 5334 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 5335 " TemplateIt *stop) {}"); 5336 5337 // 2) break after return type. 5338 verifyFormat( 5339 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5340 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 5341 getGoogleStyle()); 5342 5343 // 3) break after (. 5344 verifyFormat( 5345 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 5346 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 5347 getGoogleStyle()); 5348 5349 // 4) break before after nested name specifiers. 5350 verifyFormat( 5351 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5352 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 5353 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 5354 getGoogleStyle()); 5355 5356 // However, there are exceptions, if a sufficient amount of lines can be 5357 // saved. 5358 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 5359 // more adjusting. 5360 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5361 " Cccccccccccccc cccccccccc,\n" 5362 " Cccccccccccccc cccccccccc,\n" 5363 " Cccccccccccccc cccccccccc,\n" 5364 " Cccccccccccccc cccccccccc);"); 5365 verifyFormat( 5366 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5367 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5368 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5369 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 5370 getGoogleStyle()); 5371 verifyFormat( 5372 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5373 " Cccccccccccccc cccccccccc,\n" 5374 " Cccccccccccccc cccccccccc,\n" 5375 " Cccccccccccccc cccccccccc,\n" 5376 " Cccccccccccccc cccccccccc,\n" 5377 " Cccccccccccccc cccccccccc,\n" 5378 " Cccccccccccccc cccccccccc);"); 5379 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5380 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5381 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5382 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5383 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 5384 5385 // Break after multi-line parameters. 5386 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5389 " bbbb bbbb);"); 5390 verifyFormat("void SomeLoooooooooooongFunction(\n" 5391 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5392 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5393 " int bbbbbbbbbbbbb);"); 5394 5395 // Treat overloaded operators like other functions. 5396 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5397 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 5398 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5399 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 5400 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5401 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 5402 verifyGoogleFormat( 5403 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 5404 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5405 verifyGoogleFormat( 5406 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 5407 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5408 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5409 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5410 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 5411 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5412 verifyGoogleFormat( 5413 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 5414 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5415 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 5416 verifyGoogleFormat("template <typename T>\n" 5417 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5418 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 5419 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 5420 5421 FormatStyle Style = getLLVMStyle(); 5422 Style.PointerAlignment = FormatStyle::PAS_Left; 5423 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5424 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 5425 Style); 5426 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 5427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5428 Style); 5429 } 5430 5431 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 5432 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 5433 // Prefer keeping `::` followed by `operator` together. 5434 EXPECT_EQ("const aaaa::bbbbbbb &\n" 5435 "ccccccccc::operator++() {\n" 5436 " stuff();\n" 5437 "}", 5438 format("const aaaa::bbbbbbb\n" 5439 "&ccccccccc::operator++() { stuff(); }", 5440 getLLVMStyleWithColumns(40))); 5441 } 5442 5443 TEST_F(FormatTest, TrailingReturnType) { 5444 verifyFormat("auto foo() -> int;\n"); 5445 // correct trailing return type spacing 5446 verifyFormat("auto operator->() -> int;\n"); 5447 verifyFormat("auto operator++(int) -> int;\n"); 5448 5449 verifyFormat("struct S {\n" 5450 " auto bar() const -> int;\n" 5451 "};"); 5452 verifyFormat("template <size_t Order, typename T>\n" 5453 "auto load_img(const std::string &filename)\n" 5454 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5455 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5456 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5457 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5458 verifyFormat("template <typename T>\n" 5459 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5460 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5461 5462 // Not trailing return types. 5463 verifyFormat("void f() { auto a = b->c(); }"); 5464 } 5465 5466 TEST_F(FormatTest, DeductionGuides) { 5467 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5468 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5469 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5470 verifyFormat( 5471 "template <class... T>\n" 5472 "array(T &&...t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5473 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5474 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5475 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5476 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5477 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5478 verifyFormat("template <class T> x() -> x<1>;"); 5479 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5480 5481 // Ensure not deduction guides. 5482 verifyFormat("c()->f<int>();"); 5483 verifyFormat("x()->foo<1>;"); 5484 verifyFormat("x = p->foo<3>();"); 5485 verifyFormat("x()->x<1>();"); 5486 verifyFormat("x()->x<1>;"); 5487 } 5488 5489 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5490 // Avoid breaking before trailing 'const' or other trailing annotations, if 5491 // they are not function-like. 5492 FormatStyle Style = getGoogleStyle(); 5493 Style.ColumnLimit = 47; 5494 verifyFormat("void someLongFunction(\n" 5495 " int someLoooooooooooooongParameter) const {\n}", 5496 getLLVMStyleWithColumns(47)); 5497 verifyFormat("LoooooongReturnType\n" 5498 "someLoooooooongFunction() const {}", 5499 getLLVMStyleWithColumns(47)); 5500 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5501 " const {}", 5502 Style); 5503 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5504 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5505 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5506 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5507 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5508 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5509 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5510 " aaaaaaaaaaa aaaaa) const override;"); 5511 verifyGoogleFormat( 5512 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5513 " const override;"); 5514 5515 // Even if the first parameter has to be wrapped. 5516 verifyFormat("void someLongFunction(\n" 5517 " int someLongParameter) const {}", 5518 getLLVMStyleWithColumns(46)); 5519 verifyFormat("void someLongFunction(\n" 5520 " int someLongParameter) const {}", 5521 Style); 5522 verifyFormat("void someLongFunction(\n" 5523 " int someLongParameter) override {}", 5524 Style); 5525 verifyFormat("void someLongFunction(\n" 5526 " int someLongParameter) OVERRIDE {}", 5527 Style); 5528 verifyFormat("void someLongFunction(\n" 5529 " int someLongParameter) final {}", 5530 Style); 5531 verifyFormat("void someLongFunction(\n" 5532 " int someLongParameter) FINAL {}", 5533 Style); 5534 verifyFormat("void someLongFunction(\n" 5535 " int parameter) const override {}", 5536 Style); 5537 5538 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5539 verifyFormat("void someLongFunction(\n" 5540 " int someLongParameter) const\n" 5541 "{\n" 5542 "}", 5543 Style); 5544 5545 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5546 verifyFormat("void someLongFunction(\n" 5547 " int someLongParameter) const\n" 5548 " {\n" 5549 " }", 5550 Style); 5551 5552 // Unless these are unknown annotations. 5553 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5554 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5555 " LONG_AND_UGLY_ANNOTATION;"); 5556 5557 // Breaking before function-like trailing annotations is fine to keep them 5558 // close to their arguments. 5559 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5560 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5561 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5562 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5563 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5564 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5565 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5566 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5567 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5568 5569 verifyFormat( 5570 "void aaaaaaaaaaaaaaaaaa()\n" 5571 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5572 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5573 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5574 " __attribute__((unused));"); 5575 verifyGoogleFormat( 5576 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5577 " GUARDED_BY(aaaaaaaaaaaa);"); 5578 verifyGoogleFormat( 5579 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5580 " GUARDED_BY(aaaaaaaaaaaa);"); 5581 verifyGoogleFormat( 5582 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5583 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5584 verifyGoogleFormat( 5585 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5586 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5587 } 5588 5589 TEST_F(FormatTest, FunctionAnnotations) { 5590 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5591 "int OldFunction(const string ¶meter) {}"); 5592 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5593 "string OldFunction(const string ¶meter) {}"); 5594 verifyFormat("template <typename T>\n" 5595 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5596 "string OldFunction(const string ¶meter) {}"); 5597 5598 // Not function annotations. 5599 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5600 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5601 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5602 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5603 verifyFormat("MACRO(abc).function() // wrap\n" 5604 " << abc;"); 5605 verifyFormat("MACRO(abc)->function() // wrap\n" 5606 " << abc;"); 5607 verifyFormat("MACRO(abc)::function() // wrap\n" 5608 " << abc;"); 5609 } 5610 5611 TEST_F(FormatTest, BreaksDesireably) { 5612 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5613 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5614 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5615 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5616 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5617 "}"); 5618 5619 verifyFormat( 5620 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5622 5623 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5625 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5626 5627 verifyFormat( 5628 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5629 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5630 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5631 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5633 5634 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5635 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5636 5637 verifyFormat( 5638 "void f() {\n" 5639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5640 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5641 "}"); 5642 verifyFormat( 5643 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5645 verifyFormat( 5646 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5648 verifyFormat( 5649 "aaaaaa(aaa,\n" 5650 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5651 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5652 " aaaa);"); 5653 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5654 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5656 5657 // Indent consistently independent of call expression and unary operator. 5658 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5659 " dddddddddddddddddddddddddddddd));"); 5660 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5661 " dddddddddddddddddddddddddddddd));"); 5662 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5663 " dddddddddddddddddddddddddddddd));"); 5664 5665 // This test case breaks on an incorrect memoization, i.e. an optimization not 5666 // taking into account the StopAt value. 5667 verifyFormat( 5668 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5669 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5670 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5671 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5672 5673 verifyFormat("{\n {\n {\n" 5674 " Annotation.SpaceRequiredBefore =\n" 5675 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5676 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5677 " }\n }\n}"); 5678 5679 // Break on an outer level if there was a break on an inner level. 5680 EXPECT_EQ("f(g(h(a, // comment\n" 5681 " b, c),\n" 5682 " d, e),\n" 5683 " x, y);", 5684 format("f(g(h(a, // comment\n" 5685 " b, c), d, e), x, y);")); 5686 5687 // Prefer breaking similar line breaks. 5688 verifyFormat( 5689 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5690 " NSTrackingMouseEnteredAndExited |\n" 5691 " NSTrackingActiveAlways;"); 5692 } 5693 5694 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5695 FormatStyle NoBinPacking = getGoogleStyle(); 5696 NoBinPacking.BinPackParameters = false; 5697 NoBinPacking.BinPackArguments = true; 5698 verifyFormat("void f() {\n" 5699 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5701 "}", 5702 NoBinPacking); 5703 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5704 " int aaaaaaaaaaaaaaaaaaaa,\n" 5705 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5706 NoBinPacking); 5707 5708 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5709 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5710 " vector<int> bbbbbbbbbbbbbbb);", 5711 NoBinPacking); 5712 // FIXME: This behavior difference is probably not wanted. However, currently 5713 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5714 // template arguments from BreakBeforeParameter being set because of the 5715 // one-per-line formatting. 5716 verifyFormat( 5717 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5718 " aaaaaaaaaa> aaaaaaaaaa);", 5719 NoBinPacking); 5720 verifyFormat( 5721 "void fffffffffff(\n" 5722 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5723 " aaaaaaaaaa);"); 5724 } 5725 5726 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5727 FormatStyle NoBinPacking = getGoogleStyle(); 5728 NoBinPacking.BinPackParameters = false; 5729 NoBinPacking.BinPackArguments = false; 5730 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5731 " aaaaaaaaaaaaaaaaaaaa,\n" 5732 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5733 NoBinPacking); 5734 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5735 " aaaaaaaaaaaaa,\n" 5736 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5737 NoBinPacking); 5738 verifyFormat( 5739 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5740 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5742 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5744 NoBinPacking); 5745 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5746 " .aaaaaaaaaaaaaaaaaa();", 5747 NoBinPacking); 5748 verifyFormat("void f() {\n" 5749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5750 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5751 "}", 5752 NoBinPacking); 5753 5754 verifyFormat( 5755 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5756 " aaaaaaaaaaaa,\n" 5757 " aaaaaaaaaaaa);", 5758 NoBinPacking); 5759 verifyFormat( 5760 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5761 " ddddddddddddddddddddddddddddd),\n" 5762 " test);", 5763 NoBinPacking); 5764 5765 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5766 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5767 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5768 " aaaaaaaaaaaaaaaaaa;", 5769 NoBinPacking); 5770 verifyFormat("a(\"a\"\n" 5771 " \"a\",\n" 5772 " a);"); 5773 5774 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5775 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5776 " aaaaaaaaa,\n" 5777 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5778 NoBinPacking); 5779 verifyFormat( 5780 "void f() {\n" 5781 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5782 " .aaaaaaa();\n" 5783 "}", 5784 NoBinPacking); 5785 verifyFormat( 5786 "template <class SomeType, class SomeOtherType>\n" 5787 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5788 NoBinPacking); 5789 } 5790 5791 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5792 FormatStyle Style = getLLVMStyleWithColumns(15); 5793 Style.ExperimentalAutoDetectBinPacking = true; 5794 EXPECT_EQ("aaa(aaaa,\n" 5795 " aaaa,\n" 5796 " aaaa);\n" 5797 "aaa(aaaa,\n" 5798 " aaaa,\n" 5799 " aaaa);", 5800 format("aaa(aaaa,\n" // one-per-line 5801 " aaaa,\n" 5802 " aaaa );\n" 5803 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5804 Style)); 5805 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5806 " aaaa);\n" 5807 "aaa(aaaa, aaaa,\n" 5808 " aaaa);", 5809 format("aaa(aaaa, aaaa,\n" // bin-packed 5810 " aaaa );\n" 5811 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5812 Style)); 5813 } 5814 5815 TEST_F(FormatTest, FormatsBuilderPattern) { 5816 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5817 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5818 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5819 " .StartsWith(\".init\", ORDER_INIT)\n" 5820 " .StartsWith(\".fini\", ORDER_FINI)\n" 5821 " .StartsWith(\".hash\", ORDER_HASH)\n" 5822 " .Default(ORDER_TEXT);\n"); 5823 5824 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5825 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5826 verifyFormat("aaaaaaa->aaaaaaa\n" 5827 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5829 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5830 verifyFormat( 5831 "aaaaaaa->aaaaaaa\n" 5832 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5833 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5834 verifyFormat( 5835 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5836 " aaaaaaaaaaaaaa);"); 5837 verifyFormat( 5838 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5839 " aaaaaa->aaaaaaaaaaaa()\n" 5840 " ->aaaaaaaaaaaaaaaa(\n" 5841 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5842 " ->aaaaaaaaaaaaaaaaa();"); 5843 verifyGoogleFormat( 5844 "void f() {\n" 5845 " someo->Add((new util::filetools::Handler(dir))\n" 5846 " ->OnEvent1(NewPermanentCallback(\n" 5847 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5848 " ->OnEvent2(NewPermanentCallback(\n" 5849 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5850 " ->OnEvent3(NewPermanentCallback(\n" 5851 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5852 " ->OnEvent5(NewPermanentCallback(\n" 5853 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5854 " ->OnEvent6(NewPermanentCallback(\n" 5855 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5856 "}"); 5857 5858 verifyFormat( 5859 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5860 verifyFormat("aaaaaaaaaaaaaaa()\n" 5861 " .aaaaaaaaaaaaaaa()\n" 5862 " .aaaaaaaaaaaaaaa()\n" 5863 " .aaaaaaaaaaaaaaa()\n" 5864 " .aaaaaaaaaaaaaaa();"); 5865 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5866 " .aaaaaaaaaaaaaaa()\n" 5867 " .aaaaaaaaaaaaaaa()\n" 5868 " .aaaaaaaaaaaaaaa();"); 5869 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5870 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5871 " .aaaaaaaaaaaaaaa();"); 5872 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5873 " ->aaaaaaaaaaaaaae(0)\n" 5874 " ->aaaaaaaaaaaaaaa();"); 5875 5876 // Don't linewrap after very short segments. 5877 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5878 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5879 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5880 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5881 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5882 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5883 verifyFormat("aaa()\n" 5884 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5885 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5886 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5887 5888 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5889 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5890 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5891 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5892 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5893 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5894 5895 // Prefer not to break after empty parentheses. 5896 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5897 " First->LastNewlineOffset);"); 5898 5899 // Prefer not to create "hanging" indents. 5900 verifyFormat( 5901 "return !soooooooooooooome_map\n" 5902 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5903 " .second;"); 5904 verifyFormat( 5905 "return aaaaaaaaaaaaaaaa\n" 5906 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5907 " .aaaa(aaaaaaaaaaaaaa);"); 5908 // No hanging indent here. 5909 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5911 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5912 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5913 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5914 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5915 getLLVMStyleWithColumns(60)); 5916 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5917 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5918 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5919 getLLVMStyleWithColumns(59)); 5920 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5921 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5922 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5923 5924 // Dont break if only closing statements before member call 5925 verifyFormat("test() {\n" 5926 " ([]() -> {\n" 5927 " int b = 32;\n" 5928 " return 3;\n" 5929 " }).foo();\n" 5930 "}"); 5931 verifyFormat("test() {\n" 5932 " (\n" 5933 " []() -> {\n" 5934 " int b = 32;\n" 5935 " return 3;\n" 5936 " },\n" 5937 " foo, bar)\n" 5938 " .foo();\n" 5939 "}"); 5940 verifyFormat("test() {\n" 5941 " ([]() -> {\n" 5942 " int b = 32;\n" 5943 " return 3;\n" 5944 " })\n" 5945 " .foo()\n" 5946 " .bar();\n" 5947 "}"); 5948 verifyFormat("test() {\n" 5949 " ([]() -> {\n" 5950 " int b = 32;\n" 5951 " return 3;\n" 5952 " })\n" 5953 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5954 " \"bbbb\");\n" 5955 "}", 5956 getLLVMStyleWithColumns(30)); 5957 } 5958 5959 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5960 verifyFormat( 5961 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5962 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5963 verifyFormat( 5964 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5965 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5966 5967 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5968 " ccccccccccccccccccccccccc) {\n}"); 5969 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5970 " ccccccccccccccccccccccccc) {\n}"); 5971 5972 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5973 " ccccccccccccccccccccccccc) {\n}"); 5974 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5975 " ccccccccccccccccccccccccc) {\n}"); 5976 5977 verifyFormat( 5978 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5979 " ccccccccccccccccccccccccc) {\n}"); 5980 verifyFormat( 5981 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5982 " ccccccccccccccccccccccccc) {\n}"); 5983 5984 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5985 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5986 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5987 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5988 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5989 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5990 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5991 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5992 5993 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5994 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5995 " aaaaaaaaaaaaaaa != aa) {\n}"); 5996 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5997 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5998 " aaaaaaaaaaaaaaa != aa) {\n}"); 5999 } 6000 6001 TEST_F(FormatTest, BreaksAfterAssignments) { 6002 verifyFormat( 6003 "unsigned Cost =\n" 6004 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 6005 " SI->getPointerAddressSpaceee());\n"); 6006 verifyFormat( 6007 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 6008 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 6009 6010 verifyFormat( 6011 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 6012 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 6013 verifyFormat("unsigned OriginalStartColumn =\n" 6014 " SourceMgr.getSpellingColumnNumber(\n" 6015 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 6016 " 1;"); 6017 } 6018 6019 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 6020 FormatStyle Style = getLLVMStyle(); 6021 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6022 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 6023 Style); 6024 6025 Style.PenaltyBreakAssignment = 20; 6026 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 6027 " cccccccccccccccccccccccccc;", 6028 Style); 6029 } 6030 6031 TEST_F(FormatTest, AlignsAfterAssignments) { 6032 verifyFormat( 6033 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6034 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6035 verifyFormat( 6036 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6037 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6038 verifyFormat( 6039 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6040 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6041 verifyFormat( 6042 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6043 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 6044 verifyFormat( 6045 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 6046 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 6047 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 6048 } 6049 6050 TEST_F(FormatTest, AlignsAfterReturn) { 6051 verifyFormat( 6052 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6053 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6054 verifyFormat( 6055 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6056 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 6057 verifyFormat( 6058 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 6059 " aaaaaaaaaaaaaaaaaaaaaa();"); 6060 verifyFormat( 6061 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 6062 " aaaaaaaaaaaaaaaaaaaaaa());"); 6063 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6065 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 6067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6068 verifyFormat("return\n" 6069 " // true if code is one of a or b.\n" 6070 " code == a || code == b;"); 6071 } 6072 6073 TEST_F(FormatTest, AlignsAfterOpenBracket) { 6074 verifyFormat( 6075 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 6076 " aaaaaaaaa aaaaaaa) {}"); 6077 verifyFormat( 6078 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 6079 " aaaaaaaaaaa aaaaaaaaa);"); 6080 verifyFormat( 6081 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 6082 " aaaaaaaaaaaaaaaaaaaaa));"); 6083 FormatStyle Style = getLLVMStyle(); 6084 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6085 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6086 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 6087 Style); 6088 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 6089 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 6090 Style); 6091 verifyFormat("SomeLongVariableName->someFunction(\n" 6092 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 6093 Style); 6094 verifyFormat( 6095 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 6096 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 6097 Style); 6098 verifyFormat( 6099 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 6100 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6101 Style); 6102 verifyFormat( 6103 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 6104 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 6105 Style); 6106 6107 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 6108 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 6109 " b));", 6110 Style); 6111 6112 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6113 Style.BinPackArguments = false; 6114 Style.BinPackParameters = false; 6115 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6116 " aaaaaaaaaaa aaaaaaaa,\n" 6117 " aaaaaaaaa aaaaaaa,\n" 6118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 6119 Style); 6120 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 6121 " aaaaaaaaaaa aaaaaaaaa,\n" 6122 " aaaaaaaaaaa aaaaaaaaa,\n" 6123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6124 Style); 6125 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 6126 " aaaaaaaaaaaaaaa,\n" 6127 " aaaaaaaaaaaaaaaaaaaaa,\n" 6128 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 6129 Style); 6130 verifyFormat( 6131 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 6132 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 6133 Style); 6134 verifyFormat( 6135 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 6136 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 6137 Style); 6138 verifyFormat( 6139 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 6140 " aaaaaaaaaaaaaaaaaaaaa(\n" 6141 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 6142 " aaaaaaaaaaaaaaaa);", 6143 Style); 6144 verifyFormat( 6145 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 6146 " aaaaaaaaaaaaaaaaaaaaa(\n" 6147 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 6148 " aaaaaaaaaaaaaaaa);", 6149 Style); 6150 } 6151 6152 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 6153 FormatStyle Style = getLLVMStyleWithColumns(40); 6154 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6155 " bbbbbbbbbbbbbbbbbbbbbb);", 6156 Style); 6157 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 6158 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6159 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6160 " bbbbbbbbbbbbbbbbbbbbbb);", 6161 Style); 6162 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6163 Style.AlignOperands = FormatStyle::OAS_Align; 6164 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6165 " bbbbbbbbbbbbbbbbbbbbbb);", 6166 Style); 6167 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6168 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6169 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6170 " bbbbbbbbbbbbbbbbbbbbbb);", 6171 Style); 6172 } 6173 6174 TEST_F(FormatTest, BreaksConditionalExpressions) { 6175 verifyFormat( 6176 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6177 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6178 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6179 verifyFormat( 6180 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6181 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6182 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6183 verifyFormat( 6184 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6185 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6186 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 6187 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6188 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6189 verifyFormat( 6190 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 6191 " : aaaaaaaaaaaaa);"); 6192 verifyFormat( 6193 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6194 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6195 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6196 " aaaaaaaaaaaaa);"); 6197 verifyFormat( 6198 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6199 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6200 " aaaaaaaaaaaaa);"); 6201 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6202 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6203 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6204 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6205 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6206 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6207 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6208 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6209 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6210 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6211 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6212 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6213 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6215 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6216 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6217 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6218 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6219 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6220 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6221 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6223 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6224 " : aaaaaaaaaaaaaaaa;"); 6225 verifyFormat( 6226 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6227 " ? aaaaaaaaaaaaaaa\n" 6228 " : aaaaaaaaaaaaaaa;"); 6229 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6230 " aaaaaaaaa\n" 6231 " ? b\n" 6232 " : c);"); 6233 verifyFormat("return aaaa == bbbb\n" 6234 " // comment\n" 6235 " ? aaaa\n" 6236 " : bbbb;"); 6237 verifyFormat("unsigned Indent =\n" 6238 " format(TheLine.First,\n" 6239 " IndentForLevel[TheLine.Level] >= 0\n" 6240 " ? IndentForLevel[TheLine.Level]\n" 6241 " : TheLine * 2,\n" 6242 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6243 getLLVMStyleWithColumns(60)); 6244 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6245 " ? aaaaaaaaaaaaaaa\n" 6246 " : bbbbbbbbbbbbbbb //\n" 6247 " ? ccccccccccccccc\n" 6248 " : ddddddddddddddd;"); 6249 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6250 " ? aaaaaaaaaaaaaaa\n" 6251 " : (bbbbbbbbbbbbbbb //\n" 6252 " ? ccccccccccccccc\n" 6253 " : ddddddddddddddd);"); 6254 verifyFormat( 6255 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6256 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6257 " aaaaaaaaaaaaaaaaaaaaa +\n" 6258 " aaaaaaaaaaaaaaaaaaaaa\n" 6259 " : aaaaaaaaaa;"); 6260 verifyFormat( 6261 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6262 " : aaaaaaaaaaaaaaaaaaaaaa\n" 6263 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6264 6265 FormatStyle NoBinPacking = getLLVMStyle(); 6266 NoBinPacking.BinPackArguments = false; 6267 verifyFormat( 6268 "void f() {\n" 6269 " g(aaa,\n" 6270 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6271 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6272 " ? aaaaaaaaaaaaaaa\n" 6273 " : aaaaaaaaaaaaaaa);\n" 6274 "}", 6275 NoBinPacking); 6276 verifyFormat( 6277 "void f() {\n" 6278 " g(aaa,\n" 6279 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6281 " ?: aaaaaaaaaaaaaaa);\n" 6282 "}", 6283 NoBinPacking); 6284 6285 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 6286 " // comment.\n" 6287 " ccccccccccccccccccccccccccccccccccccccc\n" 6288 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6289 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 6290 6291 // Assignments in conditional expressions. Apparently not uncommon :-(. 6292 verifyFormat("return a != b\n" 6293 " // comment\n" 6294 " ? a = b\n" 6295 " : a = b;"); 6296 verifyFormat("return a != b\n" 6297 " // comment\n" 6298 " ? a = a != b\n" 6299 " // comment\n" 6300 " ? a = b\n" 6301 " : a\n" 6302 " : a;\n"); 6303 verifyFormat("return a != b\n" 6304 " // comment\n" 6305 " ? a\n" 6306 " : a = a != b\n" 6307 " // comment\n" 6308 " ? a = b\n" 6309 " : a;"); 6310 6311 // Chained conditionals 6312 FormatStyle Style = getLLVMStyle(); 6313 Style.ColumnLimit = 70; 6314 Style.AlignOperands = FormatStyle::OAS_Align; 6315 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6316 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6317 " : 3333333333333333;", 6318 Style); 6319 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6320 " : bbbbbbbbbb ? 2222222222222222\n" 6321 " : 3333333333333333;", 6322 Style); 6323 verifyFormat("return aaaaaaaaaa ? 1111111111111111\n" 6324 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 6325 " : 3333333333333333;", 6326 Style); 6327 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6328 " : bbbbbbbbbbbbbb ? 222222\n" 6329 " : 333333;", 6330 Style); 6331 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6332 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6333 " : cccccccccccccc ? 3333333333333333\n" 6334 " : 4444444444444444;", 6335 Style); 6336 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n" 6337 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6338 " : 3333333333333333;", 6339 Style); 6340 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6341 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6342 " : (aaa ? bbb : ccc);", 6343 Style); 6344 verifyFormat( 6345 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6346 " : cccccccccccccccccc)\n" 6347 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6348 " : 3333333333333333;", 6349 Style); 6350 verifyFormat( 6351 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6352 " : cccccccccccccccccc)\n" 6353 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6354 " : 3333333333333333;", 6355 Style); 6356 verifyFormat( 6357 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6358 " : dddddddddddddddddd)\n" 6359 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6360 " : 3333333333333333;", 6361 Style); 6362 verifyFormat( 6363 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6364 " : dddddddddddddddddd)\n" 6365 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6366 " : 3333333333333333;", 6367 Style); 6368 verifyFormat( 6369 "return aaaaaaaaa ? 1111111111111111\n" 6370 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6371 " : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6372 " : dddddddddddddddddd)\n", 6373 Style); 6374 verifyFormat( 6375 "return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6376 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6377 " : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6378 " : cccccccccccccccccc);", 6379 Style); 6380 verifyFormat( 6381 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6382 " : ccccccccccccccc ? dddddddddddddddddd\n" 6383 " : eeeeeeeeeeeeeeeeee)\n" 6384 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6385 " : 3333333333333333;", 6386 Style); 6387 verifyFormat( 6388 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6389 " : ccccccccccccccc ? dddddddddddddddddd\n" 6390 " : eeeeeeeeeeeeeeeeee)\n" 6391 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6392 " : 3333333333333333;", 6393 Style); 6394 verifyFormat( 6395 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6396 " : cccccccccccc ? dddddddddddddddddd\n" 6397 " : eeeeeeeeeeeeeeeeee)\n" 6398 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6399 " : 3333333333333333;", 6400 Style); 6401 verifyFormat( 6402 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6403 " : cccccccccccccccccc\n" 6404 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6405 " : 3333333333333333;", 6406 Style); 6407 verifyFormat( 6408 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6409 " : cccccccccccccccc ? dddddddddddddddddd\n" 6410 " : eeeeeeeeeeeeeeeeee\n" 6411 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6412 " : 3333333333333333;", 6413 Style); 6414 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n" 6415 " ? (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6416 " : cccccccccccccccccc ? dddddddddddddddddd\n" 6417 " : eeeeeeeeeeeeeeeeee)\n" 6418 " : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6419 " : 3333333333333333;", 6420 Style); 6421 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n" 6422 " ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6423 " : cccccccccccccccc ? dddddddddddddddddd\n" 6424 " : eeeeeeeeeeeeeeeeee\n" 6425 " : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6426 " : 3333333333333333;", 6427 Style); 6428 6429 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6430 Style.BreakBeforeTernaryOperators = false; 6431 // FIXME: Aligning the question marks is weird given DontAlign. 6432 // Consider disabling this alignment in this case. Also check whether this 6433 // will render the adjustment from https://reviews.llvm.org/D82199 6434 // unnecessary. 6435 verifyFormat("int x = aaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa :\n" 6436 " bbbb ? cccccccccccccccccc :\n" 6437 " ddddd;\n", 6438 Style); 6439 } 6440 6441 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 6442 FormatStyle Style = getLLVMStyle(); 6443 Style.BreakBeforeTernaryOperators = false; 6444 Style.ColumnLimit = 70; 6445 verifyFormat( 6446 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6449 Style); 6450 verifyFormat( 6451 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6452 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6454 Style); 6455 verifyFormat( 6456 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6458 Style); 6459 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 6460 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6462 Style); 6463 verifyFormat( 6464 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 6465 " aaaaaaaaaaaaa);", 6466 Style); 6467 verifyFormat( 6468 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6469 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6470 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6471 " aaaaaaaaaaaaa);", 6472 Style); 6473 verifyFormat( 6474 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6475 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6476 " aaaaaaaaaaaaa);", 6477 Style); 6478 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6481 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6482 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6483 Style); 6484 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6485 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6486 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6487 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6488 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6489 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6490 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6491 Style); 6492 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6493 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 6494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6495 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6496 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6497 Style); 6498 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6499 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6500 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6501 Style); 6502 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6506 Style); 6507 verifyFormat( 6508 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6509 " aaaaaaaaaaaaaaa :\n" 6510 " aaaaaaaaaaaaaaa;", 6511 Style); 6512 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6513 " aaaaaaaaa ?\n" 6514 " b :\n" 6515 " c);", 6516 Style); 6517 verifyFormat("unsigned Indent =\n" 6518 " format(TheLine.First,\n" 6519 " IndentForLevel[TheLine.Level] >= 0 ?\n" 6520 " IndentForLevel[TheLine.Level] :\n" 6521 " TheLine * 2,\n" 6522 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6523 Style); 6524 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6525 " aaaaaaaaaaaaaaa :\n" 6526 " bbbbbbbbbbbbbbb ? //\n" 6527 " ccccccccccccccc :\n" 6528 " ddddddddddddddd;", 6529 Style); 6530 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6531 " aaaaaaaaaaaaaaa :\n" 6532 " (bbbbbbbbbbbbbbb ? //\n" 6533 " ccccccccccccccc :\n" 6534 " ddddddddddddddd);", 6535 Style); 6536 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6537 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 6538 " ccccccccccccccccccccccccccc;", 6539 Style); 6540 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6541 " aaaaa :\n" 6542 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 6543 Style); 6544 6545 // Chained conditionals 6546 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6547 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6548 " 3333333333333333;", 6549 Style); 6550 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6551 " bbbbbbbbbb ? 2222222222222222 :\n" 6552 " 3333333333333333;", 6553 Style); 6554 verifyFormat("return aaaaaaaaaa ? 1111111111111111 :\n" 6555 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6556 " 3333333333333333;", 6557 Style); 6558 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6559 " bbbbbbbbbbbbbbbb ? 222222 :\n" 6560 " 333333;", 6561 Style); 6562 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6563 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6564 " cccccccccccccccc ? 3333333333333333 :\n" 6565 " 4444444444444444;", 6566 Style); 6567 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n" 6568 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6569 " 3333333333333333;", 6570 Style); 6571 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6572 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6573 " (aaa ? bbb : ccc);", 6574 Style); 6575 verifyFormat( 6576 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6577 " cccccccccccccccccc) :\n" 6578 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6579 " 3333333333333333;", 6580 Style); 6581 verifyFormat( 6582 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6583 " cccccccccccccccccc) :\n" 6584 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6585 " 3333333333333333;", 6586 Style); 6587 verifyFormat( 6588 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6589 " dddddddddddddddddd) :\n" 6590 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6591 " 3333333333333333;", 6592 Style); 6593 verifyFormat( 6594 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6595 " dddddddddddddddddd) :\n" 6596 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6597 " 3333333333333333;", 6598 Style); 6599 verifyFormat( 6600 "return aaaaaaaaa ? 1111111111111111 :\n" 6601 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6602 " a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6603 " dddddddddddddddddd)\n", 6604 Style); 6605 verifyFormat( 6606 "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6607 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6608 " (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6609 " cccccccccccccccccc);", 6610 Style); 6611 verifyFormat( 6612 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6613 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6614 " eeeeeeeeeeeeeeeeee) :\n" 6615 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6616 " 3333333333333333;", 6617 Style); 6618 verifyFormat( 6619 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6620 " ccccccccccccc ? dddddddddddddddddd :\n" 6621 " eeeeeeeeeeeeeeeeee) :\n" 6622 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6623 " 3333333333333333;", 6624 Style); 6625 verifyFormat( 6626 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6627 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6628 " eeeeeeeeeeeeeeeeee) :\n" 6629 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6630 " 3333333333333333;", 6631 Style); 6632 verifyFormat( 6633 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6634 " cccccccccccccccccc :\n" 6635 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6636 " 3333333333333333;", 6637 Style); 6638 verifyFormat( 6639 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6640 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6641 " eeeeeeeeeeeeeeeeee :\n" 6642 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6643 " 3333333333333333;", 6644 Style); 6645 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6646 " (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6647 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6648 " eeeeeeeeeeeeeeeeee) :\n" 6649 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6650 " 3333333333333333;", 6651 Style); 6652 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6653 " aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6654 " cccccccccccccccccccc ? dddddddddddddddddd :\n" 6655 " eeeeeeeeeeeeeeeeee :\n" 6656 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6657 " 3333333333333333;", 6658 Style); 6659 } 6660 6661 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 6662 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 6663 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 6664 verifyFormat("bool a = true, b = false;"); 6665 6666 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 6668 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 6669 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 6670 verifyFormat( 6671 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 6672 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 6673 " d = e && f;"); 6674 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 6675 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 6676 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6677 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 6678 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 6679 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 6680 6681 FormatStyle Style = getGoogleStyle(); 6682 Style.PointerAlignment = FormatStyle::PAS_Left; 6683 Style.DerivePointerAlignment = false; 6684 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6685 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 6686 " *b = bbbbbbbbbbbbbbbbbbb;", 6687 Style); 6688 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6689 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 6690 Style); 6691 verifyFormat("vector<int*> a, b;", Style); 6692 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 6693 } 6694 6695 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6696 verifyFormat("arr[foo ? bar : baz];"); 6697 verifyFormat("f()[foo ? bar : baz];"); 6698 verifyFormat("(a + b)[foo ? bar : baz];"); 6699 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6700 } 6701 6702 TEST_F(FormatTest, AlignsStringLiterals) { 6703 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6704 " \"short literal\");"); 6705 verifyFormat( 6706 "looooooooooooooooooooooooongFunction(\n" 6707 " \"short literal\"\n" 6708 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6709 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6710 " \" string literals\",\n" 6711 " and, other, parameters);"); 6712 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6713 " \"5678\";", 6714 format("fun + \"1243\" /* comment */\n" 6715 " \"5678\";", 6716 getLLVMStyleWithColumns(28))); 6717 EXPECT_EQ( 6718 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6719 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6720 " \"aaaaaaaaaaaaaaaa\";", 6721 format("aaaaaa =" 6722 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6723 "aaaaaaaaaaaaaaaaaaaaa\" " 6724 "\"aaaaaaaaaaaaaaaa\";")); 6725 verifyFormat("a = a + \"a\"\n" 6726 " \"a\"\n" 6727 " \"a\";"); 6728 verifyFormat("f(\"a\", \"b\"\n" 6729 " \"c\");"); 6730 6731 verifyFormat( 6732 "#define LL_FORMAT \"ll\"\n" 6733 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6734 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6735 6736 verifyFormat("#define A(X) \\\n" 6737 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6738 " \"ccccc\"", 6739 getLLVMStyleWithColumns(23)); 6740 verifyFormat("#define A \"def\"\n" 6741 "f(\"abc\" A \"ghi\"\n" 6742 " \"jkl\");"); 6743 6744 verifyFormat("f(L\"a\"\n" 6745 " L\"b\");"); 6746 verifyFormat("#define A(X) \\\n" 6747 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6748 " L\"ccccc\"", 6749 getLLVMStyleWithColumns(25)); 6750 6751 verifyFormat("f(@\"a\"\n" 6752 " @\"b\");"); 6753 verifyFormat("NSString s = @\"a\"\n" 6754 " @\"b\"\n" 6755 " @\"c\";"); 6756 verifyFormat("NSString s = @\"a\"\n" 6757 " \"b\"\n" 6758 " \"c\";"); 6759 } 6760 6761 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6762 FormatStyle Style = getLLVMStyle(); 6763 // No declarations or definitions should be moved to own line. 6764 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6765 verifyFormat("class A {\n" 6766 " int f() { return 1; }\n" 6767 " int g();\n" 6768 "};\n" 6769 "int f() { return 1; }\n" 6770 "int g();\n", 6771 Style); 6772 6773 // All declarations and definitions should have the return type moved to its 6774 // own line. 6775 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6776 Style.TypenameMacros = {"LIST"}; 6777 verifyFormat("SomeType\n" 6778 "funcdecl(LIST(uint64_t));", 6779 Style); 6780 verifyFormat("class E {\n" 6781 " int\n" 6782 " f() {\n" 6783 " return 1;\n" 6784 " }\n" 6785 " int\n" 6786 " g();\n" 6787 "};\n" 6788 "int\n" 6789 "f() {\n" 6790 " return 1;\n" 6791 "}\n" 6792 "int\n" 6793 "g();\n", 6794 Style); 6795 6796 // Top-level definitions, and no kinds of declarations should have the 6797 // return type moved to its own line. 6798 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6799 verifyFormat("class B {\n" 6800 " int f() { return 1; }\n" 6801 " int g();\n" 6802 "};\n" 6803 "int\n" 6804 "f() {\n" 6805 " return 1;\n" 6806 "}\n" 6807 "int g();\n", 6808 Style); 6809 6810 // Top-level definitions and declarations should have the return type moved 6811 // to its own line. 6812 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6813 verifyFormat("class C {\n" 6814 " int f() { return 1; }\n" 6815 " int g();\n" 6816 "};\n" 6817 "int\n" 6818 "f() {\n" 6819 " return 1;\n" 6820 "}\n" 6821 "int\n" 6822 "g();\n", 6823 Style); 6824 6825 // All definitions should have the return type moved to its own line, but no 6826 // kinds of declarations. 6827 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6828 verifyFormat("class D {\n" 6829 " int\n" 6830 " f() {\n" 6831 " return 1;\n" 6832 " }\n" 6833 " int g();\n" 6834 "};\n" 6835 "int\n" 6836 "f() {\n" 6837 " return 1;\n" 6838 "}\n" 6839 "int g();\n", 6840 Style); 6841 verifyFormat("const char *\n" 6842 "f(void) {\n" // Break here. 6843 " return \"\";\n" 6844 "}\n" 6845 "const char *bar(void);\n", // No break here. 6846 Style); 6847 verifyFormat("template <class T>\n" 6848 "T *\n" 6849 "f(T &c) {\n" // Break here. 6850 " return NULL;\n" 6851 "}\n" 6852 "template <class T> T *f(T &c);\n", // No break here. 6853 Style); 6854 verifyFormat("class C {\n" 6855 " int\n" 6856 " operator+() {\n" 6857 " return 1;\n" 6858 " }\n" 6859 " int\n" 6860 " operator()() {\n" 6861 " return 1;\n" 6862 " }\n" 6863 "};\n", 6864 Style); 6865 verifyFormat("void\n" 6866 "A::operator()() {}\n" 6867 "void\n" 6868 "A::operator>>() {}\n" 6869 "void\n" 6870 "A::operator+() {}\n" 6871 "void\n" 6872 "A::operator*() {}\n" 6873 "void\n" 6874 "A::operator->() {}\n" 6875 "void\n" 6876 "A::operator void *() {}\n" 6877 "void\n" 6878 "A::operator void &() {}\n" 6879 "void\n" 6880 "A::operator void &&() {}\n" 6881 "void\n" 6882 "A::operator char *() {}\n" 6883 "void\n" 6884 "A::operator[]() {}\n" 6885 "void\n" 6886 "A::operator!() {}\n" 6887 "void\n" 6888 "A::operator**() {}\n" 6889 "void\n" 6890 "A::operator<Foo> *() {}\n" 6891 "void\n" 6892 "A::operator<Foo> **() {}\n" 6893 "void\n" 6894 "A::operator<Foo> &() {}\n" 6895 "void\n" 6896 "A::operator void **() {}\n", 6897 Style); 6898 verifyFormat("constexpr auto\n" 6899 "operator()() const -> reference {}\n" 6900 "constexpr auto\n" 6901 "operator>>() const -> reference {}\n" 6902 "constexpr auto\n" 6903 "operator+() const -> reference {}\n" 6904 "constexpr auto\n" 6905 "operator*() const -> reference {}\n" 6906 "constexpr auto\n" 6907 "operator->() const -> reference {}\n" 6908 "constexpr auto\n" 6909 "operator++() const -> reference {}\n" 6910 "constexpr auto\n" 6911 "operator void *() const -> reference {}\n" 6912 "constexpr auto\n" 6913 "operator void **() const -> reference {}\n" 6914 "constexpr auto\n" 6915 "operator void *() const -> reference {}\n" 6916 "constexpr auto\n" 6917 "operator void &() const -> reference {}\n" 6918 "constexpr auto\n" 6919 "operator void &&() const -> reference {}\n" 6920 "constexpr auto\n" 6921 "operator char *() const -> reference {}\n" 6922 "constexpr auto\n" 6923 "operator!() const -> reference {}\n" 6924 "constexpr auto\n" 6925 "operator[]() const -> reference {}\n", 6926 Style); 6927 verifyFormat("void *operator new(std::size_t s);", // No break here. 6928 Style); 6929 verifyFormat("void *\n" 6930 "operator new(std::size_t s) {}", 6931 Style); 6932 verifyFormat("void *\n" 6933 "operator delete[](void *ptr) {}", 6934 Style); 6935 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6936 verifyFormat("const char *\n" 6937 "f(void)\n" // Break here. 6938 "{\n" 6939 " return \"\";\n" 6940 "}\n" 6941 "const char *bar(void);\n", // No break here. 6942 Style); 6943 verifyFormat("template <class T>\n" 6944 "T *\n" // Problem here: no line break 6945 "f(T &c)\n" // Break here. 6946 "{\n" 6947 " return NULL;\n" 6948 "}\n" 6949 "template <class T> T *f(T &c);\n", // No break here. 6950 Style); 6951 verifyFormat("int\n" 6952 "foo(A<bool> a)\n" 6953 "{\n" 6954 " return a;\n" 6955 "}\n", 6956 Style); 6957 verifyFormat("int\n" 6958 "foo(A<8> a)\n" 6959 "{\n" 6960 " return a;\n" 6961 "}\n", 6962 Style); 6963 verifyFormat("int\n" 6964 "foo(A<B<bool>, 8> a)\n" 6965 "{\n" 6966 " return a;\n" 6967 "}\n", 6968 Style); 6969 verifyFormat("int\n" 6970 "foo(A<B<8>, bool> a)\n" 6971 "{\n" 6972 " return a;\n" 6973 "}\n", 6974 Style); 6975 verifyFormat("int\n" 6976 "foo(A<B<bool>, bool> a)\n" 6977 "{\n" 6978 " return a;\n" 6979 "}\n", 6980 Style); 6981 verifyFormat("int\n" 6982 "foo(A<B<8>, 8> a)\n" 6983 "{\n" 6984 " return a;\n" 6985 "}\n", 6986 Style); 6987 6988 Style = getGNUStyle(); 6989 6990 // Test for comments at the end of function declarations. 6991 verifyFormat("void\n" 6992 "foo (int a, /*abc*/ int b) // def\n" 6993 "{\n" 6994 "}\n", 6995 Style); 6996 6997 verifyFormat("void\n" 6998 "foo (int a, /* abc */ int b) /* def */\n" 6999 "{\n" 7000 "}\n", 7001 Style); 7002 7003 // Definitions that should not break after return type 7004 verifyFormat("void foo (int a, int b); // def\n", Style); 7005 verifyFormat("void foo (int a, int b); /* def */\n", Style); 7006 verifyFormat("void foo (int a, int b);\n", Style); 7007 } 7008 7009 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 7010 FormatStyle NoBreak = getLLVMStyle(); 7011 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 7012 FormatStyle Break = getLLVMStyle(); 7013 Break.AlwaysBreakBeforeMultilineStrings = true; 7014 verifyFormat("aaaa = \"bbbb\"\n" 7015 " \"cccc\";", 7016 NoBreak); 7017 verifyFormat("aaaa =\n" 7018 " \"bbbb\"\n" 7019 " \"cccc\";", 7020 Break); 7021 verifyFormat("aaaa(\"bbbb\"\n" 7022 " \"cccc\");", 7023 NoBreak); 7024 verifyFormat("aaaa(\n" 7025 " \"bbbb\"\n" 7026 " \"cccc\");", 7027 Break); 7028 verifyFormat("aaaa(qqq, \"bbbb\"\n" 7029 " \"cccc\");", 7030 NoBreak); 7031 verifyFormat("aaaa(qqq,\n" 7032 " \"bbbb\"\n" 7033 " \"cccc\");", 7034 Break); 7035 verifyFormat("aaaa(qqq,\n" 7036 " L\"bbbb\"\n" 7037 " L\"cccc\");", 7038 Break); 7039 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 7040 " \"bbbb\"));", 7041 Break); 7042 verifyFormat("string s = someFunction(\n" 7043 " \"abc\"\n" 7044 " \"abc\");", 7045 Break); 7046 7047 // As we break before unary operators, breaking right after them is bad. 7048 verifyFormat("string foo = abc ? \"x\"\n" 7049 " \"blah blah blah blah blah blah\"\n" 7050 " : \"y\";", 7051 Break); 7052 7053 // Don't break if there is no column gain. 7054 verifyFormat("f(\"aaaa\"\n" 7055 " \"bbbb\");", 7056 Break); 7057 7058 // Treat literals with escaped newlines like multi-line string literals. 7059 EXPECT_EQ("x = \"a\\\n" 7060 "b\\\n" 7061 "c\";", 7062 format("x = \"a\\\n" 7063 "b\\\n" 7064 "c\";", 7065 NoBreak)); 7066 EXPECT_EQ("xxxx =\n" 7067 " \"a\\\n" 7068 "b\\\n" 7069 "c\";", 7070 format("xxxx = \"a\\\n" 7071 "b\\\n" 7072 "c\";", 7073 Break)); 7074 7075 EXPECT_EQ("NSString *const kString =\n" 7076 " @\"aaaa\"\n" 7077 " @\"bbbb\";", 7078 format("NSString *const kString = @\"aaaa\"\n" 7079 "@\"bbbb\";", 7080 Break)); 7081 7082 Break.ColumnLimit = 0; 7083 verifyFormat("const char *hello = \"hello llvm\";", Break); 7084 } 7085 7086 TEST_F(FormatTest, AlignsPipes) { 7087 verifyFormat( 7088 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7089 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7090 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7091 verifyFormat( 7092 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 7093 " << aaaaaaaaaaaaaaaaaaaa;"); 7094 verifyFormat( 7095 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7096 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7097 verifyFormat( 7098 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 7099 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7100 verifyFormat( 7101 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 7102 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 7103 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 7104 verifyFormat( 7105 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7106 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7107 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7108 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7111 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7112 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 7113 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 7114 verifyFormat( 7115 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7117 verifyFormat( 7118 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 7119 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7120 7121 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 7122 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 7123 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7125 " aaaaaaaaaaaaaaaaaaaaa)\n" 7126 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7127 verifyFormat("LOG_IF(aaa == //\n" 7128 " bbb)\n" 7129 " << a << b;"); 7130 7131 // But sometimes, breaking before the first "<<" is desirable. 7132 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7133 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 7134 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 7135 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7136 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7137 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 7138 " << BEF << IsTemplate << Description << E->getType();"); 7139 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7140 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7142 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7143 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7145 " << aaa;"); 7146 7147 verifyFormat( 7148 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7149 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7150 7151 // Incomplete string literal. 7152 EXPECT_EQ("llvm::errs() << \"\n" 7153 " << a;", 7154 format("llvm::errs() << \"\n<<a;")); 7155 7156 verifyFormat("void f() {\n" 7157 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 7158 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 7159 "}"); 7160 7161 // Handle 'endl'. 7162 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 7163 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 7164 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 7165 7166 // Handle '\n'. 7167 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 7168 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 7169 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 7170 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 7171 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 7172 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 7173 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 7174 } 7175 7176 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 7177 verifyFormat("return out << \"somepacket = {\\n\"\n" 7178 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 7179 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 7180 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 7181 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 7182 " << \"}\";"); 7183 7184 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 7185 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 7186 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 7187 verifyFormat( 7188 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 7189 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 7190 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 7191 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 7192 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 7193 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 7194 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7195 verifyFormat( 7196 "void f() {\n" 7197 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 7198 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 7199 "}"); 7200 7201 // Breaking before the first "<<" is generally not desirable. 7202 verifyFormat( 7203 "llvm::errs()\n" 7204 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7205 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7206 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7207 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 7208 getLLVMStyleWithColumns(70)); 7209 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7210 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7211 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7212 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7213 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7214 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 7215 getLLVMStyleWithColumns(70)); 7216 7217 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 7218 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 7219 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 7220 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7221 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7222 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 7223 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 7224 " (aaaa + aaaa);", 7225 getLLVMStyleWithColumns(40)); 7226 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 7227 " (aaaaaaa + aaaaa));", 7228 getLLVMStyleWithColumns(40)); 7229 verifyFormat( 7230 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 7231 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 7232 " bbbbbbbbbbbbbbbbbbbbbbb);"); 7233 } 7234 7235 TEST_F(FormatTest, UnderstandsEquals) { 7236 verifyFormat( 7237 "aaaaaaaaaaaaaaaaa =\n" 7238 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7239 verifyFormat( 7240 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7241 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7242 verifyFormat( 7243 "if (a) {\n" 7244 " f();\n" 7245 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 7247 "}"); 7248 7249 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7250 " 100000000 + 10000000) {\n}"); 7251 } 7252 7253 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 7254 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7255 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 7256 7257 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7258 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 7259 7260 verifyFormat( 7261 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 7262 " Parameter2);"); 7263 7264 verifyFormat( 7265 "ShortObject->shortFunction(\n" 7266 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 7267 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 7268 7269 verifyFormat("loooooooooooooongFunction(\n" 7270 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 7271 7272 verifyFormat( 7273 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 7274 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 7275 7276 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7277 " .WillRepeatedly(Return(SomeValue));"); 7278 verifyFormat("void f() {\n" 7279 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7280 " .Times(2)\n" 7281 " .WillRepeatedly(Return(SomeValue));\n" 7282 "}"); 7283 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 7284 " ccccccccccccccccccccccc);"); 7285 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7287 " .aaaaa(aaaaa),\n" 7288 " aaaaaaaaaaaaaaaaaaaaa);"); 7289 verifyFormat("void f() {\n" 7290 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7291 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 7292 "}"); 7293 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7295 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7296 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7297 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7298 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7299 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7300 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7301 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 7302 "}"); 7303 7304 // Here, it is not necessary to wrap at "." or "->". 7305 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 7306 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7307 verifyFormat( 7308 "aaaaaaaaaaa->aaaaaaaaa(\n" 7309 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7310 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 7311 7312 verifyFormat( 7313 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7314 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 7315 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 7316 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7317 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 7318 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7319 7320 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7322 " .a();"); 7323 7324 FormatStyle NoBinPacking = getLLVMStyle(); 7325 NoBinPacking.BinPackParameters = false; 7326 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7327 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7328 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 7329 " aaaaaaaaaaaaaaaaaaa,\n" 7330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 7331 NoBinPacking); 7332 7333 // If there is a subsequent call, change to hanging indentation. 7334 verifyFormat( 7335 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7336 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 7337 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7338 verifyFormat( 7339 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7340 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 7341 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7343 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7344 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7346 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7347 } 7348 7349 TEST_F(FormatTest, WrapsTemplateDeclarations) { 7350 verifyFormat("template <typename T>\n" 7351 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7352 verifyFormat("template <typename T>\n" 7353 "// T should be one of {A, B}.\n" 7354 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7355 verifyFormat( 7356 "template <typename T>\n" 7357 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 7358 verifyFormat("template <typename T>\n" 7359 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 7360 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 7361 verifyFormat( 7362 "template <typename T>\n" 7363 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 7364 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 7365 verifyFormat( 7366 "template <typename T>\n" 7367 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 7368 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 7369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7370 verifyFormat("template <typename T>\n" 7371 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7372 " int aaaaaaaaaaaaaaaaaaaaaa);"); 7373 verifyFormat( 7374 "template <typename T1, typename T2 = char, typename T3 = char,\n" 7375 " typename T4 = char>\n" 7376 "void f();"); 7377 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 7378 " template <typename> class cccccccccccccccccccccc,\n" 7379 " typename ddddddddddddd>\n" 7380 "class C {};"); 7381 verifyFormat( 7382 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 7383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7384 7385 verifyFormat("void f() {\n" 7386 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 7387 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 7388 "}"); 7389 7390 verifyFormat("template <typename T> class C {};"); 7391 verifyFormat("template <typename T> void f();"); 7392 verifyFormat("template <typename T> void f() {}"); 7393 verifyFormat( 7394 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7396 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 7397 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 7400 " bbbbbbbbbbbbbbbbbbbbbbbb);", 7401 getLLVMStyleWithColumns(72)); 7402 EXPECT_EQ("static_cast<A< //\n" 7403 " B> *>(\n" 7404 "\n" 7405 ");", 7406 format("static_cast<A<//\n" 7407 " B>*>(\n" 7408 "\n" 7409 " );")); 7410 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7411 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 7412 7413 FormatStyle AlwaysBreak = getLLVMStyle(); 7414 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7415 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 7416 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 7417 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 7418 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7419 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7420 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 7421 verifyFormat("template <template <typename> class Fooooooo,\n" 7422 " template <typename> class Baaaaaaar>\n" 7423 "struct C {};", 7424 AlwaysBreak); 7425 verifyFormat("template <typename T> // T can be A, B or C.\n" 7426 "struct C {};", 7427 AlwaysBreak); 7428 verifyFormat("template <enum E> class A {\n" 7429 "public:\n" 7430 " E *f();\n" 7431 "};"); 7432 7433 FormatStyle NeverBreak = getLLVMStyle(); 7434 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 7435 verifyFormat("template <typename T> class C {};", NeverBreak); 7436 verifyFormat("template <typename T> void f();", NeverBreak); 7437 verifyFormat("template <typename T> void f() {}", NeverBreak); 7438 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7439 "bbbbbbbbbbbbbbbbbbbb) {}", 7440 NeverBreak); 7441 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7442 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7443 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 7444 NeverBreak); 7445 verifyFormat("template <template <typename> class Fooooooo,\n" 7446 " template <typename> class Baaaaaaar>\n" 7447 "struct C {};", 7448 NeverBreak); 7449 verifyFormat("template <typename T> // T can be A, B or C.\n" 7450 "struct C {};", 7451 NeverBreak); 7452 verifyFormat("template <enum E> class A {\n" 7453 "public:\n" 7454 " E *f();\n" 7455 "};", 7456 NeverBreak); 7457 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 7458 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7459 "bbbbbbbbbbbbbbbbbbbb) {}", 7460 NeverBreak); 7461 } 7462 7463 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 7464 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7465 Style.ColumnLimit = 60; 7466 EXPECT_EQ("// Baseline - no comments.\n" 7467 "template <\n" 7468 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7469 "void f() {}", 7470 format("// Baseline - no comments.\n" 7471 "template <\n" 7472 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7473 "void f() {}", 7474 Style)); 7475 7476 EXPECT_EQ("template <\n" 7477 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7478 "void f() {}", 7479 format("template <\n" 7480 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7481 "void f() {}", 7482 Style)); 7483 7484 EXPECT_EQ( 7485 "template <\n" 7486 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7487 "void f() {}", 7488 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7489 "void f() {}", 7490 Style)); 7491 7492 EXPECT_EQ( 7493 "template <\n" 7494 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7495 " // multiline\n" 7496 "void f() {}", 7497 format("template <\n" 7498 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7499 " // multiline\n" 7500 "void f() {}", 7501 Style)); 7502 7503 EXPECT_EQ( 7504 "template <typename aaaaaaaaaa<\n" 7505 " bbbbbbbbbbbb>::value> // trailing loooong\n" 7506 "void f() {}", 7507 format( 7508 "template <\n" 7509 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 7510 "void f() {}", 7511 Style)); 7512 } 7513 7514 TEST_F(FormatTest, WrapsTemplateParameters) { 7515 FormatStyle Style = getLLVMStyle(); 7516 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7517 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7518 verifyFormat( 7519 "template <typename... a> struct q {};\n" 7520 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7521 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7522 " y;", 7523 Style); 7524 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7525 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7526 verifyFormat( 7527 "template <typename... a> struct r {};\n" 7528 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7529 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7530 " y;", 7531 Style); 7532 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7533 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7534 verifyFormat("template <typename... a> struct s {};\n" 7535 "extern s<\n" 7536 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7537 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7538 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7539 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7540 " y;", 7541 Style); 7542 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7543 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7544 verifyFormat("template <typename... a> struct t {};\n" 7545 "extern t<\n" 7546 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7547 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7548 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7549 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7550 " y;", 7551 Style); 7552 } 7553 7554 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 7555 verifyFormat( 7556 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7557 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7558 verifyFormat( 7559 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7560 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7561 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7562 7563 // FIXME: Should we have the extra indent after the second break? 7564 verifyFormat( 7565 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7566 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7568 7569 verifyFormat( 7570 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 7571 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 7572 7573 // Breaking at nested name specifiers is generally not desirable. 7574 verifyFormat( 7575 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7576 " aaaaaaaaaaaaaaaaaaaaaaa);"); 7577 7578 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 7579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7581 " aaaaaaaaaaaaaaaaaaaaa);", 7582 getLLVMStyleWithColumns(74)); 7583 7584 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7585 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7586 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7587 } 7588 7589 TEST_F(FormatTest, UnderstandsTemplateParameters) { 7590 verifyFormat("A<int> a;"); 7591 verifyFormat("A<A<A<int>>> a;"); 7592 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 7593 verifyFormat("bool x = a < 1 || 2 > a;"); 7594 verifyFormat("bool x = 5 < f<int>();"); 7595 verifyFormat("bool x = f<int>() > 5;"); 7596 verifyFormat("bool x = 5 < a<int>::x;"); 7597 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 7598 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 7599 7600 verifyGoogleFormat("A<A<int>> a;"); 7601 verifyGoogleFormat("A<A<A<int>>> a;"); 7602 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 7603 verifyGoogleFormat("A<A<int> > a;"); 7604 verifyGoogleFormat("A<A<A<int> > > a;"); 7605 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 7606 verifyGoogleFormat("A<::A<int>> a;"); 7607 verifyGoogleFormat("A<::A> a;"); 7608 verifyGoogleFormat("A< ::A> a;"); 7609 verifyGoogleFormat("A< ::A<int> > a;"); 7610 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 7611 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 7612 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 7613 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 7614 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 7615 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 7616 7617 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 7618 7619 // template closer followed by a token that starts with > or = 7620 verifyFormat("bool b = a<1> > 1;"); 7621 verifyFormat("bool b = a<1> >= 1;"); 7622 verifyFormat("int i = a<1> >> 1;"); 7623 FormatStyle Style = getLLVMStyle(); 7624 Style.SpaceBeforeAssignmentOperators = false; 7625 verifyFormat("bool b= a<1> == 1;", Style); 7626 verifyFormat("a<int> = 1;", Style); 7627 verifyFormat("a<int> >>= 1;", Style); 7628 7629 verifyFormat("test >> a >> b;"); 7630 verifyFormat("test << a >> b;"); 7631 7632 verifyFormat("f<int>();"); 7633 verifyFormat("template <typename T> void f() {}"); 7634 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 7635 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 7636 "sizeof(char)>::type>;"); 7637 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 7638 verifyFormat("f(a.operator()<A>());"); 7639 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7640 " .template operator()<A>());", 7641 getLLVMStyleWithColumns(35)); 7642 7643 // Not template parameters. 7644 verifyFormat("return a < b && c > d;"); 7645 verifyFormat("void f() {\n" 7646 " while (a < b && c > d) {\n" 7647 " }\n" 7648 "}"); 7649 verifyFormat("template <typename... Types>\n" 7650 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 7651 7652 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 7654 getLLVMStyleWithColumns(60)); 7655 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 7656 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 7657 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 7658 verifyFormat("some_templated_type<decltype([](int i) { return i; })>"); 7659 } 7660 7661 TEST_F(FormatTest, UnderstandsShiftOperators) { 7662 verifyFormat("if (i < x >> 1)"); 7663 verifyFormat("while (i < x >> 1)"); 7664 verifyFormat("for (unsigned i = 0; i < i; ++i, v = v >> 1)"); 7665 verifyFormat("for (unsigned i = 0; i < x >> 1; ++i, v = v >> 1)"); 7666 verifyFormat( 7667 "for (std::vector<int>::iterator i = 0; i < x >> 1; ++i, v = v >> 1)"); 7668 verifyFormat("Foo.call<Bar<Function>>()"); 7669 verifyFormat("if (Foo.call<Bar<Function>>() == 0)"); 7670 verifyFormat("for (std::vector<std::pair<int>>::iterator i = 0; i < x >> 1; " 7671 "++i, v = v >> 1)"); 7672 verifyFormat("if (w<u<v<x>>, 1>::t)"); 7673 } 7674 7675 TEST_F(FormatTest, BitshiftOperatorWidth) { 7676 EXPECT_EQ("int a = 1 << 2; /* foo\n" 7677 " bar */", 7678 format("int a=1<<2; /* foo\n" 7679 " bar */")); 7680 7681 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 7682 " bar */", 7683 format("int b =256>>1 ; /* foo\n" 7684 " bar */")); 7685 } 7686 7687 TEST_F(FormatTest, UnderstandsBinaryOperators) { 7688 verifyFormat("COMPARE(a, ==, b);"); 7689 verifyFormat("auto s = sizeof...(Ts) - 1;"); 7690 } 7691 7692 TEST_F(FormatTest, UnderstandsPointersToMembers) { 7693 verifyFormat("int A::*x;"); 7694 verifyFormat("int (S::*func)(void *);"); 7695 verifyFormat("void f() { int (S::*func)(void *); }"); 7696 verifyFormat("typedef bool *(Class::*Member)() const;"); 7697 verifyFormat("void f() {\n" 7698 " (a->*f)();\n" 7699 " a->*x;\n" 7700 " (a.*f)();\n" 7701 " ((*a).*f)();\n" 7702 " a.*x;\n" 7703 "}"); 7704 verifyFormat("void f() {\n" 7705 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7706 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 7707 "}"); 7708 verifyFormat( 7709 "(aaaaaaaaaa->*bbbbbbb)(\n" 7710 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7711 FormatStyle Style = getLLVMStyle(); 7712 Style.PointerAlignment = FormatStyle::PAS_Left; 7713 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 7714 } 7715 7716 TEST_F(FormatTest, UnderstandsUnaryOperators) { 7717 verifyFormat("int a = -2;"); 7718 verifyFormat("f(-1, -2, -3);"); 7719 verifyFormat("a[-1] = 5;"); 7720 verifyFormat("int a = 5 + -2;"); 7721 verifyFormat("if (i == -1) {\n}"); 7722 verifyFormat("if (i != -1) {\n}"); 7723 verifyFormat("if (i > -1) {\n}"); 7724 verifyFormat("if (i < -1) {\n}"); 7725 verifyFormat("++(a->f());"); 7726 verifyFormat("--(a->f());"); 7727 verifyFormat("(a->f())++;"); 7728 verifyFormat("a[42]++;"); 7729 verifyFormat("if (!(a->f())) {\n}"); 7730 verifyFormat("if (!+i) {\n}"); 7731 verifyFormat("~&a;"); 7732 7733 verifyFormat("a-- > b;"); 7734 verifyFormat("b ? -a : c;"); 7735 verifyFormat("n * sizeof char16;"); 7736 verifyFormat("n * alignof char16;", getGoogleStyle()); 7737 verifyFormat("sizeof(char);"); 7738 verifyFormat("alignof(char);", getGoogleStyle()); 7739 7740 verifyFormat("return -1;"); 7741 verifyFormat("throw -1;"); 7742 verifyFormat("switch (a) {\n" 7743 "case -1:\n" 7744 " break;\n" 7745 "}"); 7746 verifyFormat("#define X -1"); 7747 verifyFormat("#define X -kConstant"); 7748 7749 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7750 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7751 7752 verifyFormat("int a = /* confusing comment */ -1;"); 7753 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7754 verifyFormat("int a = i /* confusing comment */++;"); 7755 7756 verifyFormat("co_yield -1;"); 7757 verifyFormat("co_return -1;"); 7758 7759 // Check that * is not treated as a binary operator when we set PointerAlignment 7760 // as PAS_Left after a keyword and not a declaration. 7761 FormatStyle PASLeftStyle = getLLVMStyle(); 7762 PASLeftStyle.PointerAlignment = FormatStyle::PAS_Left; 7763 verifyFormat("co_return *a;", PASLeftStyle); 7764 verifyFormat("co_await *a;", PASLeftStyle); 7765 verifyFormat("co_yield *a", PASLeftStyle); 7766 verifyFormat("return *a;", PASLeftStyle); 7767 } 7768 7769 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7770 verifyFormat("if (!aaaaaaaaaa( // break\n" 7771 " aaaaa)) {\n" 7772 "}"); 7773 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7774 " aaaaa));"); 7775 verifyFormat("*aaa = aaaaaaa( // break\n" 7776 " bbbbbb);"); 7777 } 7778 7779 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7780 verifyFormat("bool operator<();"); 7781 verifyFormat("bool operator>();"); 7782 verifyFormat("bool operator=();"); 7783 verifyFormat("bool operator==();"); 7784 verifyFormat("bool operator!=();"); 7785 verifyFormat("int operator+();"); 7786 verifyFormat("int operator++();"); 7787 verifyFormat("int operator++(int) volatile noexcept;"); 7788 verifyFormat("bool operator,();"); 7789 verifyFormat("bool operator();"); 7790 verifyFormat("bool operator()();"); 7791 verifyFormat("bool operator[]();"); 7792 verifyFormat("operator bool();"); 7793 verifyFormat("operator int();"); 7794 verifyFormat("operator void *();"); 7795 verifyFormat("operator SomeType<int>();"); 7796 verifyFormat("operator SomeType<int, int>();"); 7797 verifyFormat("operator SomeType<SomeType<int>>();"); 7798 verifyFormat("void *operator new(std::size_t size);"); 7799 verifyFormat("void *operator new[](std::size_t size);"); 7800 verifyFormat("void operator delete(void *ptr);"); 7801 verifyFormat("void operator delete[](void *ptr);"); 7802 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7803 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7804 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7805 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7806 7807 verifyFormat( 7808 "ostream &operator<<(ostream &OutputStream,\n" 7809 " SomeReallyLongType WithSomeReallyLongValue);"); 7810 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7811 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7812 " return left.group < right.group;\n" 7813 "}"); 7814 verifyFormat("SomeType &operator=(const SomeType &S);"); 7815 verifyFormat("f.template operator()<int>();"); 7816 7817 verifyGoogleFormat("operator void*();"); 7818 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7819 verifyGoogleFormat("operator ::A();"); 7820 7821 verifyFormat("using A::operator+;"); 7822 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7823 "int i;"); 7824 } 7825 7826 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7827 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7828 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7829 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7830 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7831 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7832 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7833 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7834 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7835 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7836 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7837 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7838 verifyFormat("void Fn(T const &) const &;"); 7839 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7840 verifyFormat("template <typename T>\n" 7841 "void F(T) && = delete;", 7842 getGoogleStyle()); 7843 7844 FormatStyle AlignLeft = getLLVMStyle(); 7845 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7846 verifyFormat("void A::b() && {}", AlignLeft); 7847 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7848 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7849 AlignLeft); 7850 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7851 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7852 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7853 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7854 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7855 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7856 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7857 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7858 7859 FormatStyle Spaces = getLLVMStyle(); 7860 Spaces.SpacesInCStyleCastParentheses = true; 7861 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7862 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7863 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7864 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7865 7866 Spaces.SpacesInCStyleCastParentheses = false; 7867 Spaces.SpacesInParentheses = true; 7868 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7869 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7870 Spaces); 7871 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7872 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7873 7874 FormatStyle BreakTemplate = getLLVMStyle(); 7875 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7876 7877 verifyFormat("struct f {\n" 7878 " template <class T>\n" 7879 " int &foo(const std::string &str) &noexcept {}\n" 7880 "};", 7881 BreakTemplate); 7882 7883 verifyFormat("struct f {\n" 7884 " template <class T>\n" 7885 " int &foo(const std::string &str) &&noexcept {}\n" 7886 "};", 7887 BreakTemplate); 7888 7889 verifyFormat("struct f {\n" 7890 " template <class T>\n" 7891 " int &foo(const std::string &str) const &noexcept {}\n" 7892 "};", 7893 BreakTemplate); 7894 7895 verifyFormat("struct f {\n" 7896 " template <class T>\n" 7897 " int &foo(const std::string &str) const &noexcept {}\n" 7898 "};", 7899 BreakTemplate); 7900 7901 verifyFormat("struct f {\n" 7902 " template <class T>\n" 7903 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7904 "};", 7905 BreakTemplate); 7906 7907 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7908 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7909 FormatStyle::BTDS_Yes; 7910 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7911 7912 verifyFormat("struct f {\n" 7913 " template <class T>\n" 7914 " int& foo(const std::string& str) & noexcept {}\n" 7915 "};", 7916 AlignLeftBreakTemplate); 7917 7918 verifyFormat("struct f {\n" 7919 " template <class T>\n" 7920 " int& foo(const std::string& str) && noexcept {}\n" 7921 "};", 7922 AlignLeftBreakTemplate); 7923 7924 verifyFormat("struct f {\n" 7925 " template <class T>\n" 7926 " int& foo(const std::string& str) const& noexcept {}\n" 7927 "};", 7928 AlignLeftBreakTemplate); 7929 7930 verifyFormat("struct f {\n" 7931 " template <class T>\n" 7932 " int& foo(const std::string& str) const&& noexcept {}\n" 7933 "};", 7934 AlignLeftBreakTemplate); 7935 7936 verifyFormat("struct f {\n" 7937 " template <class T>\n" 7938 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7939 "};", 7940 AlignLeftBreakTemplate); 7941 7942 // The `&` in `Type&` should not be confused with a trailing `&` of 7943 // DEPRECATED(reason) member function. 7944 verifyFormat("struct f {\n" 7945 " template <class T>\n" 7946 " DEPRECATED(reason)\n" 7947 " Type &foo(arguments) {}\n" 7948 "};", 7949 BreakTemplate); 7950 7951 verifyFormat("struct f {\n" 7952 " template <class T>\n" 7953 " DEPRECATED(reason)\n" 7954 " Type& foo(arguments) {}\n" 7955 "};", 7956 AlignLeftBreakTemplate); 7957 7958 verifyFormat("void (*foopt)(int) = &func;"); 7959 } 7960 7961 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7962 verifyFormat("void f() {\n" 7963 " A *a = new A;\n" 7964 " A *a = new (placement) A;\n" 7965 " delete a;\n" 7966 " delete (A *)a;\n" 7967 "}"); 7968 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7969 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7970 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7971 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7972 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7973 verifyFormat("delete[] h->p;"); 7974 } 7975 7976 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7977 verifyFormat("int *f(int *a) {}"); 7978 verifyFormat("int main(int argc, char **argv) {}"); 7979 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7980 verifyIndependentOfContext("f(a, *a);"); 7981 verifyFormat("void g() { f(*a); }"); 7982 verifyIndependentOfContext("int a = b * 10;"); 7983 verifyIndependentOfContext("int a = 10 * b;"); 7984 verifyIndependentOfContext("int a = b * c;"); 7985 verifyIndependentOfContext("int a += b * c;"); 7986 verifyIndependentOfContext("int a -= b * c;"); 7987 verifyIndependentOfContext("int a *= b * c;"); 7988 verifyIndependentOfContext("int a /= b * c;"); 7989 verifyIndependentOfContext("int a = *b;"); 7990 verifyIndependentOfContext("int a = *b * c;"); 7991 verifyIndependentOfContext("int a = b * *c;"); 7992 verifyIndependentOfContext("int a = b * (10);"); 7993 verifyIndependentOfContext("S << b * (10);"); 7994 verifyIndependentOfContext("return 10 * b;"); 7995 verifyIndependentOfContext("return *b * *c;"); 7996 verifyIndependentOfContext("return a & ~b;"); 7997 verifyIndependentOfContext("f(b ? *c : *d);"); 7998 verifyIndependentOfContext("int a = b ? *c : *d;"); 7999 verifyIndependentOfContext("*b = a;"); 8000 verifyIndependentOfContext("a * ~b;"); 8001 verifyIndependentOfContext("a * !b;"); 8002 verifyIndependentOfContext("a * +b;"); 8003 verifyIndependentOfContext("a * -b;"); 8004 verifyIndependentOfContext("a * ++b;"); 8005 verifyIndependentOfContext("a * --b;"); 8006 verifyIndependentOfContext("a[4] * b;"); 8007 verifyIndependentOfContext("a[a * a] = 1;"); 8008 verifyIndependentOfContext("f() * b;"); 8009 verifyIndependentOfContext("a * [self dostuff];"); 8010 verifyIndependentOfContext("int x = a * (a + b);"); 8011 verifyIndependentOfContext("(a *)(a + b);"); 8012 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 8013 verifyIndependentOfContext("int *pa = (int *)&a;"); 8014 verifyIndependentOfContext("return sizeof(int **);"); 8015 verifyIndependentOfContext("return sizeof(int ******);"); 8016 verifyIndependentOfContext("return (int **&)a;"); 8017 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 8018 verifyFormat("void f(Type (*parameter)[10]) {}"); 8019 verifyFormat("void f(Type (¶meter)[10]) {}"); 8020 verifyGoogleFormat("return sizeof(int**);"); 8021 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 8022 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 8023 verifyFormat("auto a = [](int **&, int ***) {};"); 8024 verifyFormat("auto PointerBinding = [](const char *S) {};"); 8025 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 8026 verifyFormat("[](const decltype(*a) &value) {}"); 8027 verifyFormat("[](const typeof(*a) &value) {}"); 8028 verifyFormat("[](const _Atomic(a *) &value) {}"); 8029 verifyFormat("[](const __underlying_type(a) &value) {}"); 8030 verifyFormat("decltype(a * b) F();"); 8031 verifyFormat("typeof(a * b) F();"); 8032 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 8033 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 8034 verifyIndependentOfContext("typedef void (*f)(int *a);"); 8035 verifyIndependentOfContext("int i{a * b};"); 8036 verifyIndependentOfContext("aaa && aaa->f();"); 8037 verifyIndependentOfContext("int x = ~*p;"); 8038 verifyFormat("Constructor() : a(a), area(width * height) {}"); 8039 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 8040 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 8041 verifyFormat("void f() { f(a, c * d); }"); 8042 verifyFormat("void f() { f(new a(), c * d); }"); 8043 verifyFormat("void f(const MyOverride &override);"); 8044 verifyFormat("void f(const MyFinal &final);"); 8045 verifyIndependentOfContext("bool a = f() && override.f();"); 8046 verifyIndependentOfContext("bool a = f() && final.f();"); 8047 8048 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 8049 8050 verifyIndependentOfContext("A<int *> a;"); 8051 verifyIndependentOfContext("A<int **> a;"); 8052 verifyIndependentOfContext("A<int *, int *> a;"); 8053 verifyIndependentOfContext("A<int *[]> a;"); 8054 verifyIndependentOfContext( 8055 "const char *const p = reinterpret_cast<const char *const>(q);"); 8056 verifyIndependentOfContext("A<int **, int **> a;"); 8057 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 8058 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 8059 verifyFormat("for (; a && b;) {\n}"); 8060 verifyFormat("bool foo = true && [] { return false; }();"); 8061 8062 verifyFormat( 8063 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8065 8066 verifyGoogleFormat("int const* a = &b;"); 8067 verifyGoogleFormat("**outparam = 1;"); 8068 verifyGoogleFormat("*outparam = a * b;"); 8069 verifyGoogleFormat("int main(int argc, char** argv) {}"); 8070 verifyGoogleFormat("A<int*> a;"); 8071 verifyGoogleFormat("A<int**> a;"); 8072 verifyGoogleFormat("A<int*, int*> a;"); 8073 verifyGoogleFormat("A<int**, int**> a;"); 8074 verifyGoogleFormat("f(b ? *c : *d);"); 8075 verifyGoogleFormat("int a = b ? *c : *d;"); 8076 verifyGoogleFormat("Type* t = **x;"); 8077 verifyGoogleFormat("Type* t = *++*x;"); 8078 verifyGoogleFormat("*++*x;"); 8079 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 8080 verifyGoogleFormat("Type* t = x++ * y;"); 8081 verifyGoogleFormat( 8082 "const char* const p = reinterpret_cast<const char* const>(q);"); 8083 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 8084 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 8085 verifyGoogleFormat("template <typename T>\n" 8086 "void f(int i = 0, SomeType** temps = NULL);"); 8087 8088 FormatStyle Left = getLLVMStyle(); 8089 Left.PointerAlignment = FormatStyle::PAS_Left; 8090 verifyFormat("x = *a(x) = *a(y);", Left); 8091 verifyFormat("for (;; *a = b) {\n}", Left); 8092 verifyFormat("return *this += 1;", Left); 8093 verifyFormat("throw *x;", Left); 8094 verifyFormat("delete *x;", Left); 8095 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 8096 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 8097 verifyFormat("[](const typeof(*a)* ptr) {}", Left); 8098 verifyFormat("[](const _Atomic(a*)* ptr) {}", Left); 8099 verifyFormat("[](const __underlying_type(a)* ptr) {}", Left); 8100 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 8101 verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left); 8102 verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left); 8103 verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left); 8104 8105 verifyIndependentOfContext("a = *(x + y);"); 8106 verifyIndependentOfContext("a = &(x + y);"); 8107 verifyIndependentOfContext("*(x + y).call();"); 8108 verifyIndependentOfContext("&(x + y)->call();"); 8109 verifyFormat("void f() { &(*I).first; }"); 8110 8111 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 8112 verifyFormat( 8113 "int *MyValues = {\n" 8114 " *A, // Operator detection might be confused by the '{'\n" 8115 " *BB // Operator detection might be confused by previous comment\n" 8116 "};"); 8117 8118 verifyIndependentOfContext("if (int *a = &b)"); 8119 verifyIndependentOfContext("if (int &a = *b)"); 8120 verifyIndependentOfContext("if (a & b[i])"); 8121 verifyIndependentOfContext("if constexpr (a & b[i])"); 8122 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 8123 verifyIndependentOfContext("if (a * (b * c))"); 8124 verifyIndependentOfContext("if constexpr (a * (b * c))"); 8125 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 8126 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 8127 verifyIndependentOfContext("if (*b[i])"); 8128 verifyIndependentOfContext("if (int *a = (&b))"); 8129 verifyIndependentOfContext("while (int *a = &b)"); 8130 verifyIndependentOfContext("while (a * (b * c))"); 8131 verifyIndependentOfContext("size = sizeof *a;"); 8132 verifyIndependentOfContext("if (a && (b = c))"); 8133 verifyFormat("void f() {\n" 8134 " for (const int &v : Values) {\n" 8135 " }\n" 8136 "}"); 8137 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 8138 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 8139 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 8140 8141 verifyFormat("#define A (!a * b)"); 8142 verifyFormat("#define MACRO \\\n" 8143 " int *i = a * b; \\\n" 8144 " void f(a *b);", 8145 getLLVMStyleWithColumns(19)); 8146 8147 verifyIndependentOfContext("A = new SomeType *[Length];"); 8148 verifyIndependentOfContext("A = new SomeType *[Length]();"); 8149 verifyIndependentOfContext("T **t = new T *;"); 8150 verifyIndependentOfContext("T **t = new T *();"); 8151 verifyGoogleFormat("A = new SomeType*[Length]();"); 8152 verifyGoogleFormat("A = new SomeType*[Length];"); 8153 verifyGoogleFormat("T** t = new T*;"); 8154 verifyGoogleFormat("T** t = new T*();"); 8155 8156 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 8157 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 8158 verifyFormat("template <bool a, bool b> " 8159 "typename t::if<x && y>::type f() {}"); 8160 verifyFormat("template <int *y> f() {}"); 8161 verifyFormat("vector<int *> v;"); 8162 verifyFormat("vector<int *const> v;"); 8163 verifyFormat("vector<int *const **const *> v;"); 8164 verifyFormat("vector<int *volatile> v;"); 8165 verifyFormat("vector<a *_Nonnull> v;"); 8166 verifyFormat("vector<a *_Nullable> v;"); 8167 verifyFormat("vector<a *_Null_unspecified> v;"); 8168 verifyFormat("vector<a *__ptr32> v;"); 8169 verifyFormat("vector<a *__ptr64> v;"); 8170 verifyFormat("vector<a *__capability> v;"); 8171 FormatStyle TypeMacros = getLLVMStyle(); 8172 TypeMacros.TypenameMacros = {"LIST"}; 8173 verifyFormat("vector<LIST(uint64_t)> v;", TypeMacros); 8174 verifyFormat("vector<LIST(uint64_t) *> v;", TypeMacros); 8175 verifyFormat("vector<LIST(uint64_t) **> v;", TypeMacros); 8176 verifyFormat("vector<LIST(uint64_t) *attr> v;", TypeMacros); 8177 verifyFormat("vector<A(uint64_t) * attr> v;", TypeMacros); // multiplication 8178 8179 FormatStyle CustomQualifier = getLLVMStyle(); 8180 // Add indentifers that should not be parsed as a qualifier by default. 8181 CustomQualifier.AttributeMacros.push_back("__my_qualifier"); 8182 CustomQualifier.AttributeMacros.push_back("_My_qualifier"); 8183 CustomQualifier.AttributeMacros.push_back("my_other_qualifier"); 8184 verifyFormat("vector<a * __my_qualifier> parse_as_multiply;"); 8185 verifyFormat("vector<a *__my_qualifier> v;", CustomQualifier); 8186 verifyFormat("vector<a * _My_qualifier> parse_as_multiply;"); 8187 verifyFormat("vector<a *_My_qualifier> v;", CustomQualifier); 8188 verifyFormat("vector<a * my_other_qualifier> parse_as_multiply;"); 8189 verifyFormat("vector<a *my_other_qualifier> v;", CustomQualifier); 8190 verifyFormat("vector<a * _NotAQualifier> v;"); 8191 verifyFormat("vector<a * __not_a_qualifier> v;"); 8192 verifyFormat("vector<a * b> v;"); 8193 verifyFormat("foo<b && false>();"); 8194 verifyFormat("foo<b & 1>();"); 8195 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 8196 verifyFormat("typeof(*::std::declval<const T &>()) void F();"); 8197 verifyFormat("_Atomic(*::std::declval<const T &>()) void F();"); 8198 verifyFormat("__underlying_type(*::std::declval<const T &>()) void F();"); 8199 verifyFormat( 8200 "template <class T, class = typename std::enable_if<\n" 8201 " std::is_integral<T>::value &&\n" 8202 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 8203 "void F();", 8204 getLLVMStyleWithColumns(70)); 8205 verifyFormat("template <class T,\n" 8206 " class = typename std::enable_if<\n" 8207 " std::is_integral<T>::value &&\n" 8208 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 8209 " class U>\n" 8210 "void F();", 8211 getLLVMStyleWithColumns(70)); 8212 verifyFormat( 8213 "template <class T,\n" 8214 " class = typename ::std::enable_if<\n" 8215 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 8216 "void F();", 8217 getGoogleStyleWithColumns(68)); 8218 8219 verifyIndependentOfContext("MACRO(int *i);"); 8220 verifyIndependentOfContext("MACRO(auto *a);"); 8221 verifyIndependentOfContext("MACRO(const A *a);"); 8222 verifyIndependentOfContext("MACRO(_Atomic(A) *a);"); 8223 verifyIndependentOfContext("MACRO(decltype(A) *a);"); 8224 verifyIndependentOfContext("MACRO(typeof(A) *a);"); 8225 verifyIndependentOfContext("MACRO(__underlying_type(A) *a);"); 8226 verifyIndependentOfContext("MACRO(A *const a);"); 8227 verifyIndependentOfContext("MACRO(A *restrict a);"); 8228 verifyIndependentOfContext("MACRO(A *__restrict__ a);"); 8229 verifyIndependentOfContext("MACRO(A *__restrict a);"); 8230 verifyIndependentOfContext("MACRO(A *volatile a);"); 8231 verifyIndependentOfContext("MACRO(A *__volatile a);"); 8232 verifyIndependentOfContext("MACRO(A *__volatile__ a);"); 8233 verifyIndependentOfContext("MACRO(A *_Nonnull a);"); 8234 verifyIndependentOfContext("MACRO(A *_Nullable a);"); 8235 verifyIndependentOfContext("MACRO(A *_Null_unspecified a);"); 8236 verifyIndependentOfContext("MACRO(A *__attribute__((foo)) a);"); 8237 verifyIndependentOfContext("MACRO(A *__attribute((foo)) a);"); 8238 verifyIndependentOfContext("MACRO(A *[[clang::attr]] a);"); 8239 verifyIndependentOfContext("MACRO(A *[[clang::attr(\"foo\")]] a);"); 8240 verifyIndependentOfContext("MACRO(A *__ptr32 a);"); 8241 verifyIndependentOfContext("MACRO(A *__ptr64 a);"); 8242 verifyIndependentOfContext("MACRO(A *__capability);"); 8243 verifyIndependentOfContext("MACRO(A &__capability);"); 8244 verifyFormat("MACRO(A *__my_qualifier);"); // type declaration 8245 verifyFormat("void f() { MACRO(A * __my_qualifier); }"); // multiplication 8246 // If we add __my_qualifier to AttributeMacros it should always be parsed as 8247 // a type declaration: 8248 verifyFormat("MACRO(A *__my_qualifier);", CustomQualifier); 8249 verifyFormat("void f() { MACRO(A *__my_qualifier); }", CustomQualifier); 8250 // Also check that TypenameMacros prevents parsing it as multiplication: 8251 verifyIndependentOfContext("MACRO(LIST(uint64_t) * a);"); // multiplication 8252 verifyIndependentOfContext("MACRO(LIST(uint64_t) *a);", TypeMacros); // type 8253 8254 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 8255 verifyFormat("void f() { f(float{1}, a * a); }"); 8256 // FIXME: Is there a way to make this work? 8257 // verifyIndependentOfContext("MACRO(A *a);"); 8258 verifyFormat("MACRO(A &B);"); 8259 verifyFormat("MACRO(A *B);"); 8260 verifyFormat("void f() { MACRO(A * B); }"); 8261 verifyFormat("void f() { MACRO(A & B); }"); 8262 8263 // This lambda was mis-formatted after D88956 (treating it as a binop): 8264 verifyFormat("auto x = [](const decltype(x) &ptr) {};"); 8265 verifyFormat("auto x = [](const decltype(x) *ptr) {};"); 8266 verifyFormat("#define lambda [](const decltype(x) &ptr) {}"); 8267 verifyFormat("#define lambda [](const decltype(x) *ptr) {}"); 8268 8269 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 8270 verifyFormat("return options != nullptr && operator==(*options);"); 8271 8272 EXPECT_EQ("#define OP(x) \\\n" 8273 " ostream &operator<<(ostream &s, const A &a) { \\\n" 8274 " return s << a.DebugString(); \\\n" 8275 " }", 8276 format("#define OP(x) \\\n" 8277 " ostream &operator<<(ostream &s, const A &a) { \\\n" 8278 " return s << a.DebugString(); \\\n" 8279 " }", 8280 getLLVMStyleWithColumns(50))); 8281 8282 // FIXME: We cannot handle this case yet; we might be able to figure out that 8283 // foo<x> d > v; doesn't make sense. 8284 verifyFormat("foo<a<b && c> d> v;"); 8285 8286 FormatStyle PointerMiddle = getLLVMStyle(); 8287 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 8288 verifyFormat("delete *x;", PointerMiddle); 8289 verifyFormat("int * x;", PointerMiddle); 8290 verifyFormat("int *[] x;", PointerMiddle); 8291 verifyFormat("template <int * y> f() {}", PointerMiddle); 8292 verifyFormat("int * f(int * a) {}", PointerMiddle); 8293 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 8294 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 8295 verifyFormat("A<int *> a;", PointerMiddle); 8296 verifyFormat("A<int **> a;", PointerMiddle); 8297 verifyFormat("A<int *, int *> a;", PointerMiddle); 8298 verifyFormat("A<int *[]> a;", PointerMiddle); 8299 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 8300 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 8301 verifyFormat("T ** t = new T *;", PointerMiddle); 8302 8303 // Member function reference qualifiers aren't binary operators. 8304 verifyFormat("string // break\n" 8305 "operator()() & {}"); 8306 verifyFormat("string // break\n" 8307 "operator()() && {}"); 8308 verifyGoogleFormat("template <typename T>\n" 8309 "auto x() & -> int {}"); 8310 } 8311 8312 TEST_F(FormatTest, UnderstandsAttributes) { 8313 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 8314 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 8315 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8316 FormatStyle AfterType = getLLVMStyle(); 8317 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 8318 verifyFormat("__attribute__((nodebug)) void\n" 8319 "foo() {}\n", 8320 AfterType); 8321 verifyFormat("__unused void\n" 8322 "foo() {}", 8323 AfterType); 8324 8325 FormatStyle CustomAttrs = getLLVMStyle(); 8326 CustomAttrs.AttributeMacros.push_back("__unused"); 8327 CustomAttrs.AttributeMacros.push_back("__attr1"); 8328 CustomAttrs.AttributeMacros.push_back("__attr2"); 8329 CustomAttrs.AttributeMacros.push_back("no_underscore_attr"); 8330 verifyFormat("vector<SomeType *__attribute((foo))> v;"); 8331 verifyFormat("vector<SomeType *__attribute__((foo))> v;"); 8332 verifyFormat("vector<SomeType * __not_attribute__((foo))> v;"); 8333 // Check that it is parsed as a multiplication without AttributeMacros and 8334 // as a pointer qualifier when we add __attr1/__attr2 to AttributeMacros. 8335 verifyFormat("vector<SomeType * __attr1> v;"); 8336 verifyFormat("vector<SomeType __attr1 *> v;"); 8337 verifyFormat("vector<SomeType __attr1 *const> v;"); 8338 verifyFormat("vector<SomeType __attr1 * __attr2> v;"); 8339 verifyFormat("vector<SomeType *__attr1> v;", CustomAttrs); 8340 verifyFormat("vector<SomeType *__attr2> v;", CustomAttrs); 8341 verifyFormat("vector<SomeType *no_underscore_attr> v;", CustomAttrs); 8342 verifyFormat("vector<SomeType __attr1 *> v;", CustomAttrs); 8343 verifyFormat("vector<SomeType __attr1 *const> v;", CustomAttrs); 8344 verifyFormat("vector<SomeType __attr1 *__attr2> v;", CustomAttrs); 8345 verifyFormat("vector<SomeType __attr1 *no_underscore_attr> v;", CustomAttrs); 8346 8347 // Check that these are not parsed as function declarations: 8348 CustomAttrs.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8349 CustomAttrs.BreakBeforeBraces = FormatStyle::BS_Allman; 8350 verifyFormat("SomeType s(InitValue);", CustomAttrs); 8351 verifyFormat("SomeType s{InitValue};", CustomAttrs); 8352 verifyFormat("SomeType *__unused s(InitValue);", CustomAttrs); 8353 verifyFormat("SomeType *__unused s{InitValue};", CustomAttrs); 8354 verifyFormat("SomeType s __unused(InitValue);", CustomAttrs); 8355 verifyFormat("SomeType s __unused{InitValue};", CustomAttrs); 8356 verifyFormat("SomeType *__capability s(InitValue);", CustomAttrs); 8357 verifyFormat("SomeType *__capability s{InitValue};", CustomAttrs); 8358 } 8359 8360 TEST_F(FormatTest, UnderstandsPointerQualifiersInCast) { 8361 // Check that qualifiers on pointers don't break parsing of casts. 8362 verifyFormat("x = (foo *const)*v;"); 8363 verifyFormat("x = (foo *volatile)*v;"); 8364 verifyFormat("x = (foo *restrict)*v;"); 8365 verifyFormat("x = (foo *__attribute__((foo)))*v;"); 8366 verifyFormat("x = (foo *_Nonnull)*v;"); 8367 verifyFormat("x = (foo *_Nullable)*v;"); 8368 verifyFormat("x = (foo *_Null_unspecified)*v;"); 8369 verifyFormat("x = (foo *_Nonnull)*v;"); 8370 verifyFormat("x = (foo *[[clang::attr]])*v;"); 8371 verifyFormat("x = (foo *[[clang::attr(\"foo\")]])*v;"); 8372 verifyFormat("x = (foo *__ptr32)*v;"); 8373 verifyFormat("x = (foo *__ptr64)*v;"); 8374 verifyFormat("x = (foo *__capability)*v;"); 8375 8376 // Check that we handle multiple trailing qualifiers and skip them all to 8377 // determine that the expression is a cast to a pointer type. 8378 FormatStyle LongPointerRight = getLLVMStyleWithColumns(999); 8379 FormatStyle LongPointerLeft = getLLVMStyleWithColumns(999); 8380 LongPointerLeft.PointerAlignment = FormatStyle::PAS_Left; 8381 StringRef AllQualifiers = 8382 "const volatile restrict __attribute__((foo)) _Nonnull _Null_unspecified " 8383 "_Nonnull [[clang::attr]] __ptr32 __ptr64 __capability"; 8384 verifyFormat(("x = (foo *" + AllQualifiers + ")*v;").str(), LongPointerRight); 8385 verifyFormat(("x = (foo* " + AllQualifiers + ")*v;").str(), LongPointerLeft); 8386 8387 // Also check that address-of is not parsed as a binary bitwise-and: 8388 verifyFormat("x = (foo *const)&v;"); 8389 verifyFormat(("x = (foo *" + AllQualifiers + ")&v;").str(), LongPointerRight); 8390 verifyFormat(("x = (foo* " + AllQualifiers + ")&v;").str(), LongPointerLeft); 8391 8392 // Check custom qualifiers: 8393 FormatStyle CustomQualifier = getLLVMStyleWithColumns(999); 8394 CustomQualifier.AttributeMacros.push_back("__my_qualifier"); 8395 verifyFormat("x = (foo * __my_qualifier) * v;"); // not parsed as qualifier. 8396 verifyFormat("x = (foo *__my_qualifier)*v;", CustomQualifier); 8397 verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)*v;").str(), 8398 CustomQualifier); 8399 verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)&v;").str(), 8400 CustomQualifier); 8401 8402 // Check that unknown identifiers result in binary operator parsing: 8403 verifyFormat("x = (foo * __unknown_qualifier) * v;"); 8404 verifyFormat("x = (foo * __unknown_qualifier) & v;"); 8405 } 8406 8407 TEST_F(FormatTest, UnderstandsSquareAttributes) { 8408 verifyFormat("SomeType s [[unused]] (InitValue);"); 8409 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 8410 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 8411 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 8412 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 8413 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8414 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8415 verifyFormat("[[nodiscard]] bool f() { return false; }"); 8416 verifyFormat("class [[nodiscard]] f {\npublic:\n f() {}\n}"); 8417 verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n f() {}\n}"); 8418 verifyFormat("class [[gnu::unused]] f {\npublic:\n f() {}\n}"); 8419 8420 // Make sure we do not mistake attributes for array subscripts. 8421 verifyFormat("int a() {}\n" 8422 "[[unused]] int b() {}\n"); 8423 verifyFormat("NSArray *arr;\n" 8424 "arr[[Foo() bar]];"); 8425 8426 // On the other hand, we still need to correctly find array subscripts. 8427 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 8428 8429 // Make sure that we do not mistake Objective-C method inside array literals 8430 // as attributes, even if those method names are also keywords. 8431 verifyFormat("@[ [foo bar] ];"); 8432 verifyFormat("@[ [NSArray class] ];"); 8433 verifyFormat("@[ [foo enum] ];"); 8434 8435 verifyFormat("template <typename T> [[nodiscard]] int a() { return 1; }"); 8436 8437 // Make sure we do not parse attributes as lambda introducers. 8438 FormatStyle MultiLineFunctions = getLLVMStyle(); 8439 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8440 verifyFormat("[[unused]] int b() {\n" 8441 " return 42;\n" 8442 "}\n", 8443 MultiLineFunctions); 8444 } 8445 8446 TEST_F(FormatTest, AttributeClass) { 8447 FormatStyle Style = getChromiumStyle(FormatStyle::LK_Cpp); 8448 verifyFormat("class S {\n" 8449 " S(S&&) = default;\n" 8450 "};", 8451 Style); 8452 verifyFormat("class [[nodiscard]] S {\n" 8453 " S(S&&) = default;\n" 8454 "};", 8455 Style); 8456 verifyFormat("class __attribute((maybeunused)) S {\n" 8457 " S(S&&) = default;\n" 8458 "};", 8459 Style); 8460 verifyFormat("struct S {\n" 8461 " S(S&&) = default;\n" 8462 "};", 8463 Style); 8464 verifyFormat("struct [[nodiscard]] S {\n" 8465 " S(S&&) = default;\n" 8466 "};", 8467 Style); 8468 } 8469 8470 TEST_F(FormatTest, AttributesAfterMacro) { 8471 FormatStyle Style = getLLVMStyle(); 8472 verifyFormat("MACRO;\n" 8473 "__attribute__((maybe_unused)) int foo() {\n" 8474 " //...\n" 8475 "}"); 8476 8477 verifyFormat("MACRO;\n" 8478 "[[nodiscard]] int foo() {\n" 8479 " //...\n" 8480 "}"); 8481 8482 EXPECT_EQ("MACRO\n\n" 8483 "__attribute__((maybe_unused)) int foo() {\n" 8484 " //...\n" 8485 "}", 8486 format("MACRO\n\n" 8487 "__attribute__((maybe_unused)) int foo() {\n" 8488 " //...\n" 8489 "}")); 8490 8491 EXPECT_EQ("MACRO\n\n" 8492 "[[nodiscard]] int foo() {\n" 8493 " //...\n" 8494 "}", 8495 format("MACRO\n\n" 8496 "[[nodiscard]] int foo() {\n" 8497 " //...\n" 8498 "}")); 8499 } 8500 8501 TEST_F(FormatTest, AttributePenaltyBreaking) { 8502 FormatStyle Style = getLLVMStyle(); 8503 verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n" 8504 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8505 Style); 8506 verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n" 8507 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8508 Style); 8509 verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const " 8510 "shared_ptr<ALongTypeName> &C d) {\n}", 8511 Style); 8512 } 8513 8514 TEST_F(FormatTest, UnderstandsEllipsis) { 8515 FormatStyle Style = getLLVMStyle(); 8516 verifyFormat("int printf(const char *fmt, ...);"); 8517 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 8518 verifyFormat("template <class... Ts> void Foo(Ts *...ts) {}"); 8519 8520 verifyFormat("template <int *...PP> a;", Style); 8521 8522 Style.PointerAlignment = FormatStyle::PAS_Left; 8523 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", Style); 8524 8525 verifyFormat("template <int*... PP> a;", Style); 8526 8527 Style.PointerAlignment = FormatStyle::PAS_Middle; 8528 verifyFormat("template <int *... PP> a;", Style); 8529 } 8530 8531 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 8532 EXPECT_EQ("int *a;\n" 8533 "int *a;\n" 8534 "int *a;", 8535 format("int *a;\n" 8536 "int* a;\n" 8537 "int *a;", 8538 getGoogleStyle())); 8539 EXPECT_EQ("int* a;\n" 8540 "int* a;\n" 8541 "int* a;", 8542 format("int* a;\n" 8543 "int* a;\n" 8544 "int *a;", 8545 getGoogleStyle())); 8546 EXPECT_EQ("int *a;\n" 8547 "int *a;\n" 8548 "int *a;", 8549 format("int *a;\n" 8550 "int * a;\n" 8551 "int * a;", 8552 getGoogleStyle())); 8553 EXPECT_EQ("auto x = [] {\n" 8554 " int *a;\n" 8555 " int *a;\n" 8556 " int *a;\n" 8557 "};", 8558 format("auto x=[]{int *a;\n" 8559 "int * a;\n" 8560 "int * a;};", 8561 getGoogleStyle())); 8562 } 8563 8564 TEST_F(FormatTest, UnderstandsRvalueReferences) { 8565 verifyFormat("int f(int &&a) {}"); 8566 verifyFormat("int f(int a, char &&b) {}"); 8567 verifyFormat("void f() { int &&a = b; }"); 8568 verifyGoogleFormat("int f(int a, char&& b) {}"); 8569 verifyGoogleFormat("void f() { int&& a = b; }"); 8570 8571 verifyIndependentOfContext("A<int &&> a;"); 8572 verifyIndependentOfContext("A<int &&, int &&> a;"); 8573 verifyGoogleFormat("A<int&&> a;"); 8574 verifyGoogleFormat("A<int&&, int&&> a;"); 8575 8576 // Not rvalue references: 8577 verifyFormat("template <bool B, bool C> class A {\n" 8578 " static_assert(B && C, \"Something is wrong\");\n" 8579 "};"); 8580 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 8581 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 8582 verifyFormat("#define A(a, b) (a && b)"); 8583 } 8584 8585 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 8586 verifyFormat("void f() {\n" 8587 " x[aaaaaaaaa -\n" 8588 " b] = 23;\n" 8589 "}", 8590 getLLVMStyleWithColumns(15)); 8591 } 8592 8593 TEST_F(FormatTest, FormatsCasts) { 8594 verifyFormat("Type *A = static_cast<Type *>(P);"); 8595 verifyFormat("Type *A = (Type *)P;"); 8596 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 8597 verifyFormat("int a = (int)(2.0f);"); 8598 verifyFormat("int a = (int)2.0f;"); 8599 verifyFormat("x[(int32)y];"); 8600 verifyFormat("x = (int32)y;"); 8601 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 8602 verifyFormat("int a = (int)*b;"); 8603 verifyFormat("int a = (int)2.0f;"); 8604 verifyFormat("int a = (int)~0;"); 8605 verifyFormat("int a = (int)++a;"); 8606 verifyFormat("int a = (int)sizeof(int);"); 8607 verifyFormat("int a = (int)+2;"); 8608 verifyFormat("my_int a = (my_int)2.0f;"); 8609 verifyFormat("my_int a = (my_int)sizeof(int);"); 8610 verifyFormat("return (my_int)aaa;"); 8611 verifyFormat("#define x ((int)-1)"); 8612 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 8613 verifyFormat("#define p(q) ((int *)&q)"); 8614 verifyFormat("fn(a)(b) + 1;"); 8615 8616 verifyFormat("void f() { my_int a = (my_int)*b; }"); 8617 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 8618 verifyFormat("my_int a = (my_int)~0;"); 8619 verifyFormat("my_int a = (my_int)++a;"); 8620 verifyFormat("my_int a = (my_int)-2;"); 8621 verifyFormat("my_int a = (my_int)1;"); 8622 verifyFormat("my_int a = (my_int *)1;"); 8623 verifyFormat("my_int a = (const my_int)-1;"); 8624 verifyFormat("my_int a = (const my_int *)-1;"); 8625 verifyFormat("my_int a = (my_int)(my_int)-1;"); 8626 verifyFormat("my_int a = (ns::my_int)-2;"); 8627 verifyFormat("case (my_int)ONE:"); 8628 verifyFormat("auto x = (X)this;"); 8629 // Casts in Obj-C style calls used to not be recognized as such. 8630 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 8631 8632 // FIXME: single value wrapped with paren will be treated as cast. 8633 verifyFormat("void f(int i = (kValue)*kMask) {}"); 8634 8635 verifyFormat("{ (void)F; }"); 8636 8637 // Don't break after a cast's 8638 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 8639 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 8640 " bbbbbbbbbbbbbbbbbbbbbb);"); 8641 8642 // These are not casts. 8643 verifyFormat("void f(int *) {}"); 8644 verifyFormat("f(foo)->b;"); 8645 verifyFormat("f(foo).b;"); 8646 verifyFormat("f(foo)(b);"); 8647 verifyFormat("f(foo)[b];"); 8648 verifyFormat("[](foo) { return 4; }(bar);"); 8649 verifyFormat("(*funptr)(foo)[4];"); 8650 verifyFormat("funptrs[4](foo)[4];"); 8651 verifyFormat("void f(int *);"); 8652 verifyFormat("void f(int *) = 0;"); 8653 verifyFormat("void f(SmallVector<int>) {}"); 8654 verifyFormat("void f(SmallVector<int>);"); 8655 verifyFormat("void f(SmallVector<int>) = 0;"); 8656 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 8657 verifyFormat("int a = sizeof(int) * b;"); 8658 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 8659 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 8660 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 8661 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 8662 8663 // These are not casts, but at some point were confused with casts. 8664 verifyFormat("virtual void foo(int *) override;"); 8665 verifyFormat("virtual void foo(char &) const;"); 8666 verifyFormat("virtual void foo(int *a, char *) const;"); 8667 verifyFormat("int a = sizeof(int *) + b;"); 8668 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 8669 verifyFormat("bool b = f(g<int>) && c;"); 8670 verifyFormat("typedef void (*f)(int i) func;"); 8671 verifyFormat("void operator++(int) noexcept;"); 8672 verifyFormat("void operator++(int &) noexcept;"); 8673 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 8674 "&) noexcept;"); 8675 verifyFormat( 8676 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 8677 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 8678 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 8679 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 8680 verifyFormat("void operator delete(foo &) noexcept;"); 8681 verifyFormat("void operator delete(foo) noexcept;"); 8682 verifyFormat("void operator delete(int) noexcept;"); 8683 verifyFormat("void operator delete(int &) noexcept;"); 8684 verifyFormat("void operator delete(int &) volatile noexcept;"); 8685 verifyFormat("void operator delete(int &) const"); 8686 verifyFormat("void operator delete(int &) = default"); 8687 verifyFormat("void operator delete(int &) = delete"); 8688 verifyFormat("void operator delete(int &) [[noreturn]]"); 8689 verifyFormat("void operator delete(int &) throw();"); 8690 verifyFormat("void operator delete(int &) throw(int);"); 8691 verifyFormat("auto operator delete(int &) -> int;"); 8692 verifyFormat("auto operator delete(int &) override"); 8693 verifyFormat("auto operator delete(int &) final"); 8694 8695 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 8696 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 8697 // FIXME: The indentation here is not ideal. 8698 verifyFormat( 8699 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8700 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 8701 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 8702 } 8703 8704 TEST_F(FormatTest, FormatsFunctionTypes) { 8705 verifyFormat("A<bool()> a;"); 8706 verifyFormat("A<SomeType()> a;"); 8707 verifyFormat("A<void (*)(int, std::string)> a;"); 8708 verifyFormat("A<void *(int)>;"); 8709 verifyFormat("void *(*a)(int *, SomeType *);"); 8710 verifyFormat("int (*func)(void *);"); 8711 verifyFormat("void f() { int (*func)(void *); }"); 8712 verifyFormat("template <class CallbackClass>\n" 8713 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 8714 8715 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 8716 verifyGoogleFormat("void* (*a)(int);"); 8717 verifyGoogleFormat( 8718 "template <class CallbackClass>\n" 8719 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 8720 8721 // Other constructs can look somewhat like function types: 8722 verifyFormat("A<sizeof(*x)> a;"); 8723 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 8724 verifyFormat("some_var = function(*some_pointer_var)[0];"); 8725 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 8726 verifyFormat("int x = f(&h)();"); 8727 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 8728 verifyFormat("std::function<\n" 8729 " LooooooooooongTemplatedType<\n" 8730 " SomeType>*(\n" 8731 " LooooooooooooooooongType type)>\n" 8732 " function;", 8733 getGoogleStyleWithColumns(40)); 8734 } 8735 8736 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 8737 verifyFormat("A (*foo_)[6];"); 8738 verifyFormat("vector<int> (*foo_)[6];"); 8739 } 8740 8741 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 8742 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8743 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8744 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 8745 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8746 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8747 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8748 8749 // Different ways of ()-initializiation. 8750 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8751 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 8752 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8753 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 8754 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8755 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 8756 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8757 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 8758 8759 // Lambdas should not confuse the variable declaration heuristic. 8760 verifyFormat("LooooooooooooooooongType\n" 8761 " variable(nullptr, [](A *a) {});", 8762 getLLVMStyleWithColumns(40)); 8763 } 8764 8765 TEST_F(FormatTest, BreaksLongDeclarations) { 8766 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 8767 " AnotherNameForTheLongType;"); 8768 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 8769 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 8770 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8771 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8772 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 8773 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8774 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8775 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8776 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 8777 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8778 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8779 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8780 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8781 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8782 verifyFormat("typeof(LoooooooooooooooooooooooooooooooooooooooooongName)\n" 8783 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8784 verifyFormat("_Atomic(LooooooooooooooooooooooooooooooooooooooooongName)\n" 8785 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8786 verifyFormat("__underlying_type(LooooooooooooooooooooooooooooooongName)\n" 8787 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8788 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8789 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 8790 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8791 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 8792 FormatStyle Indented = getLLVMStyle(); 8793 Indented.IndentWrappedFunctionNames = true; 8794 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8795 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 8796 Indented); 8797 verifyFormat( 8798 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8799 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8800 Indented); 8801 verifyFormat( 8802 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8803 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8804 Indented); 8805 verifyFormat( 8806 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8807 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8808 Indented); 8809 8810 // FIXME: Without the comment, this breaks after "(". 8811 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 8812 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 8813 getGoogleStyle()); 8814 8815 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 8816 " int LoooooooooooooooooooongParam2) {}"); 8817 verifyFormat( 8818 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 8819 " SourceLocation L, IdentifierIn *II,\n" 8820 " Type *T) {}"); 8821 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 8822 "ReallyReaaallyLongFunctionName(\n" 8823 " const std::string &SomeParameter,\n" 8824 " const SomeType<string, SomeOtherTemplateParameter>\n" 8825 " &ReallyReallyLongParameterName,\n" 8826 " const SomeType<string, SomeOtherTemplateParameter>\n" 8827 " &AnotherLongParameterName) {}"); 8828 verifyFormat("template <typename A>\n" 8829 "SomeLoooooooooooooooooooooongType<\n" 8830 " typename some_namespace::SomeOtherType<A>::Type>\n" 8831 "Function() {}"); 8832 8833 verifyGoogleFormat( 8834 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 8835 " aaaaaaaaaaaaaaaaaaaaaaa;"); 8836 verifyGoogleFormat( 8837 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 8838 " SourceLocation L) {}"); 8839 verifyGoogleFormat( 8840 "some_namespace::LongReturnType\n" 8841 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 8842 " int first_long_parameter, int second_parameter) {}"); 8843 8844 verifyGoogleFormat("template <typename T>\n" 8845 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8846 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 8847 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8848 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 8849 8850 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 8851 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8852 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8853 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8854 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8855 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 8856 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8857 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 8858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 8859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8860 8861 verifyFormat("template <typename T> // Templates on own line.\n" 8862 "static int // Some comment.\n" 8863 "MyFunction(int a);", 8864 getLLVMStyle()); 8865 } 8866 8867 TEST_F(FormatTest, FormatsArrays) { 8868 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8869 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 8870 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 8871 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 8872 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 8873 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 8874 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8875 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8876 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8877 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 8878 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8879 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8880 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8881 verifyFormat( 8882 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 8883 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8884 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 8885 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 8886 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8887 8888 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 8889 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 8890 verifyFormat( 8891 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 8892 " .aaaaaaa[0]\n" 8893 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8894 verifyFormat("a[::b::c];"); 8895 8896 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 8897 8898 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 8899 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 8900 } 8901 8902 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 8903 verifyFormat("(a)->b();"); 8904 verifyFormat("--a;"); 8905 } 8906 8907 TEST_F(FormatTest, HandlesIncludeDirectives) { 8908 verifyFormat("#include <string>\n" 8909 "#include <a/b/c.h>\n" 8910 "#include \"a/b/string\"\n" 8911 "#include \"string.h\"\n" 8912 "#include \"string.h\"\n" 8913 "#include <a-a>\n" 8914 "#include < path with space >\n" 8915 "#include_next <test.h>" 8916 "#include \"abc.h\" // this is included for ABC\n" 8917 "#include \"some long include\" // with a comment\n" 8918 "#include \"some very long include path\"\n" 8919 "#include <some/very/long/include/path>\n", 8920 getLLVMStyleWithColumns(35)); 8921 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 8922 EXPECT_EQ("#include <a>", format("#include<a>")); 8923 8924 verifyFormat("#import <string>"); 8925 verifyFormat("#import <a/b/c.h>"); 8926 verifyFormat("#import \"a/b/string\""); 8927 verifyFormat("#import \"string.h\""); 8928 verifyFormat("#import \"string.h\""); 8929 verifyFormat("#if __has_include(<strstream>)\n" 8930 "#include <strstream>\n" 8931 "#endif"); 8932 8933 verifyFormat("#define MY_IMPORT <a/b>"); 8934 8935 verifyFormat("#if __has_include(<a/b>)"); 8936 verifyFormat("#if __has_include_next(<a/b>)"); 8937 verifyFormat("#define F __has_include(<a/b>)"); 8938 verifyFormat("#define F __has_include_next(<a/b>)"); 8939 8940 // Protocol buffer definition or missing "#". 8941 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 8942 getLLVMStyleWithColumns(30)); 8943 8944 FormatStyle Style = getLLVMStyle(); 8945 Style.AlwaysBreakBeforeMultilineStrings = true; 8946 Style.ColumnLimit = 0; 8947 verifyFormat("#import \"abc.h\"", Style); 8948 8949 // But 'import' might also be a regular C++ namespace. 8950 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8952 } 8953 8954 //===----------------------------------------------------------------------===// 8955 // Error recovery tests. 8956 //===----------------------------------------------------------------------===// 8957 8958 TEST_F(FormatTest, IncompleteParameterLists) { 8959 FormatStyle NoBinPacking = getLLVMStyle(); 8960 NoBinPacking.BinPackParameters = false; 8961 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 8962 " double *min_x,\n" 8963 " double *max_x,\n" 8964 " double *min_y,\n" 8965 " double *max_y,\n" 8966 " double *min_z,\n" 8967 " double *max_z, ) {}", 8968 NoBinPacking); 8969 } 8970 8971 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 8972 verifyFormat("void f() { return; }\n42"); 8973 verifyFormat("void f() {\n" 8974 " if (0)\n" 8975 " return;\n" 8976 "}\n" 8977 "42"); 8978 verifyFormat("void f() { return }\n42"); 8979 verifyFormat("void f() {\n" 8980 " if (0)\n" 8981 " return\n" 8982 "}\n" 8983 "42"); 8984 } 8985 8986 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 8987 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 8988 EXPECT_EQ("void f() {\n" 8989 " if (a)\n" 8990 " return\n" 8991 "}", 8992 format("void f ( ) { if ( a ) return }")); 8993 EXPECT_EQ("namespace N {\n" 8994 "void f()\n" 8995 "}", 8996 format("namespace N { void f() }")); 8997 EXPECT_EQ("namespace N {\n" 8998 "void f() {}\n" 8999 "void g()\n" 9000 "} // namespace N", 9001 format("namespace N { void f( ) { } void g( ) }")); 9002 } 9003 9004 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 9005 verifyFormat("int aaaaaaaa =\n" 9006 " // Overlylongcomment\n" 9007 " b;", 9008 getLLVMStyleWithColumns(20)); 9009 verifyFormat("function(\n" 9010 " ShortArgument,\n" 9011 " LoooooooooooongArgument);\n", 9012 getLLVMStyleWithColumns(20)); 9013 } 9014 9015 TEST_F(FormatTest, IncorrectAccessSpecifier) { 9016 verifyFormat("public:"); 9017 verifyFormat("class A {\n" 9018 "public\n" 9019 " void f() {}\n" 9020 "};"); 9021 verifyFormat("public\n" 9022 "int qwerty;"); 9023 verifyFormat("public\n" 9024 "B {}"); 9025 verifyFormat("public\n" 9026 "{}"); 9027 verifyFormat("public\n" 9028 "B { int x; }"); 9029 } 9030 9031 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 9032 verifyFormat("{"); 9033 verifyFormat("#})"); 9034 verifyNoCrash("(/**/[:!] ?[)."); 9035 } 9036 9037 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 9038 // Found by oss-fuzz: 9039 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 9040 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 9041 Style.ColumnLimit = 60; 9042 verifyNoCrash( 9043 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 9044 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 9045 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 9046 Style); 9047 } 9048 9049 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 9050 verifyFormat("do {\n}"); 9051 verifyFormat("do {\n}\n" 9052 "f();"); 9053 verifyFormat("do {\n}\n" 9054 "wheeee(fun);"); 9055 verifyFormat("do {\n" 9056 " f();\n" 9057 "}"); 9058 } 9059 9060 TEST_F(FormatTest, IncorrectCodeMissingParens) { 9061 verifyFormat("if {\n foo;\n foo();\n}"); 9062 verifyFormat("switch {\n foo;\n foo();\n}"); 9063 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 9064 verifyFormat("while {\n foo;\n foo();\n}"); 9065 verifyFormat("do {\n foo;\n foo();\n} while;"); 9066 } 9067 9068 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 9069 verifyIncompleteFormat("namespace {\n" 9070 "class Foo { Foo (\n" 9071 "};\n" 9072 "} // namespace"); 9073 } 9074 9075 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 9076 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 9077 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 9078 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 9079 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 9080 9081 EXPECT_EQ("{\n" 9082 " {\n" 9083 " breakme(\n" 9084 " qwe);\n" 9085 " }\n", 9086 format("{\n" 9087 " {\n" 9088 " breakme(qwe);\n" 9089 "}\n", 9090 getLLVMStyleWithColumns(10))); 9091 } 9092 9093 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 9094 verifyFormat("int x = {\n" 9095 " avariable,\n" 9096 " b(alongervariable)};", 9097 getLLVMStyleWithColumns(25)); 9098 } 9099 9100 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 9101 verifyFormat("return (a)(b){1, 2, 3};"); 9102 } 9103 9104 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 9105 verifyFormat("vector<int> x{1, 2, 3, 4};"); 9106 verifyFormat("vector<int> x{\n" 9107 " 1,\n" 9108 " 2,\n" 9109 " 3,\n" 9110 " 4,\n" 9111 "};"); 9112 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 9113 verifyFormat("f({1, 2});"); 9114 verifyFormat("auto v = Foo{-1};"); 9115 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 9116 verifyFormat("Class::Class : member{1, 2, 3} {}"); 9117 verifyFormat("new vector<int>{1, 2, 3};"); 9118 verifyFormat("new int[3]{1, 2, 3};"); 9119 verifyFormat("new int{1};"); 9120 verifyFormat("return {arg1, arg2};"); 9121 verifyFormat("return {arg1, SomeType{parameter}};"); 9122 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 9123 verifyFormat("new T{arg1, arg2};"); 9124 verifyFormat("f(MyMap[{composite, key}]);"); 9125 verifyFormat("class Class {\n" 9126 " T member = {arg1, arg2};\n" 9127 "};"); 9128 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 9129 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 9130 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 9131 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 9132 verifyFormat("int a = std::is_integral<int>{} + 0;"); 9133 9134 verifyFormat("int foo(int i) { return fo1{}(i); }"); 9135 verifyFormat("int foo(int i) { return fo1{}(i); }"); 9136 verifyFormat("auto i = decltype(x){};"); 9137 verifyFormat("auto i = typeof(x){};"); 9138 verifyFormat("auto i = _Atomic(x){};"); 9139 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 9140 verifyFormat("Node n{1, Node{1000}, //\n" 9141 " 2};"); 9142 verifyFormat("Aaaa aaaaaaa{\n" 9143 " {\n" 9144 " aaaa,\n" 9145 " },\n" 9146 "};"); 9147 verifyFormat("class C : public D {\n" 9148 " SomeClass SC{2};\n" 9149 "};"); 9150 verifyFormat("class C : public A {\n" 9151 " class D : public B {\n" 9152 " void f() { int i{2}; }\n" 9153 " };\n" 9154 "};"); 9155 verifyFormat("#define A {a, a},"); 9156 9157 // Avoid breaking between equal sign and opening brace 9158 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 9159 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 9160 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 9161 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 9162 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 9163 " {\"ccccccccccccccccccccc\", 2}};", 9164 AvoidBreakingFirstArgument); 9165 9166 // Binpacking only if there is no trailing comma 9167 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 9168 " cccccccccc, dddddddddd};", 9169 getLLVMStyleWithColumns(50)); 9170 verifyFormat("const Aaaaaa aaaaa = {\n" 9171 " aaaaaaaaaaa,\n" 9172 " bbbbbbbbbbb,\n" 9173 " ccccccccccc,\n" 9174 " ddddddddddd,\n" 9175 "};", 9176 getLLVMStyleWithColumns(50)); 9177 9178 // Cases where distinguising braced lists and blocks is hard. 9179 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 9180 verifyFormat("void f() {\n" 9181 " return; // comment\n" 9182 "}\n" 9183 "SomeType t;"); 9184 verifyFormat("void f() {\n" 9185 " if (a) {\n" 9186 " f();\n" 9187 " }\n" 9188 "}\n" 9189 "SomeType t;"); 9190 9191 // In combination with BinPackArguments = false. 9192 FormatStyle NoBinPacking = getLLVMStyle(); 9193 NoBinPacking.BinPackArguments = false; 9194 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 9195 " bbbbb,\n" 9196 " ccccc,\n" 9197 " ddddd,\n" 9198 " eeeee,\n" 9199 " ffffff,\n" 9200 " ggggg,\n" 9201 " hhhhhh,\n" 9202 " iiiiii,\n" 9203 " jjjjjj,\n" 9204 " kkkkkk};", 9205 NoBinPacking); 9206 verifyFormat("const Aaaaaa aaaaa = {\n" 9207 " aaaaa,\n" 9208 " bbbbb,\n" 9209 " ccccc,\n" 9210 " ddddd,\n" 9211 " eeeee,\n" 9212 " ffffff,\n" 9213 " ggggg,\n" 9214 " hhhhhh,\n" 9215 " iiiiii,\n" 9216 " jjjjjj,\n" 9217 " kkkkkk,\n" 9218 "};", 9219 NoBinPacking); 9220 verifyFormat( 9221 "const Aaaaaa aaaaa = {\n" 9222 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 9223 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 9224 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 9225 "};", 9226 NoBinPacking); 9227 9228 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9229 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 9230 " CDDDP83848_BMCR_REGISTER,\n" 9231 " CDDDP83848_BMSR_REGISTER,\n" 9232 " CDDDP83848_RBR_REGISTER};", 9233 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 9234 " CDDDP83848_BMSR_REGISTER,\n" 9235 " CDDDP83848_RBR_REGISTER};", 9236 NoBinPacking)); 9237 9238 // FIXME: The alignment of these trailing comments might be bad. Then again, 9239 // this might be utterly useless in real code. 9240 verifyFormat("Constructor::Constructor()\n" 9241 " : some_value{ //\n" 9242 " aaaaaaa, //\n" 9243 " bbbbbbb} {}"); 9244 9245 // In braced lists, the first comment is always assumed to belong to the 9246 // first element. Thus, it can be moved to the next or previous line as 9247 // appropriate. 9248 EXPECT_EQ("function({// First element:\n" 9249 " 1,\n" 9250 " // Second element:\n" 9251 " 2});", 9252 format("function({\n" 9253 " // First element:\n" 9254 " 1,\n" 9255 " // Second element:\n" 9256 " 2});")); 9257 EXPECT_EQ("std::vector<int> MyNumbers{\n" 9258 " // First element:\n" 9259 " 1,\n" 9260 " // Second element:\n" 9261 " 2};", 9262 format("std::vector<int> MyNumbers{// First element:\n" 9263 " 1,\n" 9264 " // Second element:\n" 9265 " 2};", 9266 getLLVMStyleWithColumns(30))); 9267 // A trailing comma should still lead to an enforced line break and no 9268 // binpacking. 9269 EXPECT_EQ("vector<int> SomeVector = {\n" 9270 " // aaa\n" 9271 " 1,\n" 9272 " 2,\n" 9273 "};", 9274 format("vector<int> SomeVector = { // aaa\n" 9275 " 1, 2, };")); 9276 9277 // C++11 brace initializer list l-braces should not be treated any differently 9278 // when breaking before lambda bodies is enabled 9279 FormatStyle BreakBeforeLambdaBody = getLLVMStyle(); 9280 BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 9281 BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 9282 BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true; 9283 verifyFormat( 9284 "std::runtime_error{\n" 9285 " \"Long string which will force a break onto the next line...\"};", 9286 BreakBeforeLambdaBody); 9287 9288 FormatStyle ExtraSpaces = getLLVMStyle(); 9289 ExtraSpaces.Cpp11BracedListStyle = false; 9290 ExtraSpaces.ColumnLimit = 75; 9291 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 9292 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 9293 verifyFormat("f({ 1, 2 });", ExtraSpaces); 9294 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 9295 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 9296 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 9297 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 9298 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 9299 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 9300 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 9301 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 9302 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 9303 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 9304 verifyFormat("class Class {\n" 9305 " T member = { arg1, arg2 };\n" 9306 "};", 9307 ExtraSpaces); 9308 verifyFormat( 9309 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9310 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 9311 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 9312 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 9313 ExtraSpaces); 9314 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 9315 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 9316 ExtraSpaces); 9317 verifyFormat( 9318 "someFunction(OtherParam,\n" 9319 " BracedList{ // comment 1 (Forcing interesting break)\n" 9320 " param1, param2,\n" 9321 " // comment 2\n" 9322 " param3, param4 });", 9323 ExtraSpaces); 9324 verifyFormat( 9325 "std::this_thread::sleep_for(\n" 9326 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 9327 ExtraSpaces); 9328 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 9329 " aaaaaaa,\n" 9330 " aaaaaaaaaa,\n" 9331 " aaaaa,\n" 9332 " aaaaaaaaaaaaaaa,\n" 9333 " aaa,\n" 9334 " aaaaaaaaaa,\n" 9335 " a,\n" 9336 " aaaaaaaaaaaaaaaaaaaaa,\n" 9337 " aaaaaaaaaaaa,\n" 9338 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 9339 " aaaaaaa,\n" 9340 " a};"); 9341 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 9342 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 9343 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 9344 9345 // Avoid breaking between initializer/equal sign and opening brace 9346 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 9347 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 9348 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 9349 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 9350 " { \"ccccccccccccccccccccc\", 2 }\n" 9351 "};", 9352 ExtraSpaces); 9353 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 9354 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 9355 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 9356 " { \"ccccccccccccccccccccc\", 2 }\n" 9357 "};", 9358 ExtraSpaces); 9359 9360 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 9361 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 9362 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 9363 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 9364 9365 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 9366 SpaceBetweenBraces.SpacesInAngles = true; 9367 SpaceBetweenBraces.SpacesInParentheses = true; 9368 SpaceBetweenBraces.SpacesInSquareBrackets = true; 9369 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 9370 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 9371 verifyFormat("vector< int > x{ // comment 1\n" 9372 " 1, 2, 3, 4 };", 9373 SpaceBetweenBraces); 9374 SpaceBetweenBraces.ColumnLimit = 20; 9375 EXPECT_EQ("vector< int > x{\n" 9376 " 1, 2, 3, 4 };", 9377 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 9378 SpaceBetweenBraces.ColumnLimit = 24; 9379 EXPECT_EQ("vector< int > x{ 1, 2,\n" 9380 " 3, 4 };", 9381 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 9382 EXPECT_EQ("vector< int > x{\n" 9383 " 1,\n" 9384 " 2,\n" 9385 " 3,\n" 9386 " 4,\n" 9387 "};", 9388 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 9389 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 9390 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 9391 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 9392 } 9393 9394 TEST_F(FormatTest, FormatSpacesInAngles) { 9395 FormatStyle SpaceInAngles = getLLVMStyle(); 9396 SpaceInAngles.SpacesInAngles = true; 9397 verifyFormat("vector< ::std::string > x1;", SpaceInAngles); 9398 verifyFormat("Foo< int, Bar > x2;", SpaceInAngles); 9399 verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles); 9400 9401 SpaceInAngles.SpacesInAngles = false; 9402 verifyFormat("vector<::std::string> x4;", SpaceInAngles); 9403 verifyFormat("vector<int> x5;", SpaceInAngles); 9404 verifyFormat("Foo<int, Bar> x6;", SpaceInAngles); 9405 verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles); 9406 } 9407 9408 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 9409 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9410 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9411 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9412 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9413 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9414 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 9415 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 9416 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9417 " 1, 22, 333, 4444, 55555, //\n" 9418 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9419 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 9420 verifyFormat( 9421 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9422 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9423 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 9424 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9425 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9426 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9427 " 7777777};"); 9428 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9429 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9430 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9431 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9432 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9433 " // Separating comment.\n" 9434 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9435 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9436 " // Leading comment\n" 9437 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9438 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9439 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9440 " 1, 1, 1, 1};", 9441 getLLVMStyleWithColumns(39)); 9442 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9443 " 1, 1, 1, 1};", 9444 getLLVMStyleWithColumns(38)); 9445 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 9446 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 9447 getLLVMStyleWithColumns(43)); 9448 verifyFormat( 9449 "static unsigned SomeValues[10][3] = {\n" 9450 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 9451 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 9452 verifyFormat("static auto fields = new vector<string>{\n" 9453 " \"aaaaaaaaaaaaa\",\n" 9454 " \"aaaaaaaaaaaaa\",\n" 9455 " \"aaaaaaaaaaaa\",\n" 9456 " \"aaaaaaaaaaaaaa\",\n" 9457 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9458 " \"aaaaaaaaaaaa\",\n" 9459 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9460 "};"); 9461 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 9462 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 9463 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 9464 " 3, cccccccccccccccccccccc};", 9465 getLLVMStyleWithColumns(60)); 9466 9467 // Trailing commas. 9468 verifyFormat("vector<int> x = {\n" 9469 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 9470 "};", 9471 getLLVMStyleWithColumns(39)); 9472 verifyFormat("vector<int> x = {\n" 9473 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 9474 "};", 9475 getLLVMStyleWithColumns(39)); 9476 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9477 " 1, 1, 1, 1,\n" 9478 " /**/ /**/};", 9479 getLLVMStyleWithColumns(39)); 9480 9481 // Trailing comment in the first line. 9482 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 9483 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 9484 " 111111111, 222222222, 3333333333, 444444444, //\n" 9485 " 11111111, 22222222, 333333333, 44444444};"); 9486 // Trailing comment in the last line. 9487 verifyFormat("int aaaaa[] = {\n" 9488 " 1, 2, 3, // comment\n" 9489 " 4, 5, 6 // comment\n" 9490 "};"); 9491 9492 // With nested lists, we should either format one item per line or all nested 9493 // lists one on line. 9494 // FIXME: For some nested lists, we can do better. 9495 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 9496 " {aaaaaaaaaaaaaaaaaaa},\n" 9497 " {aaaaaaaaaaaaaaaaaaaaa},\n" 9498 " {aaaaaaaaaaaaaaaaa}};", 9499 getLLVMStyleWithColumns(60)); 9500 verifyFormat( 9501 "SomeStruct my_struct_array = {\n" 9502 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 9503 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 9504 " {aaa, aaa},\n" 9505 " {aaa, aaa},\n" 9506 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 9507 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 9508 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 9509 9510 // No column layout should be used here. 9511 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 9512 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 9513 9514 verifyNoCrash("a<,"); 9515 9516 // No braced initializer here. 9517 verifyFormat("void f() {\n" 9518 " struct Dummy {};\n" 9519 " f(v);\n" 9520 "}"); 9521 9522 // Long lists should be formatted in columns even if they are nested. 9523 verifyFormat( 9524 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9525 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9526 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9527 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9528 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9529 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 9530 9531 // Allow "single-column" layout even if that violates the column limit. There 9532 // isn't going to be a better way. 9533 verifyFormat("std::vector<int> a = {\n" 9534 " aaaaaaaa,\n" 9535 " aaaaaaaa,\n" 9536 " aaaaaaaa,\n" 9537 " aaaaaaaa,\n" 9538 " aaaaaaaaaa,\n" 9539 " aaaaaaaa,\n" 9540 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 9541 getLLVMStyleWithColumns(30)); 9542 verifyFormat("vector<int> aaaa = {\n" 9543 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9544 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9545 " aaaaaa.aaaaaaa,\n" 9546 " aaaaaa.aaaaaaa,\n" 9547 " aaaaaa.aaaaaaa,\n" 9548 " aaaaaa.aaaaaaa,\n" 9549 "};"); 9550 9551 // Don't create hanging lists. 9552 verifyFormat("someFunction(Param, {List1, List2,\n" 9553 " List3});", 9554 getLLVMStyleWithColumns(35)); 9555 verifyFormat("someFunction(Param, Param,\n" 9556 " {List1, List2,\n" 9557 " List3});", 9558 getLLVMStyleWithColumns(35)); 9559 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 9560 " aaaaaaaaaaaaaaaaaaaaaaa);"); 9561 } 9562 9563 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 9564 FormatStyle DoNotMerge = getLLVMStyle(); 9565 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9566 9567 verifyFormat("void f() { return 42; }"); 9568 verifyFormat("void f() {\n" 9569 " return 42;\n" 9570 "}", 9571 DoNotMerge); 9572 verifyFormat("void f() {\n" 9573 " // Comment\n" 9574 "}"); 9575 verifyFormat("{\n" 9576 "#error {\n" 9577 " int a;\n" 9578 "}"); 9579 verifyFormat("{\n" 9580 " int a;\n" 9581 "#error {\n" 9582 "}"); 9583 verifyFormat("void f() {} // comment"); 9584 verifyFormat("void f() { int a; } // comment"); 9585 verifyFormat("void f() {\n" 9586 "} // comment", 9587 DoNotMerge); 9588 verifyFormat("void f() {\n" 9589 " int a;\n" 9590 "} // comment", 9591 DoNotMerge); 9592 verifyFormat("void f() {\n" 9593 "} // comment", 9594 getLLVMStyleWithColumns(15)); 9595 9596 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 9597 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 9598 9599 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 9600 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 9601 verifyFormat("class C {\n" 9602 " C()\n" 9603 " : iiiiiiii(nullptr),\n" 9604 " kkkkkkk(nullptr),\n" 9605 " mmmmmmm(nullptr),\n" 9606 " nnnnnnn(nullptr) {}\n" 9607 "};", 9608 getGoogleStyle()); 9609 9610 FormatStyle NoColumnLimit = getLLVMStyle(); 9611 NoColumnLimit.ColumnLimit = 0; 9612 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 9613 EXPECT_EQ("class C {\n" 9614 " A() : b(0) {}\n" 9615 "};", 9616 format("class C{A():b(0){}};", NoColumnLimit)); 9617 EXPECT_EQ("A()\n" 9618 " : b(0) {\n" 9619 "}", 9620 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 9621 9622 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 9623 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 9624 FormatStyle::SFS_None; 9625 EXPECT_EQ("A()\n" 9626 " : b(0) {\n" 9627 "}", 9628 format("A():b(0){}", DoNotMergeNoColumnLimit)); 9629 EXPECT_EQ("A()\n" 9630 " : b(0) {\n" 9631 "}", 9632 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 9633 9634 verifyFormat("#define A \\\n" 9635 " void f() { \\\n" 9636 " int i; \\\n" 9637 " }", 9638 getLLVMStyleWithColumns(20)); 9639 verifyFormat("#define A \\\n" 9640 " void f() { int i; }", 9641 getLLVMStyleWithColumns(21)); 9642 verifyFormat("#define A \\\n" 9643 " void f() { \\\n" 9644 " int i; \\\n" 9645 " } \\\n" 9646 " int j;", 9647 getLLVMStyleWithColumns(22)); 9648 verifyFormat("#define A \\\n" 9649 " void f() { int i; } \\\n" 9650 " int j;", 9651 getLLVMStyleWithColumns(23)); 9652 } 9653 9654 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 9655 FormatStyle MergeEmptyOnly = getLLVMStyle(); 9656 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9657 verifyFormat("class C {\n" 9658 " int f() {}\n" 9659 "};", 9660 MergeEmptyOnly); 9661 verifyFormat("class C {\n" 9662 " int f() {\n" 9663 " return 42;\n" 9664 " }\n" 9665 "};", 9666 MergeEmptyOnly); 9667 verifyFormat("int f() {}", MergeEmptyOnly); 9668 verifyFormat("int f() {\n" 9669 " return 42;\n" 9670 "}", 9671 MergeEmptyOnly); 9672 9673 // Also verify behavior when BraceWrapping.AfterFunction = true 9674 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9675 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 9676 verifyFormat("int f() {}", MergeEmptyOnly); 9677 verifyFormat("class C {\n" 9678 " int f() {}\n" 9679 "};", 9680 MergeEmptyOnly); 9681 } 9682 9683 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 9684 FormatStyle MergeInlineOnly = getLLVMStyle(); 9685 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9686 verifyFormat("class C {\n" 9687 " int f() { return 42; }\n" 9688 "};", 9689 MergeInlineOnly); 9690 verifyFormat("int f() {\n" 9691 " return 42;\n" 9692 "}", 9693 MergeInlineOnly); 9694 9695 // SFS_Inline implies SFS_Empty 9696 verifyFormat("class C {\n" 9697 " int f() {}\n" 9698 "};", 9699 MergeInlineOnly); 9700 verifyFormat("int f() {}", MergeInlineOnly); 9701 9702 // Also verify behavior when BraceWrapping.AfterFunction = true 9703 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9704 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9705 verifyFormat("class C {\n" 9706 " int f() { return 42; }\n" 9707 "};", 9708 MergeInlineOnly); 9709 verifyFormat("int f()\n" 9710 "{\n" 9711 " return 42;\n" 9712 "}", 9713 MergeInlineOnly); 9714 9715 // SFS_Inline implies SFS_Empty 9716 verifyFormat("int f() {}", MergeInlineOnly); 9717 verifyFormat("class C {\n" 9718 " int f() {}\n" 9719 "};", 9720 MergeInlineOnly); 9721 } 9722 9723 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 9724 FormatStyle MergeInlineOnly = getLLVMStyle(); 9725 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 9726 FormatStyle::SFS_InlineOnly; 9727 verifyFormat("class C {\n" 9728 " int f() { return 42; }\n" 9729 "};", 9730 MergeInlineOnly); 9731 verifyFormat("int f() {\n" 9732 " return 42;\n" 9733 "}", 9734 MergeInlineOnly); 9735 9736 // SFS_InlineOnly does not imply SFS_Empty 9737 verifyFormat("class C {\n" 9738 " int f() {}\n" 9739 "};", 9740 MergeInlineOnly); 9741 verifyFormat("int f() {\n" 9742 "}", 9743 MergeInlineOnly); 9744 9745 // Also verify behavior when BraceWrapping.AfterFunction = true 9746 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9747 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9748 verifyFormat("class C {\n" 9749 " int f() { return 42; }\n" 9750 "};", 9751 MergeInlineOnly); 9752 verifyFormat("int f()\n" 9753 "{\n" 9754 " return 42;\n" 9755 "}", 9756 MergeInlineOnly); 9757 9758 // SFS_InlineOnly does not imply SFS_Empty 9759 verifyFormat("int f()\n" 9760 "{\n" 9761 "}", 9762 MergeInlineOnly); 9763 verifyFormat("class C {\n" 9764 " int f() {}\n" 9765 "};", 9766 MergeInlineOnly); 9767 } 9768 9769 TEST_F(FormatTest, SplitEmptyFunction) { 9770 FormatStyle Style = getLLVMStyle(); 9771 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9772 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9773 Style.BraceWrapping.AfterFunction = true; 9774 Style.BraceWrapping.SplitEmptyFunction = false; 9775 Style.ColumnLimit = 40; 9776 9777 verifyFormat("int f()\n" 9778 "{}", 9779 Style); 9780 verifyFormat("int f()\n" 9781 "{\n" 9782 " return 42;\n" 9783 "}", 9784 Style); 9785 verifyFormat("int f()\n" 9786 "{\n" 9787 " // some comment\n" 9788 "}", 9789 Style); 9790 9791 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9792 verifyFormat("int f() {}", Style); 9793 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9794 "{}", 9795 Style); 9796 verifyFormat("int f()\n" 9797 "{\n" 9798 " return 0;\n" 9799 "}", 9800 Style); 9801 9802 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9803 verifyFormat("class Foo {\n" 9804 " int f() {}\n" 9805 "};\n", 9806 Style); 9807 verifyFormat("class Foo {\n" 9808 " int f() { return 0; }\n" 9809 "};\n", 9810 Style); 9811 verifyFormat("class Foo {\n" 9812 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9813 " {}\n" 9814 "};\n", 9815 Style); 9816 verifyFormat("class Foo {\n" 9817 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9818 " {\n" 9819 " return 0;\n" 9820 " }\n" 9821 "};\n", 9822 Style); 9823 9824 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9825 verifyFormat("int f() {}", Style); 9826 verifyFormat("int f() { return 0; }", Style); 9827 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9828 "{}", 9829 Style); 9830 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9831 "{\n" 9832 " return 0;\n" 9833 "}", 9834 Style); 9835 } 9836 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 9837 FormatStyle Style = getLLVMStyle(); 9838 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9839 verifyFormat("#ifdef A\n" 9840 "int f() {}\n" 9841 "#else\n" 9842 "int g() {}\n" 9843 "#endif", 9844 Style); 9845 } 9846 9847 TEST_F(FormatTest, SplitEmptyClass) { 9848 FormatStyle Style = getLLVMStyle(); 9849 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9850 Style.BraceWrapping.AfterClass = true; 9851 Style.BraceWrapping.SplitEmptyRecord = false; 9852 9853 verifyFormat("class Foo\n" 9854 "{};", 9855 Style); 9856 verifyFormat("/* something */ class Foo\n" 9857 "{};", 9858 Style); 9859 verifyFormat("template <typename X> class Foo\n" 9860 "{};", 9861 Style); 9862 verifyFormat("class Foo\n" 9863 "{\n" 9864 " Foo();\n" 9865 "};", 9866 Style); 9867 verifyFormat("typedef class Foo\n" 9868 "{\n" 9869 "} Foo_t;", 9870 Style); 9871 } 9872 9873 TEST_F(FormatTest, SplitEmptyStruct) { 9874 FormatStyle Style = getLLVMStyle(); 9875 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9876 Style.BraceWrapping.AfterStruct = true; 9877 Style.BraceWrapping.SplitEmptyRecord = false; 9878 9879 verifyFormat("struct Foo\n" 9880 "{};", 9881 Style); 9882 verifyFormat("/* something */ struct Foo\n" 9883 "{};", 9884 Style); 9885 verifyFormat("template <typename X> struct Foo\n" 9886 "{};", 9887 Style); 9888 verifyFormat("struct Foo\n" 9889 "{\n" 9890 " Foo();\n" 9891 "};", 9892 Style); 9893 verifyFormat("typedef struct Foo\n" 9894 "{\n" 9895 "} Foo_t;", 9896 Style); 9897 // typedef struct Bar {} Bar_t; 9898 } 9899 9900 TEST_F(FormatTest, SplitEmptyUnion) { 9901 FormatStyle Style = getLLVMStyle(); 9902 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9903 Style.BraceWrapping.AfterUnion = true; 9904 Style.BraceWrapping.SplitEmptyRecord = false; 9905 9906 verifyFormat("union Foo\n" 9907 "{};", 9908 Style); 9909 verifyFormat("/* something */ union Foo\n" 9910 "{};", 9911 Style); 9912 verifyFormat("union Foo\n" 9913 "{\n" 9914 " A,\n" 9915 "};", 9916 Style); 9917 verifyFormat("typedef union Foo\n" 9918 "{\n" 9919 "} Foo_t;", 9920 Style); 9921 } 9922 9923 TEST_F(FormatTest, SplitEmptyNamespace) { 9924 FormatStyle Style = getLLVMStyle(); 9925 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9926 Style.BraceWrapping.AfterNamespace = true; 9927 Style.BraceWrapping.SplitEmptyNamespace = false; 9928 9929 verifyFormat("namespace Foo\n" 9930 "{};", 9931 Style); 9932 verifyFormat("/* something */ namespace Foo\n" 9933 "{};", 9934 Style); 9935 verifyFormat("inline namespace Foo\n" 9936 "{};", 9937 Style); 9938 verifyFormat("/* something */ inline namespace Foo\n" 9939 "{};", 9940 Style); 9941 verifyFormat("export namespace Foo\n" 9942 "{};", 9943 Style); 9944 verifyFormat("namespace Foo\n" 9945 "{\n" 9946 "void Bar();\n" 9947 "};", 9948 Style); 9949 } 9950 9951 TEST_F(FormatTest, NeverMergeShortRecords) { 9952 FormatStyle Style = getLLVMStyle(); 9953 9954 verifyFormat("class Foo {\n" 9955 " Foo();\n" 9956 "};", 9957 Style); 9958 verifyFormat("typedef class Foo {\n" 9959 " Foo();\n" 9960 "} Foo_t;", 9961 Style); 9962 verifyFormat("struct Foo {\n" 9963 " Foo();\n" 9964 "};", 9965 Style); 9966 verifyFormat("typedef struct Foo {\n" 9967 " Foo();\n" 9968 "} Foo_t;", 9969 Style); 9970 verifyFormat("union Foo {\n" 9971 " A,\n" 9972 "};", 9973 Style); 9974 verifyFormat("typedef union Foo {\n" 9975 " A,\n" 9976 "} Foo_t;", 9977 Style); 9978 verifyFormat("namespace Foo {\n" 9979 "void Bar();\n" 9980 "};", 9981 Style); 9982 9983 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9984 Style.BraceWrapping.AfterClass = true; 9985 Style.BraceWrapping.AfterStruct = true; 9986 Style.BraceWrapping.AfterUnion = true; 9987 Style.BraceWrapping.AfterNamespace = true; 9988 verifyFormat("class Foo\n" 9989 "{\n" 9990 " Foo();\n" 9991 "};", 9992 Style); 9993 verifyFormat("typedef class Foo\n" 9994 "{\n" 9995 " Foo();\n" 9996 "} Foo_t;", 9997 Style); 9998 verifyFormat("struct Foo\n" 9999 "{\n" 10000 " Foo();\n" 10001 "};", 10002 Style); 10003 verifyFormat("typedef struct Foo\n" 10004 "{\n" 10005 " Foo();\n" 10006 "} Foo_t;", 10007 Style); 10008 verifyFormat("union Foo\n" 10009 "{\n" 10010 " A,\n" 10011 "};", 10012 Style); 10013 verifyFormat("typedef union Foo\n" 10014 "{\n" 10015 " A,\n" 10016 "} Foo_t;", 10017 Style); 10018 verifyFormat("namespace Foo\n" 10019 "{\n" 10020 "void Bar();\n" 10021 "};", 10022 Style); 10023 } 10024 10025 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 10026 // Elaborate type variable declarations. 10027 verifyFormat("struct foo a = {bar};\nint n;"); 10028 verifyFormat("class foo a = {bar};\nint n;"); 10029 verifyFormat("union foo a = {bar};\nint n;"); 10030 10031 // Elaborate types inside function definitions. 10032 verifyFormat("struct foo f() {}\nint n;"); 10033 verifyFormat("class foo f() {}\nint n;"); 10034 verifyFormat("union foo f() {}\nint n;"); 10035 10036 // Templates. 10037 verifyFormat("template <class X> void f() {}\nint n;"); 10038 verifyFormat("template <struct X> void f() {}\nint n;"); 10039 verifyFormat("template <union X> void f() {}\nint n;"); 10040 10041 // Actual definitions... 10042 verifyFormat("struct {\n} n;"); 10043 verifyFormat( 10044 "template <template <class T, class Y>, class Z> class X {\n} n;"); 10045 verifyFormat("union Z {\n int n;\n} x;"); 10046 verifyFormat("class MACRO Z {\n} n;"); 10047 verifyFormat("class MACRO(X) Z {\n} n;"); 10048 verifyFormat("class __attribute__(X) Z {\n} n;"); 10049 verifyFormat("class __declspec(X) Z {\n} n;"); 10050 verifyFormat("class A##B##C {\n} n;"); 10051 verifyFormat("class alignas(16) Z {\n} n;"); 10052 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 10053 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 10054 10055 // Redefinition from nested context: 10056 verifyFormat("class A::B::C {\n} n;"); 10057 10058 // Template definitions. 10059 verifyFormat( 10060 "template <typename F>\n" 10061 "Matcher(const Matcher<F> &Other,\n" 10062 " typename enable_if_c<is_base_of<F, T>::value &&\n" 10063 " !is_same<F, T>::value>::type * = 0)\n" 10064 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 10065 10066 // FIXME: This is still incorrectly handled at the formatter side. 10067 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 10068 verifyFormat("int i = SomeFunction(a<b, a> b);"); 10069 10070 // FIXME: 10071 // This now gets parsed incorrectly as class definition. 10072 // verifyFormat("class A<int> f() {\n}\nint n;"); 10073 10074 // Elaborate types where incorrectly parsing the structural element would 10075 // break the indent. 10076 verifyFormat("if (true)\n" 10077 " class X x;\n" 10078 "else\n" 10079 " f();\n"); 10080 10081 // This is simply incomplete. Formatting is not important, but must not crash. 10082 verifyFormat("class A:"); 10083 } 10084 10085 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 10086 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 10087 format("#error Leave all white!!!!! space* alone!\n")); 10088 EXPECT_EQ( 10089 "#warning Leave all white!!!!! space* alone!\n", 10090 format("#warning Leave all white!!!!! space* alone!\n")); 10091 EXPECT_EQ("#error 1", format(" # error 1")); 10092 EXPECT_EQ("#warning 1", format(" # warning 1")); 10093 } 10094 10095 TEST_F(FormatTest, FormatHashIfExpressions) { 10096 verifyFormat("#if AAAA && BBBB"); 10097 verifyFormat("#if (AAAA && BBBB)"); 10098 verifyFormat("#elif (AAAA && BBBB)"); 10099 // FIXME: Come up with a better indentation for #elif. 10100 verifyFormat( 10101 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 10102 " defined(BBBBBBBB)\n" 10103 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 10104 " defined(BBBBBBBB)\n" 10105 "#endif", 10106 getLLVMStyleWithColumns(65)); 10107 } 10108 10109 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 10110 FormatStyle AllowsMergedIf = getGoogleStyle(); 10111 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 10112 FormatStyle::SIS_WithoutElse; 10113 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 10114 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 10115 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 10116 EXPECT_EQ("if (true) return 42;", 10117 format("if (true)\nreturn 42;", AllowsMergedIf)); 10118 FormatStyle ShortMergedIf = AllowsMergedIf; 10119 ShortMergedIf.ColumnLimit = 25; 10120 verifyFormat("#define A \\\n" 10121 " if (true) return 42;", 10122 ShortMergedIf); 10123 verifyFormat("#define A \\\n" 10124 " f(); \\\n" 10125 " if (true)\n" 10126 "#define B", 10127 ShortMergedIf); 10128 verifyFormat("#define A \\\n" 10129 " f(); \\\n" 10130 " if (true)\n" 10131 "g();", 10132 ShortMergedIf); 10133 verifyFormat("{\n" 10134 "#ifdef A\n" 10135 " // Comment\n" 10136 " if (true) continue;\n" 10137 "#endif\n" 10138 " // Comment\n" 10139 " if (true) continue;\n" 10140 "}", 10141 ShortMergedIf); 10142 ShortMergedIf.ColumnLimit = 33; 10143 verifyFormat("#define A \\\n" 10144 " if constexpr (true) return 42;", 10145 ShortMergedIf); 10146 verifyFormat("#define A \\\n" 10147 " if CONSTEXPR (true) return 42;", 10148 ShortMergedIf); 10149 ShortMergedIf.ColumnLimit = 29; 10150 verifyFormat("#define A \\\n" 10151 " if (aaaaaaaaaa) return 1; \\\n" 10152 " return 2;", 10153 ShortMergedIf); 10154 ShortMergedIf.ColumnLimit = 28; 10155 verifyFormat("#define A \\\n" 10156 " if (aaaaaaaaaa) \\\n" 10157 " return 1; \\\n" 10158 " return 2;", 10159 ShortMergedIf); 10160 verifyFormat("#define A \\\n" 10161 " if constexpr (aaaaaaa) \\\n" 10162 " return 1; \\\n" 10163 " return 2;", 10164 ShortMergedIf); 10165 verifyFormat("#define A \\\n" 10166 " if CONSTEXPR (aaaaaaa) \\\n" 10167 " return 1; \\\n" 10168 " return 2;", 10169 ShortMergedIf); 10170 } 10171 10172 TEST_F(FormatTest, FormatStarDependingOnContext) { 10173 verifyFormat("void f(int *a);"); 10174 verifyFormat("void f() { f(fint * b); }"); 10175 verifyFormat("class A {\n void f(int *a);\n};"); 10176 verifyFormat("class A {\n int *a;\n};"); 10177 verifyFormat("namespace a {\n" 10178 "namespace b {\n" 10179 "class A {\n" 10180 " void f() {}\n" 10181 " int *a;\n" 10182 "};\n" 10183 "} // namespace b\n" 10184 "} // namespace a"); 10185 } 10186 10187 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 10188 verifyFormat("while"); 10189 verifyFormat("operator"); 10190 } 10191 10192 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 10193 // This code would be painfully slow to format if we didn't skip it. 10194 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 10195 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10196 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10197 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10198 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10199 "A(1, 1)\n" 10200 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 10201 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10202 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10203 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10204 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10205 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10206 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10207 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10208 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10209 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 10210 // Deeply nested part is untouched, rest is formatted. 10211 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 10212 format(std::string("int i;\n") + Code + "int j;\n", 10213 getLLVMStyle(), SC_ExpectIncomplete)); 10214 } 10215 10216 //===----------------------------------------------------------------------===// 10217 // Objective-C tests. 10218 //===----------------------------------------------------------------------===// 10219 10220 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 10221 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 10222 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 10223 format("-(NSUInteger)indexOfObject:(id)anObject;")); 10224 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 10225 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 10226 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 10227 format("-(NSInteger)Method3:(id)anObject;")); 10228 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 10229 format("-(NSInteger)Method4:(id)anObject;")); 10230 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 10231 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 10232 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 10233 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 10234 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 10235 "forAllCells:(BOOL)flag;", 10236 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 10237 "forAllCells:(BOOL)flag;")); 10238 10239 // Very long objectiveC method declaration. 10240 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 10241 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 10242 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 10243 " inRange:(NSRange)range\n" 10244 " outRange:(NSRange)out_range\n" 10245 " outRange1:(NSRange)out_range1\n" 10246 " outRange2:(NSRange)out_range2\n" 10247 " outRange3:(NSRange)out_range3\n" 10248 " outRange4:(NSRange)out_range4\n" 10249 " outRange5:(NSRange)out_range5\n" 10250 " outRange6:(NSRange)out_range6\n" 10251 " outRange7:(NSRange)out_range7\n" 10252 " outRange8:(NSRange)out_range8\n" 10253 " outRange9:(NSRange)out_range9;"); 10254 10255 // When the function name has to be wrapped. 10256 FormatStyle Style = getLLVMStyle(); 10257 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 10258 // and always indents instead. 10259 Style.IndentWrappedFunctionNames = false; 10260 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 10261 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 10262 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 10263 "}", 10264 Style); 10265 Style.IndentWrappedFunctionNames = true; 10266 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 10267 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 10268 " anotherName:(NSString)dddddddddddddd {\n" 10269 "}", 10270 Style); 10271 10272 verifyFormat("- (int)sum:(vector<int>)numbers;"); 10273 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 10274 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 10275 // protocol lists (but not for template classes): 10276 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 10277 10278 verifyFormat("- (int (*)())foo:(int (*)())f;"); 10279 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 10280 10281 // If there's no return type (very rare in practice!), LLVM and Google style 10282 // agree. 10283 verifyFormat("- foo;"); 10284 verifyFormat("- foo:(int)f;"); 10285 verifyGoogleFormat("- foo:(int)foo;"); 10286 } 10287 10288 TEST_F(FormatTest, BreaksStringLiterals) { 10289 EXPECT_EQ("\"some text \"\n" 10290 "\"other\";", 10291 format("\"some text other\";", getLLVMStyleWithColumns(12))); 10292 EXPECT_EQ("\"some text \"\n" 10293 "\"other\";", 10294 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 10295 EXPECT_EQ( 10296 "#define A \\\n" 10297 " \"some \" \\\n" 10298 " \"text \" \\\n" 10299 " \"other\";", 10300 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 10301 EXPECT_EQ( 10302 "#define A \\\n" 10303 " \"so \" \\\n" 10304 " \"text \" \\\n" 10305 " \"other\";", 10306 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 10307 10308 EXPECT_EQ("\"some text\"", 10309 format("\"some text\"", getLLVMStyleWithColumns(1))); 10310 EXPECT_EQ("\"some text\"", 10311 format("\"some text\"", getLLVMStyleWithColumns(11))); 10312 EXPECT_EQ("\"some \"\n" 10313 "\"text\"", 10314 format("\"some text\"", getLLVMStyleWithColumns(10))); 10315 EXPECT_EQ("\"some \"\n" 10316 "\"text\"", 10317 format("\"some text\"", getLLVMStyleWithColumns(7))); 10318 EXPECT_EQ("\"some\"\n" 10319 "\" tex\"\n" 10320 "\"t\"", 10321 format("\"some text\"", getLLVMStyleWithColumns(6))); 10322 EXPECT_EQ("\"some\"\n" 10323 "\" tex\"\n" 10324 "\" and\"", 10325 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 10326 EXPECT_EQ("\"some\"\n" 10327 "\"/tex\"\n" 10328 "\"/and\"", 10329 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 10330 10331 EXPECT_EQ("variable =\n" 10332 " \"long string \"\n" 10333 " \"literal\";", 10334 format("variable = \"long string literal\";", 10335 getLLVMStyleWithColumns(20))); 10336 10337 EXPECT_EQ("variable = f(\n" 10338 " \"long string \"\n" 10339 " \"literal\",\n" 10340 " short,\n" 10341 " loooooooooooooooooooong);", 10342 format("variable = f(\"long string literal\", short, " 10343 "loooooooooooooooooooong);", 10344 getLLVMStyleWithColumns(20))); 10345 10346 EXPECT_EQ( 10347 "f(g(\"long string \"\n" 10348 " \"literal\"),\n" 10349 " b);", 10350 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 10351 EXPECT_EQ("f(g(\"long string \"\n" 10352 " \"literal\",\n" 10353 " a),\n" 10354 " b);", 10355 format("f(g(\"long string literal\", a), b);", 10356 getLLVMStyleWithColumns(20))); 10357 EXPECT_EQ( 10358 "f(\"one two\".split(\n" 10359 " variable));", 10360 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 10361 EXPECT_EQ("f(\"one two three four five six \"\n" 10362 " \"seven\".split(\n" 10363 " really_looooong_variable));", 10364 format("f(\"one two three four five six seven\"." 10365 "split(really_looooong_variable));", 10366 getLLVMStyleWithColumns(33))); 10367 10368 EXPECT_EQ("f(\"some \"\n" 10369 " \"text\",\n" 10370 " other);", 10371 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 10372 10373 // Only break as a last resort. 10374 verifyFormat( 10375 "aaaaaaaaaaaaaaaaaaaa(\n" 10376 " aaaaaaaaaaaaaaaaaaaa,\n" 10377 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 10378 10379 EXPECT_EQ("\"splitmea\"\n" 10380 "\"trandomp\"\n" 10381 "\"oint\"", 10382 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 10383 10384 EXPECT_EQ("\"split/\"\n" 10385 "\"pathat/\"\n" 10386 "\"slashes\"", 10387 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 10388 10389 EXPECT_EQ("\"split/\"\n" 10390 "\"pathat/\"\n" 10391 "\"slashes\"", 10392 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 10393 EXPECT_EQ("\"split at \"\n" 10394 "\"spaces/at/\"\n" 10395 "\"slashes.at.any$\"\n" 10396 "\"non-alphanumeric%\"\n" 10397 "\"1111111111characte\"\n" 10398 "\"rs\"", 10399 format("\"split at " 10400 "spaces/at/" 10401 "slashes.at." 10402 "any$non-" 10403 "alphanumeric%" 10404 "1111111111characte" 10405 "rs\"", 10406 getLLVMStyleWithColumns(20))); 10407 10408 // Verify that splitting the strings understands 10409 // Style::AlwaysBreakBeforeMultilineStrings. 10410 EXPECT_EQ("aaaaaaaaaaaa(\n" 10411 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 10412 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 10413 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 10414 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 10415 "aaaaaaaaaaaaaaaaaaaaaa\");", 10416 getGoogleStyle())); 10417 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10418 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 10419 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 10420 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 10421 "aaaaaaaaaaaaaaaaaaaaaa\";", 10422 getGoogleStyle())); 10423 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10424 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10425 format("llvm::outs() << " 10426 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 10427 "aaaaaaaaaaaaaaaaaaa\";")); 10428 EXPECT_EQ("ffff(\n" 10429 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10430 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10431 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 10432 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10433 getGoogleStyle())); 10434 10435 FormatStyle Style = getLLVMStyleWithColumns(12); 10436 Style.BreakStringLiterals = false; 10437 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 10438 10439 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 10440 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10441 EXPECT_EQ("#define A \\\n" 10442 " \"some \" \\\n" 10443 " \"text \" \\\n" 10444 " \"other\";", 10445 format("#define A \"some text other\";", AlignLeft)); 10446 } 10447 10448 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 10449 EXPECT_EQ("C a = \"some more \"\n" 10450 " \"text\";", 10451 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 10452 } 10453 10454 TEST_F(FormatTest, FullyRemoveEmptyLines) { 10455 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 10456 NoEmptyLines.MaxEmptyLinesToKeep = 0; 10457 EXPECT_EQ("int i = a(b());", 10458 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 10459 } 10460 10461 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 10462 EXPECT_EQ( 10463 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10464 "(\n" 10465 " \"x\t\");", 10466 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10467 "aaaaaaa(" 10468 "\"x\t\");")); 10469 } 10470 10471 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 10472 EXPECT_EQ( 10473 "u8\"utf8 string \"\n" 10474 "u8\"literal\";", 10475 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 10476 EXPECT_EQ( 10477 "u\"utf16 string \"\n" 10478 "u\"literal\";", 10479 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 10480 EXPECT_EQ( 10481 "U\"utf32 string \"\n" 10482 "U\"literal\";", 10483 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 10484 EXPECT_EQ("L\"wide string \"\n" 10485 "L\"literal\";", 10486 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 10487 EXPECT_EQ("@\"NSString \"\n" 10488 "@\"literal\";", 10489 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 10490 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 10491 10492 // This input makes clang-format try to split the incomplete unicode escape 10493 // sequence, which used to lead to a crasher. 10494 verifyNoCrash( 10495 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 10496 getLLVMStyleWithColumns(60)); 10497 } 10498 10499 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 10500 FormatStyle Style = getGoogleStyleWithColumns(15); 10501 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 10502 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 10503 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 10504 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 10505 EXPECT_EQ("u8R\"x(raw literal)x\";", 10506 format("u8R\"x(raw literal)x\";", Style)); 10507 } 10508 10509 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 10510 FormatStyle Style = getLLVMStyleWithColumns(20); 10511 EXPECT_EQ( 10512 "_T(\"aaaaaaaaaaaaaa\")\n" 10513 "_T(\"aaaaaaaaaaaaaa\")\n" 10514 "_T(\"aaaaaaaaaaaa\")", 10515 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 10516 EXPECT_EQ("f(x,\n" 10517 " _T(\"aaaaaaaaaaaa\")\n" 10518 " _T(\"aaa\"),\n" 10519 " z);", 10520 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 10521 10522 // FIXME: Handle embedded spaces in one iteration. 10523 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 10524 // "_T(\"aaaaaaaaaaaaa\")\n" 10525 // "_T(\"aaaaaaaaaaaaa\")\n" 10526 // "_T(\"a\")", 10527 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10528 // getLLVMStyleWithColumns(20))); 10529 EXPECT_EQ( 10530 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10531 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 10532 EXPECT_EQ("f(\n" 10533 "#if !TEST\n" 10534 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10535 "#endif\n" 10536 ");", 10537 format("f(\n" 10538 "#if !TEST\n" 10539 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10540 "#endif\n" 10541 ");")); 10542 EXPECT_EQ("f(\n" 10543 "\n" 10544 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 10545 format("f(\n" 10546 "\n" 10547 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 10548 } 10549 10550 TEST_F(FormatTest, BreaksStringLiteralOperands) { 10551 // In a function call with two operands, the second can be broken with no line 10552 // break before it. 10553 EXPECT_EQ( 10554 "func(a, \"long long \"\n" 10555 " \"long long\");", 10556 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 10557 // In a function call with three operands, the second must be broken with a 10558 // line break before it. 10559 EXPECT_EQ("func(a,\n" 10560 " \"long long long \"\n" 10561 " \"long\",\n" 10562 " c);", 10563 format("func(a, \"long long long long\", c);", 10564 getLLVMStyleWithColumns(24))); 10565 // In a function call with three operands, the third must be broken with a 10566 // line break before it. 10567 EXPECT_EQ("func(a, b,\n" 10568 " \"long long long \"\n" 10569 " \"long\");", 10570 format("func(a, b, \"long long long long\");", 10571 getLLVMStyleWithColumns(24))); 10572 // In a function call with three operands, both the second and the third must 10573 // be broken with a line break before them. 10574 EXPECT_EQ("func(a,\n" 10575 " \"long long long \"\n" 10576 " \"long\",\n" 10577 " \"long long long \"\n" 10578 " \"long\");", 10579 format("func(a, \"long long long long\", \"long long long long\");", 10580 getLLVMStyleWithColumns(24))); 10581 // In a chain of << with two operands, the second can be broken with no line 10582 // break before it. 10583 EXPECT_EQ("a << \"line line \"\n" 10584 " \"line\";", 10585 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 10586 // In a chain of << with three operands, the second can be broken with no line 10587 // break before it. 10588 EXPECT_EQ( 10589 "abcde << \"line \"\n" 10590 " \"line line\"\n" 10591 " << c;", 10592 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 10593 // In a chain of << with three operands, the third must be broken with a line 10594 // break before it. 10595 EXPECT_EQ( 10596 "a << b\n" 10597 " << \"line line \"\n" 10598 " \"line\";", 10599 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 10600 // In a chain of << with three operands, the second can be broken with no line 10601 // break before it and the third must be broken with a line break before it. 10602 EXPECT_EQ("abcd << \"line line \"\n" 10603 " \"line\"\n" 10604 " << \"line line \"\n" 10605 " \"line\";", 10606 format("abcd << \"line line line\" << \"line line line\";", 10607 getLLVMStyleWithColumns(20))); 10608 // In a chain of binary operators with two operands, the second can be broken 10609 // with no line break before it. 10610 EXPECT_EQ( 10611 "abcd + \"line line \"\n" 10612 " \"line line\";", 10613 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 10614 // In a chain of binary operators with three operands, the second must be 10615 // broken with a line break before it. 10616 EXPECT_EQ("abcd +\n" 10617 " \"line line \"\n" 10618 " \"line line\" +\n" 10619 " e;", 10620 format("abcd + \"line line line line\" + e;", 10621 getLLVMStyleWithColumns(20))); 10622 // In a function call with two operands, with AlignAfterOpenBracket enabled, 10623 // the first must be broken with a line break before it. 10624 FormatStyle Style = getLLVMStyleWithColumns(25); 10625 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 10626 EXPECT_EQ("someFunction(\n" 10627 " \"long long long \"\n" 10628 " \"long\",\n" 10629 " a);", 10630 format("someFunction(\"long long long long\", a);", Style)); 10631 } 10632 10633 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 10634 EXPECT_EQ( 10635 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10636 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10638 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10640 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 10641 } 10642 10643 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 10644 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 10645 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 10646 EXPECT_EQ("fffffffffff(g(R\"x(\n" 10647 "multiline raw string literal xxxxxxxxxxxxxx\n" 10648 ")x\",\n" 10649 " a),\n" 10650 " b);", 10651 format("fffffffffff(g(R\"x(\n" 10652 "multiline raw string literal xxxxxxxxxxxxxx\n" 10653 ")x\", a), b);", 10654 getGoogleStyleWithColumns(20))); 10655 EXPECT_EQ("fffffffffff(\n" 10656 " g(R\"x(qqq\n" 10657 "multiline raw string literal xxxxxxxxxxxxxx\n" 10658 ")x\",\n" 10659 " a),\n" 10660 " b);", 10661 format("fffffffffff(g(R\"x(qqq\n" 10662 "multiline raw string literal xxxxxxxxxxxxxx\n" 10663 ")x\", a), b);", 10664 getGoogleStyleWithColumns(20))); 10665 10666 EXPECT_EQ("fffffffffff(R\"x(\n" 10667 "multiline raw string literal xxxxxxxxxxxxxx\n" 10668 ")x\");", 10669 format("fffffffffff(R\"x(\n" 10670 "multiline raw string literal xxxxxxxxxxxxxx\n" 10671 ")x\");", 10672 getGoogleStyleWithColumns(20))); 10673 EXPECT_EQ("fffffffffff(R\"x(\n" 10674 "multiline raw string literal xxxxxxxxxxxxxx\n" 10675 ")x\" + bbbbbb);", 10676 format("fffffffffff(R\"x(\n" 10677 "multiline raw string literal xxxxxxxxxxxxxx\n" 10678 ")x\" + bbbbbb);", 10679 getGoogleStyleWithColumns(20))); 10680 EXPECT_EQ("fffffffffff(\n" 10681 " R\"x(\n" 10682 "multiline raw string literal xxxxxxxxxxxxxx\n" 10683 ")x\" +\n" 10684 " bbbbbb);", 10685 format("fffffffffff(\n" 10686 " R\"x(\n" 10687 "multiline raw string literal xxxxxxxxxxxxxx\n" 10688 ")x\" + bbbbbb);", 10689 getGoogleStyleWithColumns(20))); 10690 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 10691 format("fffffffffff(\n" 10692 " R\"(single line raw string)\" + bbbbbb);")); 10693 } 10694 10695 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 10696 verifyFormat("string a = \"unterminated;"); 10697 EXPECT_EQ("function(\"unterminated,\n" 10698 " OtherParameter);", 10699 format("function( \"unterminated,\n" 10700 " OtherParameter);")); 10701 } 10702 10703 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 10704 FormatStyle Style = getLLVMStyle(); 10705 Style.Standard = FormatStyle::LS_Cpp03; 10706 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 10707 format("#define x(_a) printf(\"foo\"_a);", Style)); 10708 } 10709 10710 TEST_F(FormatTest, CppLexVersion) { 10711 FormatStyle Style = getLLVMStyle(); 10712 // Formatting of x * y differs if x is a type. 10713 verifyFormat("void foo() { MACRO(a * b); }", Style); 10714 verifyFormat("void foo() { MACRO(int *b); }", Style); 10715 10716 // LLVM style uses latest lexer. 10717 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 10718 Style.Standard = FormatStyle::LS_Cpp17; 10719 // But in c++17, char8_t isn't a keyword. 10720 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 10721 } 10722 10723 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 10724 10725 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 10726 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 10727 " \"ddeeefff\");", 10728 format("someFunction(\"aaabbbcccdddeeefff\");", 10729 getLLVMStyleWithColumns(25))); 10730 EXPECT_EQ("someFunction1234567890(\n" 10731 " \"aaabbbcccdddeeefff\");", 10732 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10733 getLLVMStyleWithColumns(26))); 10734 EXPECT_EQ("someFunction1234567890(\n" 10735 " \"aaabbbcccdddeeeff\"\n" 10736 " \"f\");", 10737 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10738 getLLVMStyleWithColumns(25))); 10739 EXPECT_EQ("someFunction1234567890(\n" 10740 " \"aaabbbcccdddeeeff\"\n" 10741 " \"f\");", 10742 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10743 getLLVMStyleWithColumns(24))); 10744 EXPECT_EQ("someFunction(\n" 10745 " \"aaabbbcc ddde \"\n" 10746 " \"efff\");", 10747 format("someFunction(\"aaabbbcc ddde efff\");", 10748 getLLVMStyleWithColumns(25))); 10749 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 10750 " \"ddeeefff\");", 10751 format("someFunction(\"aaabbbccc ddeeefff\");", 10752 getLLVMStyleWithColumns(25))); 10753 EXPECT_EQ("someFunction1234567890(\n" 10754 " \"aaabb \"\n" 10755 " \"cccdddeeefff\");", 10756 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 10757 getLLVMStyleWithColumns(25))); 10758 EXPECT_EQ("#define A \\\n" 10759 " string s = \\\n" 10760 " \"123456789\" \\\n" 10761 " \"0\"; \\\n" 10762 " int i;", 10763 format("#define A string s = \"1234567890\"; int i;", 10764 getLLVMStyleWithColumns(20))); 10765 EXPECT_EQ("someFunction(\n" 10766 " \"aaabbbcc \"\n" 10767 " \"dddeeefff\");", 10768 format("someFunction(\"aaabbbcc dddeeefff\");", 10769 getLLVMStyleWithColumns(25))); 10770 } 10771 10772 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 10773 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 10774 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 10775 EXPECT_EQ("\"test\"\n" 10776 "\"\\n\"", 10777 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 10778 EXPECT_EQ("\"tes\\\\\"\n" 10779 "\"n\"", 10780 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 10781 EXPECT_EQ("\"\\\\\\\\\"\n" 10782 "\"\\n\"", 10783 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 10784 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 10785 EXPECT_EQ("\"\\uff01\"\n" 10786 "\"test\"", 10787 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 10788 EXPECT_EQ("\"\\Uff01ff02\"", 10789 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 10790 EXPECT_EQ("\"\\x000000000001\"\n" 10791 "\"next\"", 10792 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 10793 EXPECT_EQ("\"\\x000000000001next\"", 10794 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 10795 EXPECT_EQ("\"\\x000000000001\"", 10796 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 10797 EXPECT_EQ("\"test\"\n" 10798 "\"\\000000\"\n" 10799 "\"000001\"", 10800 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 10801 EXPECT_EQ("\"test\\000\"\n" 10802 "\"00000000\"\n" 10803 "\"1\"", 10804 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 10805 } 10806 10807 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 10808 verifyFormat("void f() {\n" 10809 " return g() {}\n" 10810 " void h() {}"); 10811 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 10812 "g();\n" 10813 "}"); 10814 } 10815 10816 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 10817 verifyFormat( 10818 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 10819 } 10820 10821 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 10822 verifyFormat("class X {\n" 10823 " void f() {\n" 10824 " }\n" 10825 "};", 10826 getLLVMStyleWithColumns(12)); 10827 } 10828 10829 TEST_F(FormatTest, ConfigurableIndentWidth) { 10830 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 10831 EightIndent.IndentWidth = 8; 10832 EightIndent.ContinuationIndentWidth = 8; 10833 verifyFormat("void f() {\n" 10834 " someFunction();\n" 10835 " if (true) {\n" 10836 " f();\n" 10837 " }\n" 10838 "}", 10839 EightIndent); 10840 verifyFormat("class X {\n" 10841 " void f() {\n" 10842 " }\n" 10843 "};", 10844 EightIndent); 10845 verifyFormat("int x[] = {\n" 10846 " call(),\n" 10847 " call()};", 10848 EightIndent); 10849 } 10850 10851 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 10852 verifyFormat("double\n" 10853 "f();", 10854 getLLVMStyleWithColumns(8)); 10855 } 10856 10857 TEST_F(FormatTest, ConfigurableUseOfTab) { 10858 FormatStyle Tab = getLLVMStyleWithColumns(42); 10859 Tab.IndentWidth = 8; 10860 Tab.UseTab = FormatStyle::UT_Always; 10861 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10862 10863 EXPECT_EQ("if (aaaaaaaa && // q\n" 10864 " bb)\t\t// w\n" 10865 "\t;", 10866 format("if (aaaaaaaa &&// q\n" 10867 "bb)// w\n" 10868 ";", 10869 Tab)); 10870 EXPECT_EQ("if (aaa && bbb) // w\n" 10871 "\t;", 10872 format("if(aaa&&bbb)// w\n" 10873 ";", 10874 Tab)); 10875 10876 verifyFormat("class X {\n" 10877 "\tvoid f() {\n" 10878 "\t\tsomeFunction(parameter1,\n" 10879 "\t\t\t parameter2);\n" 10880 "\t}\n" 10881 "};", 10882 Tab); 10883 verifyFormat("#define A \\\n" 10884 "\tvoid f() { \\\n" 10885 "\t\tsomeFunction( \\\n" 10886 "\t\t parameter1, \\\n" 10887 "\t\t parameter2); \\\n" 10888 "\t}", 10889 Tab); 10890 verifyFormat("int a;\t // x\n" 10891 "int bbbbbbbb; // x\n", 10892 Tab); 10893 10894 Tab.TabWidth = 4; 10895 Tab.IndentWidth = 8; 10896 verifyFormat("class TabWidth4Indent8 {\n" 10897 "\t\tvoid f() {\n" 10898 "\t\t\t\tsomeFunction(parameter1,\n" 10899 "\t\t\t\t\t\t\t parameter2);\n" 10900 "\t\t}\n" 10901 "};", 10902 Tab); 10903 10904 Tab.TabWidth = 4; 10905 Tab.IndentWidth = 4; 10906 verifyFormat("class TabWidth4Indent4 {\n" 10907 "\tvoid f() {\n" 10908 "\t\tsomeFunction(parameter1,\n" 10909 "\t\t\t\t\t parameter2);\n" 10910 "\t}\n" 10911 "};", 10912 Tab); 10913 10914 Tab.TabWidth = 8; 10915 Tab.IndentWidth = 4; 10916 verifyFormat("class TabWidth8Indent4 {\n" 10917 " void f() {\n" 10918 "\tsomeFunction(parameter1,\n" 10919 "\t\t parameter2);\n" 10920 " }\n" 10921 "};", 10922 Tab); 10923 10924 Tab.TabWidth = 8; 10925 Tab.IndentWidth = 8; 10926 EXPECT_EQ("/*\n" 10927 "\t a\t\tcomment\n" 10928 "\t in multiple lines\n" 10929 " */", 10930 format(" /*\t \t \n" 10931 " \t \t a\t\tcomment\t \t\n" 10932 " \t \t in multiple lines\t\n" 10933 " \t */", 10934 Tab)); 10935 10936 Tab.UseTab = FormatStyle::UT_ForIndentation; 10937 verifyFormat("{\n" 10938 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10939 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10940 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10941 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10942 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10943 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10944 "};", 10945 Tab); 10946 verifyFormat("enum AA {\n" 10947 "\ta1, // Force multiple lines\n" 10948 "\ta2,\n" 10949 "\ta3\n" 10950 "};", 10951 Tab); 10952 EXPECT_EQ("if (aaaaaaaa && // q\n" 10953 " bb) // w\n" 10954 "\t;", 10955 format("if (aaaaaaaa &&// q\n" 10956 "bb)// w\n" 10957 ";", 10958 Tab)); 10959 verifyFormat("class X {\n" 10960 "\tvoid f() {\n" 10961 "\t\tsomeFunction(parameter1,\n" 10962 "\t\t parameter2);\n" 10963 "\t}\n" 10964 "};", 10965 Tab); 10966 verifyFormat("{\n" 10967 "\tQ(\n" 10968 "\t {\n" 10969 "\t\t int a;\n" 10970 "\t\t someFunction(aaaaaaaa,\n" 10971 "\t\t bbbbbbb);\n" 10972 "\t },\n" 10973 "\t p);\n" 10974 "}", 10975 Tab); 10976 EXPECT_EQ("{\n" 10977 "\t/* aaaa\n" 10978 "\t bbbb */\n" 10979 "}", 10980 format("{\n" 10981 "/* aaaa\n" 10982 " bbbb */\n" 10983 "}", 10984 Tab)); 10985 EXPECT_EQ("{\n" 10986 "\t/*\n" 10987 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10988 "\t bbbbbbbbbbbbb\n" 10989 "\t*/\n" 10990 "}", 10991 format("{\n" 10992 "/*\n" 10993 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10994 "*/\n" 10995 "}", 10996 Tab)); 10997 EXPECT_EQ("{\n" 10998 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10999 "\t// bbbbbbbbbbbbb\n" 11000 "}", 11001 format("{\n" 11002 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11003 "}", 11004 Tab)); 11005 EXPECT_EQ("{\n" 11006 "\t/*\n" 11007 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11008 "\t bbbbbbbbbbbbb\n" 11009 "\t*/\n" 11010 "}", 11011 format("{\n" 11012 "\t/*\n" 11013 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11014 "\t*/\n" 11015 "}", 11016 Tab)); 11017 EXPECT_EQ("{\n" 11018 "\t/*\n" 11019 "\n" 11020 "\t*/\n" 11021 "}", 11022 format("{\n" 11023 "\t/*\n" 11024 "\n" 11025 "\t*/\n" 11026 "}", 11027 Tab)); 11028 EXPECT_EQ("{\n" 11029 "\t/*\n" 11030 " asdf\n" 11031 "\t*/\n" 11032 "}", 11033 format("{\n" 11034 "\t/*\n" 11035 " asdf\n" 11036 "\t*/\n" 11037 "}", 11038 Tab)); 11039 11040 Tab.UseTab = FormatStyle::UT_Never; 11041 EXPECT_EQ("/*\n" 11042 " a\t\tcomment\n" 11043 " in multiple lines\n" 11044 " */", 11045 format(" /*\t \t \n" 11046 " \t \t a\t\tcomment\t \t\n" 11047 " \t \t in multiple lines\t\n" 11048 " \t */", 11049 Tab)); 11050 EXPECT_EQ("/* some\n" 11051 " comment */", 11052 format(" \t \t /* some\n" 11053 " \t \t comment */", 11054 Tab)); 11055 EXPECT_EQ("int a; /* some\n" 11056 " comment */", 11057 format(" \t \t int a; /* some\n" 11058 " \t \t comment */", 11059 Tab)); 11060 11061 EXPECT_EQ("int a; /* some\n" 11062 "comment */", 11063 format(" \t \t int\ta; /* some\n" 11064 " \t \t comment */", 11065 Tab)); 11066 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11067 " comment */", 11068 format(" \t \t f(\"\t\t\"); /* some\n" 11069 " \t \t comment */", 11070 Tab)); 11071 EXPECT_EQ("{\n" 11072 " /*\n" 11073 " * Comment\n" 11074 " */\n" 11075 " int i;\n" 11076 "}", 11077 format("{\n" 11078 "\t/*\n" 11079 "\t * Comment\n" 11080 "\t */\n" 11081 "\t int i;\n" 11082 "}", 11083 Tab)); 11084 11085 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 11086 Tab.TabWidth = 8; 11087 Tab.IndentWidth = 8; 11088 EXPECT_EQ("if (aaaaaaaa && // q\n" 11089 " bb) // w\n" 11090 "\t;", 11091 format("if (aaaaaaaa &&// q\n" 11092 "bb)// w\n" 11093 ";", 11094 Tab)); 11095 EXPECT_EQ("if (aaa && bbb) // w\n" 11096 "\t;", 11097 format("if(aaa&&bbb)// w\n" 11098 ";", 11099 Tab)); 11100 verifyFormat("class X {\n" 11101 "\tvoid f() {\n" 11102 "\t\tsomeFunction(parameter1,\n" 11103 "\t\t\t parameter2);\n" 11104 "\t}\n" 11105 "};", 11106 Tab); 11107 verifyFormat("#define A \\\n" 11108 "\tvoid f() { \\\n" 11109 "\t\tsomeFunction( \\\n" 11110 "\t\t parameter1, \\\n" 11111 "\t\t parameter2); \\\n" 11112 "\t}", 11113 Tab); 11114 Tab.TabWidth = 4; 11115 Tab.IndentWidth = 8; 11116 verifyFormat("class TabWidth4Indent8 {\n" 11117 "\t\tvoid f() {\n" 11118 "\t\t\t\tsomeFunction(parameter1,\n" 11119 "\t\t\t\t\t\t\t parameter2);\n" 11120 "\t\t}\n" 11121 "};", 11122 Tab); 11123 Tab.TabWidth = 4; 11124 Tab.IndentWidth = 4; 11125 verifyFormat("class TabWidth4Indent4 {\n" 11126 "\tvoid f() {\n" 11127 "\t\tsomeFunction(parameter1,\n" 11128 "\t\t\t\t\t parameter2);\n" 11129 "\t}\n" 11130 "};", 11131 Tab); 11132 Tab.TabWidth = 8; 11133 Tab.IndentWidth = 4; 11134 verifyFormat("class TabWidth8Indent4 {\n" 11135 " void f() {\n" 11136 "\tsomeFunction(parameter1,\n" 11137 "\t\t parameter2);\n" 11138 " }\n" 11139 "};", 11140 Tab); 11141 Tab.TabWidth = 8; 11142 Tab.IndentWidth = 8; 11143 EXPECT_EQ("/*\n" 11144 "\t a\t\tcomment\n" 11145 "\t in multiple lines\n" 11146 " */", 11147 format(" /*\t \t \n" 11148 " \t \t a\t\tcomment\t \t\n" 11149 " \t \t in multiple lines\t\n" 11150 " \t */", 11151 Tab)); 11152 verifyFormat("{\n" 11153 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11154 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11155 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11156 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11157 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11158 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11159 "};", 11160 Tab); 11161 verifyFormat("enum AA {\n" 11162 "\ta1, // Force multiple lines\n" 11163 "\ta2,\n" 11164 "\ta3\n" 11165 "};", 11166 Tab); 11167 EXPECT_EQ("if (aaaaaaaa && // q\n" 11168 " bb) // w\n" 11169 "\t;", 11170 format("if (aaaaaaaa &&// q\n" 11171 "bb)// w\n" 11172 ";", 11173 Tab)); 11174 verifyFormat("class X {\n" 11175 "\tvoid f() {\n" 11176 "\t\tsomeFunction(parameter1,\n" 11177 "\t\t\t parameter2);\n" 11178 "\t}\n" 11179 "};", 11180 Tab); 11181 verifyFormat("{\n" 11182 "\tQ(\n" 11183 "\t {\n" 11184 "\t\t int a;\n" 11185 "\t\t someFunction(aaaaaaaa,\n" 11186 "\t\t\t\t bbbbbbb);\n" 11187 "\t },\n" 11188 "\t p);\n" 11189 "}", 11190 Tab); 11191 EXPECT_EQ("{\n" 11192 "\t/* aaaa\n" 11193 "\t bbbb */\n" 11194 "}", 11195 format("{\n" 11196 "/* aaaa\n" 11197 " bbbb */\n" 11198 "}", 11199 Tab)); 11200 EXPECT_EQ("{\n" 11201 "\t/*\n" 11202 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11203 "\t bbbbbbbbbbbbb\n" 11204 "\t*/\n" 11205 "}", 11206 format("{\n" 11207 "/*\n" 11208 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11209 "*/\n" 11210 "}", 11211 Tab)); 11212 EXPECT_EQ("{\n" 11213 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11214 "\t// bbbbbbbbbbbbb\n" 11215 "}", 11216 format("{\n" 11217 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11218 "}", 11219 Tab)); 11220 EXPECT_EQ("{\n" 11221 "\t/*\n" 11222 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11223 "\t bbbbbbbbbbbbb\n" 11224 "\t*/\n" 11225 "}", 11226 format("{\n" 11227 "\t/*\n" 11228 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11229 "\t*/\n" 11230 "}", 11231 Tab)); 11232 EXPECT_EQ("{\n" 11233 "\t/*\n" 11234 "\n" 11235 "\t*/\n" 11236 "}", 11237 format("{\n" 11238 "\t/*\n" 11239 "\n" 11240 "\t*/\n" 11241 "}", 11242 Tab)); 11243 EXPECT_EQ("{\n" 11244 "\t/*\n" 11245 " asdf\n" 11246 "\t*/\n" 11247 "}", 11248 format("{\n" 11249 "\t/*\n" 11250 " asdf\n" 11251 "\t*/\n" 11252 "}", 11253 Tab)); 11254 EXPECT_EQ("/* some\n" 11255 " comment */", 11256 format(" \t \t /* some\n" 11257 " \t \t comment */", 11258 Tab)); 11259 EXPECT_EQ("int a; /* some\n" 11260 " comment */", 11261 format(" \t \t int a; /* some\n" 11262 " \t \t comment */", 11263 Tab)); 11264 EXPECT_EQ("int a; /* some\n" 11265 "comment */", 11266 format(" \t \t int\ta; /* some\n" 11267 " \t \t comment */", 11268 Tab)); 11269 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11270 " comment */", 11271 format(" \t \t f(\"\t\t\"); /* some\n" 11272 " \t \t comment */", 11273 Tab)); 11274 EXPECT_EQ("{\n" 11275 "\t/*\n" 11276 "\t * Comment\n" 11277 "\t */\n" 11278 "\tint i;\n" 11279 "}", 11280 format("{\n" 11281 "\t/*\n" 11282 "\t * Comment\n" 11283 "\t */\n" 11284 "\t int i;\n" 11285 "}", 11286 Tab)); 11287 Tab.TabWidth = 2; 11288 Tab.IndentWidth = 2; 11289 EXPECT_EQ("{\n" 11290 "\t/* aaaa\n" 11291 "\t\t bbbb */\n" 11292 "}", 11293 format("{\n" 11294 "/* aaaa\n" 11295 "\t bbbb */\n" 11296 "}", 11297 Tab)); 11298 EXPECT_EQ("{\n" 11299 "\t/*\n" 11300 "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11301 "\t\tbbbbbbbbbbbbb\n" 11302 "\t*/\n" 11303 "}", 11304 format("{\n" 11305 "/*\n" 11306 "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11307 "*/\n" 11308 "}", 11309 Tab)); 11310 Tab.AlignConsecutiveAssignments = true; 11311 Tab.AlignConsecutiveDeclarations = true; 11312 Tab.TabWidth = 4; 11313 Tab.IndentWidth = 4; 11314 verifyFormat("class Assign {\n" 11315 "\tvoid f() {\n" 11316 "\t\tint x = 123;\n" 11317 "\t\tint random = 4;\n" 11318 "\t\tstd::string alphabet =\n" 11319 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11320 "\t}\n" 11321 "};", 11322 Tab); 11323 11324 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11325 Tab.TabWidth = 8; 11326 Tab.IndentWidth = 8; 11327 EXPECT_EQ("if (aaaaaaaa && // q\n" 11328 " bb) // w\n" 11329 "\t;", 11330 format("if (aaaaaaaa &&// q\n" 11331 "bb)// w\n" 11332 ";", 11333 Tab)); 11334 EXPECT_EQ("if (aaa && bbb) // w\n" 11335 "\t;", 11336 format("if(aaa&&bbb)// w\n" 11337 ";", 11338 Tab)); 11339 verifyFormat("class X {\n" 11340 "\tvoid f() {\n" 11341 "\t\tsomeFunction(parameter1,\n" 11342 "\t\t parameter2);\n" 11343 "\t}\n" 11344 "};", 11345 Tab); 11346 verifyFormat("#define A \\\n" 11347 "\tvoid f() { \\\n" 11348 "\t\tsomeFunction( \\\n" 11349 "\t\t parameter1, \\\n" 11350 "\t\t parameter2); \\\n" 11351 "\t}", 11352 Tab); 11353 Tab.TabWidth = 4; 11354 Tab.IndentWidth = 8; 11355 verifyFormat("class TabWidth4Indent8 {\n" 11356 "\t\tvoid f() {\n" 11357 "\t\t\t\tsomeFunction(parameter1,\n" 11358 "\t\t\t\t parameter2);\n" 11359 "\t\t}\n" 11360 "};", 11361 Tab); 11362 Tab.TabWidth = 4; 11363 Tab.IndentWidth = 4; 11364 verifyFormat("class TabWidth4Indent4 {\n" 11365 "\tvoid f() {\n" 11366 "\t\tsomeFunction(parameter1,\n" 11367 "\t\t parameter2);\n" 11368 "\t}\n" 11369 "};", 11370 Tab); 11371 Tab.TabWidth = 8; 11372 Tab.IndentWidth = 4; 11373 verifyFormat("class TabWidth8Indent4 {\n" 11374 " void f() {\n" 11375 "\tsomeFunction(parameter1,\n" 11376 "\t parameter2);\n" 11377 " }\n" 11378 "};", 11379 Tab); 11380 Tab.TabWidth = 8; 11381 Tab.IndentWidth = 8; 11382 EXPECT_EQ("/*\n" 11383 " a\t\tcomment\n" 11384 " in multiple lines\n" 11385 " */", 11386 format(" /*\t \t \n" 11387 " \t \t a\t\tcomment\t \t\n" 11388 " \t \t in multiple lines\t\n" 11389 " \t */", 11390 Tab)); 11391 verifyFormat("{\n" 11392 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11393 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11394 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11395 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11396 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11397 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11398 "};", 11399 Tab); 11400 verifyFormat("enum AA {\n" 11401 "\ta1, // Force multiple lines\n" 11402 "\ta2,\n" 11403 "\ta3\n" 11404 "};", 11405 Tab); 11406 EXPECT_EQ("if (aaaaaaaa && // q\n" 11407 " bb) // w\n" 11408 "\t;", 11409 format("if (aaaaaaaa &&// q\n" 11410 "bb)// w\n" 11411 ";", 11412 Tab)); 11413 verifyFormat("class X {\n" 11414 "\tvoid f() {\n" 11415 "\t\tsomeFunction(parameter1,\n" 11416 "\t\t parameter2);\n" 11417 "\t}\n" 11418 "};", 11419 Tab); 11420 verifyFormat("{\n" 11421 "\tQ(\n" 11422 "\t {\n" 11423 "\t\t int a;\n" 11424 "\t\t someFunction(aaaaaaaa,\n" 11425 "\t\t bbbbbbb);\n" 11426 "\t },\n" 11427 "\t p);\n" 11428 "}", 11429 Tab); 11430 EXPECT_EQ("{\n" 11431 "\t/* aaaa\n" 11432 "\t bbbb */\n" 11433 "}", 11434 format("{\n" 11435 "/* aaaa\n" 11436 " bbbb */\n" 11437 "}", 11438 Tab)); 11439 EXPECT_EQ("{\n" 11440 "\t/*\n" 11441 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11442 "\t bbbbbbbbbbbbb\n" 11443 "\t*/\n" 11444 "}", 11445 format("{\n" 11446 "/*\n" 11447 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11448 "*/\n" 11449 "}", 11450 Tab)); 11451 EXPECT_EQ("{\n" 11452 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11453 "\t// bbbbbbbbbbbbb\n" 11454 "}", 11455 format("{\n" 11456 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11457 "}", 11458 Tab)); 11459 EXPECT_EQ("{\n" 11460 "\t/*\n" 11461 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11462 "\t bbbbbbbbbbbbb\n" 11463 "\t*/\n" 11464 "}", 11465 format("{\n" 11466 "\t/*\n" 11467 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11468 "\t*/\n" 11469 "}", 11470 Tab)); 11471 EXPECT_EQ("{\n" 11472 "\t/*\n" 11473 "\n" 11474 "\t*/\n" 11475 "}", 11476 format("{\n" 11477 "\t/*\n" 11478 "\n" 11479 "\t*/\n" 11480 "}", 11481 Tab)); 11482 EXPECT_EQ("{\n" 11483 "\t/*\n" 11484 " asdf\n" 11485 "\t*/\n" 11486 "}", 11487 format("{\n" 11488 "\t/*\n" 11489 " asdf\n" 11490 "\t*/\n" 11491 "}", 11492 Tab)); 11493 EXPECT_EQ("/* some\n" 11494 " comment */", 11495 format(" \t \t /* some\n" 11496 " \t \t comment */", 11497 Tab)); 11498 EXPECT_EQ("int a; /* some\n" 11499 " comment */", 11500 format(" \t \t int a; /* some\n" 11501 " \t \t comment */", 11502 Tab)); 11503 EXPECT_EQ("int a; /* some\n" 11504 "comment */", 11505 format(" \t \t int\ta; /* some\n" 11506 " \t \t comment */", 11507 Tab)); 11508 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11509 " comment */", 11510 format(" \t \t f(\"\t\t\"); /* some\n" 11511 " \t \t comment */", 11512 Tab)); 11513 EXPECT_EQ("{\n" 11514 "\t/*\n" 11515 "\t * Comment\n" 11516 "\t */\n" 11517 "\tint i;\n" 11518 "}", 11519 format("{\n" 11520 "\t/*\n" 11521 "\t * Comment\n" 11522 "\t */\n" 11523 "\t int i;\n" 11524 "}", 11525 Tab)); 11526 Tab.TabWidth = 2; 11527 Tab.IndentWidth = 2; 11528 EXPECT_EQ("{\n" 11529 "\t/* aaaa\n" 11530 "\t bbbb */\n" 11531 "}", 11532 format("{\n" 11533 "/* aaaa\n" 11534 " bbbb */\n" 11535 "}", 11536 Tab)); 11537 EXPECT_EQ("{\n" 11538 "\t/*\n" 11539 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11540 "\t bbbbbbbbbbbbb\n" 11541 "\t*/\n" 11542 "}", 11543 format("{\n" 11544 "/*\n" 11545 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11546 "*/\n" 11547 "}", 11548 Tab)); 11549 Tab.AlignConsecutiveAssignments = true; 11550 Tab.AlignConsecutiveDeclarations = true; 11551 Tab.TabWidth = 4; 11552 Tab.IndentWidth = 4; 11553 verifyFormat("class Assign {\n" 11554 "\tvoid f() {\n" 11555 "\t\tint x = 123;\n" 11556 "\t\tint random = 4;\n" 11557 "\t\tstd::string alphabet =\n" 11558 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11559 "\t}\n" 11560 "};", 11561 Tab); 11562 Tab.AlignOperands = FormatStyle::OAS_Align; 11563 verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb +\n" 11564 " cccccccccccccccccccc;", 11565 Tab); 11566 // no alignment 11567 verifyFormat("int aaaaaaaaaa =\n" 11568 "\tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 11569 Tab); 11570 verifyFormat("return aaaaaaaaaaaaaaaa ? 111111111111111\n" 11571 " : bbbbbbbbbbbbbb ? 222222222222222\n" 11572 " : 333333333333333;", 11573 Tab); 11574 Tab.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11575 Tab.AlignOperands = FormatStyle::OAS_AlignAfterOperator; 11576 verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb\n" 11577 " + cccccccccccccccccccc;", 11578 Tab); 11579 } 11580 11581 TEST_F(FormatTest, ZeroTabWidth) { 11582 FormatStyle Tab = getLLVMStyleWithColumns(42); 11583 Tab.IndentWidth = 8; 11584 Tab.UseTab = FormatStyle::UT_Never; 11585 Tab.TabWidth = 0; 11586 EXPECT_EQ("void a(){\n" 11587 " // line starts with '\t'\n" 11588 "};", 11589 format("void a(){\n" 11590 "\t// line starts with '\t'\n" 11591 "};", 11592 Tab)); 11593 11594 EXPECT_EQ("void a(){\n" 11595 " // line starts with '\t'\n" 11596 "};", 11597 format("void a(){\n" 11598 "\t\t// line starts with '\t'\n" 11599 "};", 11600 Tab)); 11601 11602 Tab.UseTab = FormatStyle::UT_ForIndentation; 11603 EXPECT_EQ("void a(){\n" 11604 " // line starts with '\t'\n" 11605 "};", 11606 format("void a(){\n" 11607 "\t// line starts with '\t'\n" 11608 "};", 11609 Tab)); 11610 11611 EXPECT_EQ("void a(){\n" 11612 " // line starts with '\t'\n" 11613 "};", 11614 format("void a(){\n" 11615 "\t\t// line starts with '\t'\n" 11616 "};", 11617 Tab)); 11618 11619 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 11620 EXPECT_EQ("void a(){\n" 11621 " // line starts with '\t'\n" 11622 "};", 11623 format("void a(){\n" 11624 "\t// line starts with '\t'\n" 11625 "};", 11626 Tab)); 11627 11628 EXPECT_EQ("void a(){\n" 11629 " // line starts with '\t'\n" 11630 "};", 11631 format("void a(){\n" 11632 "\t\t// line starts with '\t'\n" 11633 "};", 11634 Tab)); 11635 11636 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11637 EXPECT_EQ("void a(){\n" 11638 " // line starts with '\t'\n" 11639 "};", 11640 format("void a(){\n" 11641 "\t// line starts with '\t'\n" 11642 "};", 11643 Tab)); 11644 11645 EXPECT_EQ("void a(){\n" 11646 " // line starts with '\t'\n" 11647 "};", 11648 format("void a(){\n" 11649 "\t\t// line starts with '\t'\n" 11650 "};", 11651 Tab)); 11652 11653 Tab.UseTab = FormatStyle::UT_Always; 11654 EXPECT_EQ("void a(){\n" 11655 "// line starts with '\t'\n" 11656 "};", 11657 format("void a(){\n" 11658 "\t// line starts with '\t'\n" 11659 "};", 11660 Tab)); 11661 11662 EXPECT_EQ("void a(){\n" 11663 "// line starts with '\t'\n" 11664 "};", 11665 format("void a(){\n" 11666 "\t\t// line starts with '\t'\n" 11667 "};", 11668 Tab)); 11669 } 11670 11671 TEST_F(FormatTest, CalculatesOriginalColumn) { 11672 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11673 "q\"; /* some\n" 11674 " comment */", 11675 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11676 "q\"; /* some\n" 11677 " comment */", 11678 getLLVMStyle())); 11679 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11680 "/* some\n" 11681 " comment */", 11682 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11683 " /* some\n" 11684 " comment */", 11685 getLLVMStyle())); 11686 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11687 "qqq\n" 11688 "/* some\n" 11689 " comment */", 11690 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11691 "qqq\n" 11692 " /* some\n" 11693 " comment */", 11694 getLLVMStyle())); 11695 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11696 "wwww; /* some\n" 11697 " comment */", 11698 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11699 "wwww; /* some\n" 11700 " comment */", 11701 getLLVMStyle())); 11702 } 11703 11704 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 11705 FormatStyle NoSpace = getLLVMStyle(); 11706 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 11707 11708 verifyFormat("while(true)\n" 11709 " continue;", 11710 NoSpace); 11711 verifyFormat("for(;;)\n" 11712 " continue;", 11713 NoSpace); 11714 verifyFormat("if(true)\n" 11715 " f();\n" 11716 "else if(true)\n" 11717 " f();", 11718 NoSpace); 11719 verifyFormat("do {\n" 11720 " do_something();\n" 11721 "} while(something());", 11722 NoSpace); 11723 verifyFormat("switch(x) {\n" 11724 "default:\n" 11725 " break;\n" 11726 "}", 11727 NoSpace); 11728 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 11729 verifyFormat("size_t x = sizeof(x);", NoSpace); 11730 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 11731 verifyFormat("auto f(int x) -> typeof(x);", NoSpace); 11732 verifyFormat("auto f(int x) -> _Atomic(x);", NoSpace); 11733 verifyFormat("auto f(int x) -> __underlying_type(x);", NoSpace); 11734 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 11735 verifyFormat("alignas(128) char a[128];", NoSpace); 11736 verifyFormat("size_t x = alignof(MyType);", NoSpace); 11737 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 11738 verifyFormat("int f() throw(Deprecated);", NoSpace); 11739 verifyFormat("typedef void (*cb)(int);", NoSpace); 11740 verifyFormat("T A::operator()();", NoSpace); 11741 verifyFormat("X A::operator++(T);", NoSpace); 11742 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 11743 11744 FormatStyle Space = getLLVMStyle(); 11745 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 11746 11747 verifyFormat("int f ();", Space); 11748 verifyFormat("void f (int a, T b) {\n" 11749 " while (true)\n" 11750 " continue;\n" 11751 "}", 11752 Space); 11753 verifyFormat("if (true)\n" 11754 " f ();\n" 11755 "else if (true)\n" 11756 " f ();", 11757 Space); 11758 verifyFormat("do {\n" 11759 " do_something ();\n" 11760 "} while (something ());", 11761 Space); 11762 verifyFormat("switch (x) {\n" 11763 "default:\n" 11764 " break;\n" 11765 "}", 11766 Space); 11767 verifyFormat("A::A () : a (1) {}", Space); 11768 verifyFormat("void f () __attribute__ ((asdf));", Space); 11769 verifyFormat("*(&a + 1);\n" 11770 "&((&a)[1]);\n" 11771 "a[(b + c) * d];\n" 11772 "(((a + 1) * 2) + 3) * 4;", 11773 Space); 11774 verifyFormat("#define A(x) x", Space); 11775 verifyFormat("#define A (x) x", Space); 11776 verifyFormat("#if defined(x)\n" 11777 "#endif", 11778 Space); 11779 verifyFormat("auto i = std::make_unique<int> (5);", Space); 11780 verifyFormat("size_t x = sizeof (x);", Space); 11781 verifyFormat("auto f (int x) -> decltype (x);", Space); 11782 verifyFormat("auto f (int x) -> typeof (x);", Space); 11783 verifyFormat("auto f (int x) -> _Atomic (x);", Space); 11784 verifyFormat("auto f (int x) -> __underlying_type (x);", Space); 11785 verifyFormat("int f (T x) noexcept (x.create ());", Space); 11786 verifyFormat("alignas (128) char a[128];", Space); 11787 verifyFormat("size_t x = alignof (MyType);", Space); 11788 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 11789 verifyFormat("int f () throw (Deprecated);", Space); 11790 verifyFormat("typedef void (*cb) (int);", Space); 11791 verifyFormat("T A::operator() ();", Space); 11792 verifyFormat("X A::operator++ (T);", Space); 11793 verifyFormat("auto lambda = [] () { return 0; };", Space); 11794 verifyFormat("int x = int (y);", Space); 11795 11796 FormatStyle SomeSpace = getLLVMStyle(); 11797 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 11798 11799 verifyFormat("[]() -> float {}", SomeSpace); 11800 verifyFormat("[] (auto foo) {}", SomeSpace); 11801 verifyFormat("[foo]() -> int {}", SomeSpace); 11802 verifyFormat("int f();", SomeSpace); 11803 verifyFormat("void f (int a, T b) {\n" 11804 " while (true)\n" 11805 " continue;\n" 11806 "}", 11807 SomeSpace); 11808 verifyFormat("if (true)\n" 11809 " f();\n" 11810 "else if (true)\n" 11811 " f();", 11812 SomeSpace); 11813 verifyFormat("do {\n" 11814 " do_something();\n" 11815 "} while (something());", 11816 SomeSpace); 11817 verifyFormat("switch (x) {\n" 11818 "default:\n" 11819 " break;\n" 11820 "}", 11821 SomeSpace); 11822 verifyFormat("A::A() : a (1) {}", SomeSpace); 11823 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 11824 verifyFormat("*(&a + 1);\n" 11825 "&((&a)[1]);\n" 11826 "a[(b + c) * d];\n" 11827 "(((a + 1) * 2) + 3) * 4;", 11828 SomeSpace); 11829 verifyFormat("#define A(x) x", SomeSpace); 11830 verifyFormat("#define A (x) x", SomeSpace); 11831 verifyFormat("#if defined(x)\n" 11832 "#endif", 11833 SomeSpace); 11834 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 11835 verifyFormat("size_t x = sizeof (x);", SomeSpace); 11836 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 11837 verifyFormat("auto f (int x) -> typeof (x);", SomeSpace); 11838 verifyFormat("auto f (int x) -> _Atomic (x);", SomeSpace); 11839 verifyFormat("auto f (int x) -> __underlying_type (x);", SomeSpace); 11840 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 11841 verifyFormat("alignas (128) char a[128];", SomeSpace); 11842 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 11843 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 11844 SomeSpace); 11845 verifyFormat("int f() throw (Deprecated);", SomeSpace); 11846 verifyFormat("typedef void (*cb) (int);", SomeSpace); 11847 verifyFormat("T A::operator()();", SomeSpace); 11848 verifyFormat("X A::operator++ (T);", SomeSpace); 11849 verifyFormat("int x = int (y);", SomeSpace); 11850 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 11851 } 11852 11853 TEST_F(FormatTest, SpaceAfterLogicalNot) { 11854 FormatStyle Spaces = getLLVMStyle(); 11855 Spaces.SpaceAfterLogicalNot = true; 11856 11857 verifyFormat("bool x = ! y", Spaces); 11858 verifyFormat("if (! isFailure())", Spaces); 11859 verifyFormat("if (! (a && b))", Spaces); 11860 verifyFormat("\"Error!\"", Spaces); 11861 verifyFormat("! ! x", Spaces); 11862 } 11863 11864 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 11865 FormatStyle Spaces = getLLVMStyle(); 11866 11867 Spaces.SpacesInParentheses = true; 11868 verifyFormat("do_something( ::globalVar );", Spaces); 11869 verifyFormat("call( x, y, z );", Spaces); 11870 verifyFormat("call();", Spaces); 11871 verifyFormat("std::function<void( int, int )> callback;", Spaces); 11872 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 11873 Spaces); 11874 verifyFormat("while ( (bool)1 )\n" 11875 " continue;", 11876 Spaces); 11877 verifyFormat("for ( ;; )\n" 11878 " continue;", 11879 Spaces); 11880 verifyFormat("if ( true )\n" 11881 " f();\n" 11882 "else if ( true )\n" 11883 " f();", 11884 Spaces); 11885 verifyFormat("do {\n" 11886 " do_something( (int)i );\n" 11887 "} while ( something() );", 11888 Spaces); 11889 verifyFormat("switch ( x ) {\n" 11890 "default:\n" 11891 " break;\n" 11892 "}", 11893 Spaces); 11894 11895 Spaces.SpacesInParentheses = false; 11896 Spaces.SpacesInCStyleCastParentheses = true; 11897 verifyFormat("Type *A = ( Type * )P;", Spaces); 11898 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 11899 verifyFormat("x = ( int32 )y;", Spaces); 11900 verifyFormat("int a = ( int )(2.0f);", Spaces); 11901 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 11902 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 11903 verifyFormat("#define x (( int )-1)", Spaces); 11904 11905 // Run the first set of tests again with: 11906 Spaces.SpacesInParentheses = false; 11907 Spaces.SpaceInEmptyParentheses = true; 11908 Spaces.SpacesInCStyleCastParentheses = true; 11909 verifyFormat("call(x, y, z);", Spaces); 11910 verifyFormat("call( );", Spaces); 11911 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11912 verifyFormat("while (( bool )1)\n" 11913 " continue;", 11914 Spaces); 11915 verifyFormat("for (;;)\n" 11916 " continue;", 11917 Spaces); 11918 verifyFormat("if (true)\n" 11919 " f( );\n" 11920 "else if (true)\n" 11921 " f( );", 11922 Spaces); 11923 verifyFormat("do {\n" 11924 " do_something(( int )i);\n" 11925 "} while (something( ));", 11926 Spaces); 11927 verifyFormat("switch (x) {\n" 11928 "default:\n" 11929 " break;\n" 11930 "}", 11931 Spaces); 11932 11933 // Run the first set of tests again with: 11934 Spaces.SpaceAfterCStyleCast = true; 11935 verifyFormat("call(x, y, z);", Spaces); 11936 verifyFormat("call( );", Spaces); 11937 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11938 verifyFormat("while (( bool ) 1)\n" 11939 " continue;", 11940 Spaces); 11941 verifyFormat("for (;;)\n" 11942 " continue;", 11943 Spaces); 11944 verifyFormat("if (true)\n" 11945 " f( );\n" 11946 "else if (true)\n" 11947 " f( );", 11948 Spaces); 11949 verifyFormat("do {\n" 11950 " do_something(( int ) i);\n" 11951 "} while (something( ));", 11952 Spaces); 11953 verifyFormat("switch (x) {\n" 11954 "default:\n" 11955 " break;\n" 11956 "}", 11957 Spaces); 11958 11959 // Run subset of tests again with: 11960 Spaces.SpacesInCStyleCastParentheses = false; 11961 Spaces.SpaceAfterCStyleCast = true; 11962 verifyFormat("while ((bool) 1)\n" 11963 " continue;", 11964 Spaces); 11965 verifyFormat("do {\n" 11966 " do_something((int) i);\n" 11967 "} while (something( ));", 11968 Spaces); 11969 } 11970 11971 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 11972 verifyFormat("int a[5];"); 11973 verifyFormat("a[3] += 42;"); 11974 11975 FormatStyle Spaces = getLLVMStyle(); 11976 Spaces.SpacesInSquareBrackets = true; 11977 // Not lambdas. 11978 verifyFormat("int a[ 5 ];", Spaces); 11979 verifyFormat("a[ 3 ] += 42;", Spaces); 11980 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 11981 verifyFormat("double &operator[](int i) { return 0; }\n" 11982 "int i;", 11983 Spaces); 11984 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 11985 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 11986 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 11987 // Lambdas. 11988 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 11989 verifyFormat("return [ i, args... ] {};", Spaces); 11990 verifyFormat("int foo = [ &bar ]() {};", Spaces); 11991 verifyFormat("int foo = [ = ]() {};", Spaces); 11992 verifyFormat("int foo = [ & ]() {};", Spaces); 11993 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 11994 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 11995 } 11996 11997 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 11998 FormatStyle NoSpaceStyle = getLLVMStyle(); 11999 verifyFormat("int a[5];", NoSpaceStyle); 12000 verifyFormat("a[3] += 42;", NoSpaceStyle); 12001 12002 verifyFormat("int a[1];", NoSpaceStyle); 12003 verifyFormat("int 1 [a];", NoSpaceStyle); 12004 verifyFormat("int a[1][2];", NoSpaceStyle); 12005 verifyFormat("a[7] = 5;", NoSpaceStyle); 12006 verifyFormat("int a = (f())[23];", NoSpaceStyle); 12007 verifyFormat("f([] {})", NoSpaceStyle); 12008 12009 FormatStyle Space = getLLVMStyle(); 12010 Space.SpaceBeforeSquareBrackets = true; 12011 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 12012 verifyFormat("return [i, args...] {};", Space); 12013 12014 verifyFormat("int a [5];", Space); 12015 verifyFormat("a [3] += 42;", Space); 12016 verifyFormat("constexpr char hello []{\"hello\"};", Space); 12017 verifyFormat("double &operator[](int i) { return 0; }\n" 12018 "int i;", 12019 Space); 12020 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 12021 verifyFormat("int i = a [a][a]->f();", Space); 12022 verifyFormat("int i = (*b) [a]->f();", Space); 12023 12024 verifyFormat("int a [1];", Space); 12025 verifyFormat("int 1 [a];", Space); 12026 verifyFormat("int a [1][2];", Space); 12027 verifyFormat("a [7] = 5;", Space); 12028 verifyFormat("int a = (f()) [23];", Space); 12029 verifyFormat("f([] {})", Space); 12030 } 12031 12032 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 12033 verifyFormat("int a = 5;"); 12034 verifyFormat("a += 42;"); 12035 verifyFormat("a or_eq 8;"); 12036 12037 FormatStyle Spaces = getLLVMStyle(); 12038 Spaces.SpaceBeforeAssignmentOperators = false; 12039 verifyFormat("int a= 5;", Spaces); 12040 verifyFormat("a+= 42;", Spaces); 12041 verifyFormat("a or_eq 8;", Spaces); 12042 } 12043 12044 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 12045 verifyFormat("class Foo : public Bar {};"); 12046 verifyFormat("Foo::Foo() : foo(1) {}"); 12047 verifyFormat("for (auto a : b) {\n}"); 12048 verifyFormat("int x = a ? b : c;"); 12049 verifyFormat("{\n" 12050 "label0:\n" 12051 " int x = 0;\n" 12052 "}"); 12053 verifyFormat("switch (x) {\n" 12054 "case 1:\n" 12055 "default:\n" 12056 "}"); 12057 12058 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 12059 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 12060 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 12061 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 12062 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 12063 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 12064 verifyFormat("{\n" 12065 "label1:\n" 12066 " int x = 0;\n" 12067 "}", 12068 CtorInitializerStyle); 12069 verifyFormat("switch (x) {\n" 12070 "case 1:\n" 12071 "default:\n" 12072 "}", 12073 CtorInitializerStyle); 12074 CtorInitializerStyle.BreakConstructorInitializers = 12075 FormatStyle::BCIS_AfterColon; 12076 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 12077 " aaaaaaaaaaaaaaaa(1),\n" 12078 " bbbbbbbbbbbbbbbb(2) {}", 12079 CtorInitializerStyle); 12080 CtorInitializerStyle.BreakConstructorInitializers = 12081 FormatStyle::BCIS_BeforeComma; 12082 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12083 " : aaaaaaaaaaaaaaaa(1)\n" 12084 " , bbbbbbbbbbbbbbbb(2) {}", 12085 CtorInitializerStyle); 12086 CtorInitializerStyle.BreakConstructorInitializers = 12087 FormatStyle::BCIS_BeforeColon; 12088 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12089 " : aaaaaaaaaaaaaaaa(1),\n" 12090 " bbbbbbbbbbbbbbbb(2) {}", 12091 CtorInitializerStyle); 12092 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 12093 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12094 ": aaaaaaaaaaaaaaaa(1),\n" 12095 " bbbbbbbbbbbbbbbb(2) {}", 12096 CtorInitializerStyle); 12097 12098 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 12099 InheritanceStyle.SpaceBeforeInheritanceColon = false; 12100 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 12101 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 12102 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 12103 verifyFormat("int x = a ? b : c;", InheritanceStyle); 12104 verifyFormat("{\n" 12105 "label2:\n" 12106 " int x = 0;\n" 12107 "}", 12108 InheritanceStyle); 12109 verifyFormat("switch (x) {\n" 12110 "case 1:\n" 12111 "default:\n" 12112 "}", 12113 InheritanceStyle); 12114 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 12115 verifyFormat("class Foooooooooooooooooooooo:\n" 12116 " public aaaaaaaaaaaaaaaaaa,\n" 12117 " public bbbbbbbbbbbbbbbbbb {\n" 12118 "}", 12119 InheritanceStyle); 12120 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 12121 verifyFormat("class Foooooooooooooooooooooo\n" 12122 " : public aaaaaaaaaaaaaaaaaa\n" 12123 " , public bbbbbbbbbbbbbbbbbb {\n" 12124 "}", 12125 InheritanceStyle); 12126 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12127 verifyFormat("class Foooooooooooooooooooooo\n" 12128 " : public aaaaaaaaaaaaaaaaaa,\n" 12129 " public bbbbbbbbbbbbbbbbbb {\n" 12130 "}", 12131 InheritanceStyle); 12132 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 12133 verifyFormat("class Foooooooooooooooooooooo\n" 12134 ": public aaaaaaaaaaaaaaaaaa,\n" 12135 " public bbbbbbbbbbbbbbbbbb {}", 12136 InheritanceStyle); 12137 12138 FormatStyle ForLoopStyle = getLLVMStyle(); 12139 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 12140 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 12141 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 12142 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 12143 verifyFormat("int x = a ? b : c;", ForLoopStyle); 12144 verifyFormat("{\n" 12145 "label2:\n" 12146 " int x = 0;\n" 12147 "}", 12148 ForLoopStyle); 12149 verifyFormat("switch (x) {\n" 12150 "case 1:\n" 12151 "default:\n" 12152 "}", 12153 ForLoopStyle); 12154 12155 FormatStyle NoSpaceStyle = getLLVMStyle(); 12156 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 12157 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 12158 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 12159 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 12160 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 12161 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 12162 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 12163 verifyFormat("{\n" 12164 "label3:\n" 12165 " int x = 0;\n" 12166 "}", 12167 NoSpaceStyle); 12168 verifyFormat("switch (x) {\n" 12169 "case 1:\n" 12170 "default:\n" 12171 "}", 12172 NoSpaceStyle); 12173 } 12174 12175 TEST_F(FormatTest, ConfigurableSpaceAroundPointerQualifiers) { 12176 FormatStyle Style = getLLVMStyle(); 12177 12178 Style.PointerAlignment = FormatStyle::PAS_Left; 12179 Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default; 12180 verifyFormat("void* const* x = NULL;", Style); 12181 12182 #define verifyQualifierSpaces(Code, Pointers, Qualifiers) \ 12183 do { \ 12184 Style.PointerAlignment = FormatStyle::Pointers; \ 12185 Style.SpaceAroundPointerQualifiers = FormatStyle::Qualifiers; \ 12186 verifyFormat(Code, Style); \ 12187 } while (false) 12188 12189 verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Default); 12190 verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_Default); 12191 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Default); 12192 12193 verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Before); 12194 verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Before); 12195 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Before); 12196 12197 verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_After); 12198 verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_After); 12199 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_After); 12200 12201 verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_Both); 12202 verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Both); 12203 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Both); 12204 12205 #undef verifyQualifierSpaces 12206 12207 FormatStyle Spaces = getLLVMStyle(); 12208 Spaces.AttributeMacros.push_back("qualified"); 12209 Spaces.PointerAlignment = FormatStyle::PAS_Right; 12210 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default; 12211 verifyFormat("SomeType *volatile *a = NULL;", Spaces); 12212 verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces); 12213 verifyFormat("std::vector<SomeType *const *> x;", Spaces); 12214 verifyFormat("std::vector<SomeType *qualified *> x;", Spaces); 12215 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12216 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before; 12217 verifyFormat("SomeType * volatile *a = NULL;", Spaces); 12218 verifyFormat("SomeType * __attribute__((attr)) *a = NULL;", Spaces); 12219 verifyFormat("std::vector<SomeType * const *> x;", Spaces); 12220 verifyFormat("std::vector<SomeType * qualified *> x;", Spaces); 12221 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12222 12223 // Check that SAPQ_Before doesn't result in extra spaces for PAS_Left. 12224 Spaces.PointerAlignment = FormatStyle::PAS_Left; 12225 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before; 12226 verifyFormat("SomeType* volatile* a = NULL;", Spaces); 12227 verifyFormat("SomeType* __attribute__((attr))* a = NULL;", Spaces); 12228 verifyFormat("std::vector<SomeType* const*> x;", Spaces); 12229 verifyFormat("std::vector<SomeType* qualified*> x;", Spaces); 12230 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12231 // However, setting it to SAPQ_After should add spaces after __attribute, etc. 12232 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After; 12233 verifyFormat("SomeType* volatile * a = NULL;", Spaces); 12234 verifyFormat("SomeType* __attribute__((attr)) * a = NULL;", Spaces); 12235 verifyFormat("std::vector<SomeType* const *> x;", Spaces); 12236 verifyFormat("std::vector<SomeType* qualified *> x;", Spaces); 12237 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12238 12239 // PAS_Middle should not have any noticeable changes even for SAPQ_Both 12240 Spaces.PointerAlignment = FormatStyle::PAS_Middle; 12241 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After; 12242 verifyFormat("SomeType * volatile * a = NULL;", Spaces); 12243 verifyFormat("SomeType * __attribute__((attr)) * a = NULL;", Spaces); 12244 verifyFormat("std::vector<SomeType * const *> x;", Spaces); 12245 verifyFormat("std::vector<SomeType * qualified *> x;", Spaces); 12246 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12247 } 12248 12249 TEST_F(FormatTest, AlignConsecutiveMacros) { 12250 FormatStyle Style = getLLVMStyle(); 12251 Style.AlignConsecutiveAssignments = true; 12252 Style.AlignConsecutiveDeclarations = true; 12253 Style.AlignConsecutiveMacros = false; 12254 12255 verifyFormat("#define a 3\n" 12256 "#define bbbb 4\n" 12257 "#define ccc (5)", 12258 Style); 12259 12260 verifyFormat("#define f(x) (x * x)\n" 12261 "#define fff(x, y, z) (x * y + z)\n" 12262 "#define ffff(x, y) (x - y)", 12263 Style); 12264 12265 verifyFormat("#define foo(x, y) (x + y)\n" 12266 "#define bar (5, 6)(2 + 2)", 12267 Style); 12268 12269 verifyFormat("#define a 3\n" 12270 "#define bbbb 4\n" 12271 "#define ccc (5)\n" 12272 "#define f(x) (x * x)\n" 12273 "#define fff(x, y, z) (x * y + z)\n" 12274 "#define ffff(x, y) (x - y)", 12275 Style); 12276 12277 Style.AlignConsecutiveMacros = true; 12278 verifyFormat("#define a 3\n" 12279 "#define bbbb 4\n" 12280 "#define ccc (5)", 12281 Style); 12282 12283 verifyFormat("#define f(x) (x * x)\n" 12284 "#define fff(x, y, z) (x * y + z)\n" 12285 "#define ffff(x, y) (x - y)", 12286 Style); 12287 12288 verifyFormat("#define foo(x, y) (x + y)\n" 12289 "#define bar (5, 6)(2 + 2)", 12290 Style); 12291 12292 verifyFormat("#define a 3\n" 12293 "#define bbbb 4\n" 12294 "#define ccc (5)\n" 12295 "#define f(x) (x * x)\n" 12296 "#define fff(x, y, z) (x * y + z)\n" 12297 "#define ffff(x, y) (x - y)", 12298 Style); 12299 12300 verifyFormat("#define a 5\n" 12301 "#define foo(x, y) (x + y)\n" 12302 "#define CCC (6)\n" 12303 "auto lambda = []() {\n" 12304 " auto ii = 0;\n" 12305 " float j = 0;\n" 12306 " return 0;\n" 12307 "};\n" 12308 "int i = 0;\n" 12309 "float i2 = 0;\n" 12310 "auto v = type{\n" 12311 " i = 1, //\n" 12312 " (i = 2), //\n" 12313 " i = 3 //\n" 12314 "};", 12315 Style); 12316 12317 Style.AlignConsecutiveMacros = false; 12318 Style.ColumnLimit = 20; 12319 12320 verifyFormat("#define a \\\n" 12321 " \"aabbbbbbbbbbbb\"\n" 12322 "#define D \\\n" 12323 " \"aabbbbbbbbbbbb\" \\\n" 12324 " \"ccddeeeeeeeee\"\n" 12325 "#define B \\\n" 12326 " \"QQQQQQQQQQQQQ\" \\\n" 12327 " \"FFFFFFFFFFFFF\" \\\n" 12328 " \"LLLLLLLL\"\n", 12329 Style); 12330 12331 Style.AlignConsecutiveMacros = true; 12332 verifyFormat("#define a \\\n" 12333 " \"aabbbbbbbbbbbb\"\n" 12334 "#define D \\\n" 12335 " \"aabbbbbbbbbbbb\" \\\n" 12336 " \"ccddeeeeeeeee\"\n" 12337 "#define B \\\n" 12338 " \"QQQQQQQQQQQQQ\" \\\n" 12339 " \"FFFFFFFFFFFFF\" \\\n" 12340 " \"LLLLLLLL\"\n", 12341 Style); 12342 } 12343 12344 TEST_F(FormatTest, AlignConsecutiveAssignments) { 12345 FormatStyle Alignment = getLLVMStyle(); 12346 Alignment.AlignConsecutiveMacros = true; 12347 Alignment.AlignConsecutiveAssignments = false; 12348 verifyFormat("int a = 5;\n" 12349 "int oneTwoThree = 123;", 12350 Alignment); 12351 verifyFormat("int a = 5;\n" 12352 "int oneTwoThree = 123;", 12353 Alignment); 12354 12355 Alignment.AlignConsecutiveAssignments = true; 12356 verifyFormat("int a = 5;\n" 12357 "int oneTwoThree = 123;", 12358 Alignment); 12359 verifyFormat("int a = method();\n" 12360 "int oneTwoThree = 133;", 12361 Alignment); 12362 verifyFormat("a &= 5;\n" 12363 "bcd *= 5;\n" 12364 "ghtyf += 5;\n" 12365 "dvfvdb -= 5;\n" 12366 "a /= 5;\n" 12367 "vdsvsv %= 5;\n" 12368 "sfdbddfbdfbb ^= 5;\n" 12369 "dvsdsv |= 5;\n" 12370 "int dsvvdvsdvvv = 123;", 12371 Alignment); 12372 verifyFormat("int i = 1, j = 10;\n" 12373 "something = 2000;", 12374 Alignment); 12375 verifyFormat("something = 2000;\n" 12376 "int i = 1, j = 10;\n", 12377 Alignment); 12378 verifyFormat("something = 2000;\n" 12379 "another = 911;\n" 12380 "int i = 1, j = 10;\n" 12381 "oneMore = 1;\n" 12382 "i = 2;", 12383 Alignment); 12384 verifyFormat("int a = 5;\n" 12385 "int one = 1;\n" 12386 "method();\n" 12387 "int oneTwoThree = 123;\n" 12388 "int oneTwo = 12;", 12389 Alignment); 12390 verifyFormat("int oneTwoThree = 123;\n" 12391 "int oneTwo = 12;\n" 12392 "method();\n", 12393 Alignment); 12394 verifyFormat("int oneTwoThree = 123; // comment\n" 12395 "int oneTwo = 12; // comment", 12396 Alignment); 12397 12398 // Bug 25167 12399 /* Uncomment when fixed 12400 verifyFormat("#if A\n" 12401 "#else\n" 12402 "int aaaaaaaa = 12;\n" 12403 "#endif\n" 12404 "#if B\n" 12405 "#else\n" 12406 "int a = 12;\n" 12407 "#endif\n", 12408 Alignment); 12409 verifyFormat("enum foo {\n" 12410 "#if A\n" 12411 "#else\n" 12412 " aaaaaaaa = 12;\n" 12413 "#endif\n" 12414 "#if B\n" 12415 "#else\n" 12416 " a = 12;\n" 12417 "#endif\n" 12418 "};\n", 12419 Alignment); 12420 */ 12421 12422 EXPECT_EQ("int a = 5;\n" 12423 "\n" 12424 "int oneTwoThree = 123;", 12425 format("int a = 5;\n" 12426 "\n" 12427 "int oneTwoThree= 123;", 12428 Alignment)); 12429 EXPECT_EQ("int a = 5;\n" 12430 "int one = 1;\n" 12431 "\n" 12432 "int oneTwoThree = 123;", 12433 format("int a = 5;\n" 12434 "int one = 1;\n" 12435 "\n" 12436 "int oneTwoThree = 123;", 12437 Alignment)); 12438 EXPECT_EQ("int a = 5;\n" 12439 "int one = 1;\n" 12440 "\n" 12441 "int oneTwoThree = 123;\n" 12442 "int oneTwo = 12;", 12443 format("int a = 5;\n" 12444 "int one = 1;\n" 12445 "\n" 12446 "int oneTwoThree = 123;\n" 12447 "int oneTwo = 12;", 12448 Alignment)); 12449 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12450 verifyFormat("#define A \\\n" 12451 " int aaaa = 12; \\\n" 12452 " int b = 23; \\\n" 12453 " int ccc = 234; \\\n" 12454 " int dddddddddd = 2345;", 12455 Alignment); 12456 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12457 verifyFormat("#define A \\\n" 12458 " int aaaa = 12; \\\n" 12459 " int b = 23; \\\n" 12460 " int ccc = 234; \\\n" 12461 " int dddddddddd = 2345;", 12462 Alignment); 12463 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12464 verifyFormat("#define A " 12465 " \\\n" 12466 " int aaaa = 12; " 12467 " \\\n" 12468 " int b = 23; " 12469 " \\\n" 12470 " int ccc = 234; " 12471 " \\\n" 12472 " int dddddddddd = 2345;", 12473 Alignment); 12474 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12475 "k = 4, int l = 5,\n" 12476 " int m = 6) {\n" 12477 " int j = 10;\n" 12478 " otherThing = 1;\n" 12479 "}", 12480 Alignment); 12481 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12482 " int i = 1;\n" 12483 " int j = 2;\n" 12484 " int big = 10000;\n" 12485 "}", 12486 Alignment); 12487 verifyFormat("class C {\n" 12488 "public:\n" 12489 " int i = 1;\n" 12490 " virtual void f() = 0;\n" 12491 "};", 12492 Alignment); 12493 verifyFormat("int i = 1;\n" 12494 "if (SomeType t = getSomething()) {\n" 12495 "}\n" 12496 "int j = 2;\n" 12497 "int big = 10000;", 12498 Alignment); 12499 verifyFormat("int j = 7;\n" 12500 "for (int k = 0; k < N; ++k) {\n" 12501 "}\n" 12502 "int j = 2;\n" 12503 "int big = 10000;\n" 12504 "}", 12505 Alignment); 12506 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12507 verifyFormat("int i = 1;\n" 12508 "LooooooooooongType loooooooooooooooooooooongVariable\n" 12509 " = someLooooooooooooooooongFunction();\n" 12510 "int j = 2;", 12511 Alignment); 12512 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 12513 verifyFormat("int i = 1;\n" 12514 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 12515 " someLooooooooooooooooongFunction();\n" 12516 "int j = 2;", 12517 Alignment); 12518 12519 verifyFormat("auto lambda = []() {\n" 12520 " auto i = 0;\n" 12521 " return 0;\n" 12522 "};\n" 12523 "int i = 0;\n" 12524 "auto v = type{\n" 12525 " i = 1, //\n" 12526 " (i = 2), //\n" 12527 " i = 3 //\n" 12528 "};", 12529 Alignment); 12530 12531 verifyFormat( 12532 "int i = 1;\n" 12533 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12534 " loooooooooooooooooooooongParameterB);\n" 12535 "int j = 2;", 12536 Alignment); 12537 12538 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 12539 " typename B = very_long_type_name_1,\n" 12540 " typename T_2 = very_long_type_name_2>\n" 12541 "auto foo() {}\n", 12542 Alignment); 12543 verifyFormat("int a, b = 1;\n" 12544 "int c = 2;\n" 12545 "int dd = 3;\n", 12546 Alignment); 12547 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12548 "float b[1][] = {{3.f}};\n", 12549 Alignment); 12550 verifyFormat("for (int i = 0; i < 1; i++)\n" 12551 " int x = 1;\n", 12552 Alignment); 12553 verifyFormat("for (i = 0; i < 1; i++)\n" 12554 " x = 1;\n" 12555 "y = 1;\n", 12556 Alignment); 12557 12558 Alignment.ReflowComments = true; 12559 Alignment.ColumnLimit = 50; 12560 EXPECT_EQ("int x = 0;\n" 12561 "int yy = 1; /// specificlennospace\n" 12562 "int zzz = 2;\n", 12563 format("int x = 0;\n" 12564 "int yy = 1; ///specificlennospace\n" 12565 "int zzz = 2;\n", 12566 Alignment)); 12567 } 12568 12569 TEST_F(FormatTest, AlignConsecutiveBitFields) { 12570 FormatStyle Alignment = getLLVMStyle(); 12571 Alignment.AlignConsecutiveBitFields = true; 12572 verifyFormat("int const a : 5;\n" 12573 "int oneTwoThree : 23;", 12574 Alignment); 12575 12576 // Initializers are allowed starting with c++2a 12577 verifyFormat("int const a : 5 = 1;\n" 12578 "int oneTwoThree : 23 = 0;", 12579 Alignment); 12580 12581 Alignment.AlignConsecutiveDeclarations = true; 12582 verifyFormat("int const a : 5;\n" 12583 "int oneTwoThree : 23;", 12584 Alignment); 12585 12586 verifyFormat("int const a : 5; // comment\n" 12587 "int oneTwoThree : 23; // comment", 12588 Alignment); 12589 12590 verifyFormat("int const a : 5 = 1;\n" 12591 "int oneTwoThree : 23 = 0;", 12592 Alignment); 12593 12594 Alignment.AlignConsecutiveAssignments = true; 12595 verifyFormat("int const a : 5 = 1;\n" 12596 "int oneTwoThree : 23 = 0;", 12597 Alignment); 12598 verifyFormat("int const a : 5 = {1};\n" 12599 "int oneTwoThree : 23 = 0;", 12600 Alignment); 12601 12602 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_None; 12603 verifyFormat("int const a :5;\n" 12604 "int oneTwoThree:23;", 12605 Alignment); 12606 12607 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_Before; 12608 verifyFormat("int const a :5;\n" 12609 "int oneTwoThree :23;", 12610 Alignment); 12611 12612 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_After; 12613 verifyFormat("int const a : 5;\n" 12614 "int oneTwoThree: 23;", 12615 Alignment); 12616 12617 // Known limitations: ':' is only recognized as a bitfield colon when 12618 // followed by a number. 12619 /* 12620 verifyFormat("int oneTwoThree : SOME_CONSTANT;\n" 12621 "int a : 5;", 12622 Alignment); 12623 */ 12624 } 12625 12626 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 12627 FormatStyle Alignment = getLLVMStyle(); 12628 Alignment.AlignConsecutiveMacros = true; 12629 Alignment.AlignConsecutiveDeclarations = false; 12630 verifyFormat("float const a = 5;\n" 12631 "int oneTwoThree = 123;", 12632 Alignment); 12633 verifyFormat("int a = 5;\n" 12634 "float const oneTwoThree = 123;", 12635 Alignment); 12636 12637 Alignment.AlignConsecutiveDeclarations = true; 12638 verifyFormat("float const a = 5;\n" 12639 "int oneTwoThree = 123;", 12640 Alignment); 12641 verifyFormat("int a = method();\n" 12642 "float const oneTwoThree = 133;", 12643 Alignment); 12644 verifyFormat("int i = 1, j = 10;\n" 12645 "something = 2000;", 12646 Alignment); 12647 verifyFormat("something = 2000;\n" 12648 "int i = 1, j = 10;\n", 12649 Alignment); 12650 verifyFormat("float something = 2000;\n" 12651 "double another = 911;\n" 12652 "int i = 1, j = 10;\n" 12653 "const int *oneMore = 1;\n" 12654 "unsigned i = 2;", 12655 Alignment); 12656 verifyFormat("float a = 5;\n" 12657 "int one = 1;\n" 12658 "method();\n" 12659 "const double oneTwoThree = 123;\n" 12660 "const unsigned int oneTwo = 12;", 12661 Alignment); 12662 verifyFormat("int oneTwoThree{0}; // comment\n" 12663 "unsigned oneTwo; // comment", 12664 Alignment); 12665 EXPECT_EQ("float const a = 5;\n" 12666 "\n" 12667 "int oneTwoThree = 123;", 12668 format("float const a = 5;\n" 12669 "\n" 12670 "int oneTwoThree= 123;", 12671 Alignment)); 12672 EXPECT_EQ("float a = 5;\n" 12673 "int one = 1;\n" 12674 "\n" 12675 "unsigned oneTwoThree = 123;", 12676 format("float a = 5;\n" 12677 "int one = 1;\n" 12678 "\n" 12679 "unsigned oneTwoThree = 123;", 12680 Alignment)); 12681 EXPECT_EQ("float a = 5;\n" 12682 "int one = 1;\n" 12683 "\n" 12684 "unsigned oneTwoThree = 123;\n" 12685 "int oneTwo = 12;", 12686 format("float a = 5;\n" 12687 "int one = 1;\n" 12688 "\n" 12689 "unsigned oneTwoThree = 123;\n" 12690 "int oneTwo = 12;", 12691 Alignment)); 12692 // Function prototype alignment 12693 verifyFormat("int a();\n" 12694 "double b();", 12695 Alignment); 12696 verifyFormat("int a(int x);\n" 12697 "double b();", 12698 Alignment); 12699 unsigned OldColumnLimit = Alignment.ColumnLimit; 12700 // We need to set ColumnLimit to zero, in order to stress nested alignments, 12701 // otherwise the function parameters will be re-flowed onto a single line. 12702 Alignment.ColumnLimit = 0; 12703 EXPECT_EQ("int a(int x,\n" 12704 " float y);\n" 12705 "double b(int x,\n" 12706 " double y);", 12707 format("int a(int x,\n" 12708 " float y);\n" 12709 "double b(int x,\n" 12710 " double y);", 12711 Alignment)); 12712 // This ensures that function parameters of function declarations are 12713 // correctly indented when their owning functions are indented. 12714 // The failure case here is for 'double y' to not be indented enough. 12715 EXPECT_EQ("double a(int x);\n" 12716 "int b(int y,\n" 12717 " double z);", 12718 format("double a(int x);\n" 12719 "int b(int y,\n" 12720 " double z);", 12721 Alignment)); 12722 // Set ColumnLimit low so that we induce wrapping immediately after 12723 // the function name and opening paren. 12724 Alignment.ColumnLimit = 13; 12725 verifyFormat("int function(\n" 12726 " int x,\n" 12727 " bool y);", 12728 Alignment); 12729 Alignment.ColumnLimit = OldColumnLimit; 12730 // Ensure function pointers don't screw up recursive alignment 12731 verifyFormat("int a(int x, void (*fp)(int y));\n" 12732 "double b();", 12733 Alignment); 12734 Alignment.AlignConsecutiveAssignments = true; 12735 // Ensure recursive alignment is broken by function braces, so that the 12736 // "a = 1" does not align with subsequent assignments inside the function 12737 // body. 12738 verifyFormat("int func(int a = 1) {\n" 12739 " int b = 2;\n" 12740 " int cc = 3;\n" 12741 "}", 12742 Alignment); 12743 verifyFormat("float something = 2000;\n" 12744 "double another = 911;\n" 12745 "int i = 1, j = 10;\n" 12746 "const int *oneMore = 1;\n" 12747 "unsigned i = 2;", 12748 Alignment); 12749 verifyFormat("int oneTwoThree = {0}; // comment\n" 12750 "unsigned oneTwo = 0; // comment", 12751 Alignment); 12752 // Make sure that scope is correctly tracked, in the absence of braces 12753 verifyFormat("for (int i = 0; i < n; i++)\n" 12754 " j = i;\n" 12755 "double x = 1;\n", 12756 Alignment); 12757 verifyFormat("if (int i = 0)\n" 12758 " j = i;\n" 12759 "double x = 1;\n", 12760 Alignment); 12761 // Ensure operator[] and operator() are comprehended 12762 verifyFormat("struct test {\n" 12763 " long long int foo();\n" 12764 " int operator[](int a);\n" 12765 " double bar();\n" 12766 "};\n", 12767 Alignment); 12768 verifyFormat("struct test {\n" 12769 " long long int foo();\n" 12770 " int operator()(int a);\n" 12771 " double bar();\n" 12772 "};\n", 12773 Alignment); 12774 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 12775 " int const i = 1;\n" 12776 " int * j = 2;\n" 12777 " int big = 10000;\n" 12778 "\n" 12779 " unsigned oneTwoThree = 123;\n" 12780 " int oneTwo = 12;\n" 12781 " method();\n" 12782 " float k = 2;\n" 12783 " int ll = 10000;\n" 12784 "}", 12785 format("void SomeFunction(int parameter= 0) {\n" 12786 " int const i= 1;\n" 12787 " int *j=2;\n" 12788 " int big = 10000;\n" 12789 "\n" 12790 "unsigned oneTwoThree =123;\n" 12791 "int oneTwo = 12;\n" 12792 " method();\n" 12793 "float k= 2;\n" 12794 "int ll=10000;\n" 12795 "}", 12796 Alignment)); 12797 Alignment.AlignConsecutiveAssignments = false; 12798 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12799 verifyFormat("#define A \\\n" 12800 " int aaaa = 12; \\\n" 12801 " float b = 23; \\\n" 12802 " const int ccc = 234; \\\n" 12803 " unsigned dddddddddd = 2345;", 12804 Alignment); 12805 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12806 verifyFormat("#define A \\\n" 12807 " int aaaa = 12; \\\n" 12808 " float b = 23; \\\n" 12809 " const int ccc = 234; \\\n" 12810 " unsigned dddddddddd = 2345;", 12811 Alignment); 12812 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12813 Alignment.ColumnLimit = 30; 12814 verifyFormat("#define A \\\n" 12815 " int aaaa = 12; \\\n" 12816 " float b = 23; \\\n" 12817 " const int ccc = 234; \\\n" 12818 " int dddddddddd = 2345;", 12819 Alignment); 12820 Alignment.ColumnLimit = 80; 12821 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12822 "k = 4, int l = 5,\n" 12823 " int m = 6) {\n" 12824 " const int j = 10;\n" 12825 " otherThing = 1;\n" 12826 "}", 12827 Alignment); 12828 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12829 " int const i = 1;\n" 12830 " int * j = 2;\n" 12831 " int big = 10000;\n" 12832 "}", 12833 Alignment); 12834 verifyFormat("class C {\n" 12835 "public:\n" 12836 " int i = 1;\n" 12837 " virtual void f() = 0;\n" 12838 "};", 12839 Alignment); 12840 verifyFormat("float i = 1;\n" 12841 "if (SomeType t = getSomething()) {\n" 12842 "}\n" 12843 "const unsigned j = 2;\n" 12844 "int big = 10000;", 12845 Alignment); 12846 verifyFormat("float j = 7;\n" 12847 "for (int k = 0; k < N; ++k) {\n" 12848 "}\n" 12849 "unsigned j = 2;\n" 12850 "int big = 10000;\n" 12851 "}", 12852 Alignment); 12853 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12854 verifyFormat("float i = 1;\n" 12855 "LooooooooooongType loooooooooooooooooooooongVariable\n" 12856 " = someLooooooooooooooooongFunction();\n" 12857 "int j = 2;", 12858 Alignment); 12859 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 12860 verifyFormat("int i = 1;\n" 12861 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 12862 " someLooooooooooooooooongFunction();\n" 12863 "int j = 2;", 12864 Alignment); 12865 12866 Alignment.AlignConsecutiveAssignments = true; 12867 verifyFormat("auto lambda = []() {\n" 12868 " auto ii = 0;\n" 12869 " float j = 0;\n" 12870 " return 0;\n" 12871 "};\n" 12872 "int i = 0;\n" 12873 "float i2 = 0;\n" 12874 "auto v = type{\n" 12875 " i = 1, //\n" 12876 " (i = 2), //\n" 12877 " i = 3 //\n" 12878 "};", 12879 Alignment); 12880 Alignment.AlignConsecutiveAssignments = false; 12881 12882 verifyFormat( 12883 "int i = 1;\n" 12884 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12885 " loooooooooooooooooooooongParameterB);\n" 12886 "int j = 2;", 12887 Alignment); 12888 12889 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 12890 // We expect declarations and assignments to align, as long as it doesn't 12891 // exceed the column limit, starting a new alignment sequence whenever it 12892 // happens. 12893 Alignment.AlignConsecutiveAssignments = true; 12894 Alignment.ColumnLimit = 30; 12895 verifyFormat("float ii = 1;\n" 12896 "unsigned j = 2;\n" 12897 "int someVerylongVariable = 1;\n" 12898 "AnotherLongType ll = 123456;\n" 12899 "VeryVeryLongType k = 2;\n" 12900 "int myvar = 1;", 12901 Alignment); 12902 Alignment.ColumnLimit = 80; 12903 Alignment.AlignConsecutiveAssignments = false; 12904 12905 verifyFormat( 12906 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 12907 " typename LongType, typename B>\n" 12908 "auto foo() {}\n", 12909 Alignment); 12910 verifyFormat("float a, b = 1;\n" 12911 "int c = 2;\n" 12912 "int dd = 3;\n", 12913 Alignment); 12914 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12915 "float b[1][] = {{3.f}};\n", 12916 Alignment); 12917 Alignment.AlignConsecutiveAssignments = true; 12918 verifyFormat("float a, b = 1;\n" 12919 "int c = 2;\n" 12920 "int dd = 3;\n", 12921 Alignment); 12922 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12923 "float b[1][] = {{3.f}};\n", 12924 Alignment); 12925 Alignment.AlignConsecutiveAssignments = false; 12926 12927 Alignment.ColumnLimit = 30; 12928 Alignment.BinPackParameters = false; 12929 verifyFormat("void foo(float a,\n" 12930 " float b,\n" 12931 " int c,\n" 12932 " uint32_t *d) {\n" 12933 " int * e = 0;\n" 12934 " float f = 0;\n" 12935 " double g = 0;\n" 12936 "}\n" 12937 "void bar(ino_t a,\n" 12938 " int b,\n" 12939 " uint32_t *c,\n" 12940 " bool d) {}\n", 12941 Alignment); 12942 Alignment.BinPackParameters = true; 12943 Alignment.ColumnLimit = 80; 12944 12945 // Bug 33507 12946 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 12947 verifyFormat( 12948 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 12949 " static const Version verVs2017;\n" 12950 " return true;\n" 12951 "});\n", 12952 Alignment); 12953 Alignment.PointerAlignment = FormatStyle::PAS_Right; 12954 12955 // See llvm.org/PR35641 12956 Alignment.AlignConsecutiveDeclarations = true; 12957 verifyFormat("int func() { //\n" 12958 " int b;\n" 12959 " unsigned c;\n" 12960 "}", 12961 Alignment); 12962 12963 // See PR37175 12964 FormatStyle Style = getMozillaStyle(); 12965 Style.AlignConsecutiveDeclarations = true; 12966 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 12967 "foo(int a);", 12968 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 12969 } 12970 12971 TEST_F(FormatTest, LinuxBraceBreaking) { 12972 FormatStyle LinuxBraceStyle = getLLVMStyle(); 12973 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 12974 verifyFormat("namespace a\n" 12975 "{\n" 12976 "class A\n" 12977 "{\n" 12978 " void f()\n" 12979 " {\n" 12980 " if (true) {\n" 12981 " a();\n" 12982 " b();\n" 12983 " } else {\n" 12984 " a();\n" 12985 " }\n" 12986 " }\n" 12987 " void g() { return; }\n" 12988 "};\n" 12989 "struct B {\n" 12990 " int x;\n" 12991 "};\n" 12992 "} // namespace a\n", 12993 LinuxBraceStyle); 12994 verifyFormat("enum X {\n" 12995 " Y = 0,\n" 12996 "}\n", 12997 LinuxBraceStyle); 12998 verifyFormat("struct S {\n" 12999 " int Type;\n" 13000 " union {\n" 13001 " int x;\n" 13002 " double y;\n" 13003 " } Value;\n" 13004 " class C\n" 13005 " {\n" 13006 " MyFavoriteType Value;\n" 13007 " } Class;\n" 13008 "}\n", 13009 LinuxBraceStyle); 13010 } 13011 13012 TEST_F(FormatTest, MozillaBraceBreaking) { 13013 FormatStyle MozillaBraceStyle = getLLVMStyle(); 13014 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 13015 MozillaBraceStyle.FixNamespaceComments = false; 13016 verifyFormat("namespace a {\n" 13017 "class A\n" 13018 "{\n" 13019 " void f()\n" 13020 " {\n" 13021 " if (true) {\n" 13022 " a();\n" 13023 " b();\n" 13024 " }\n" 13025 " }\n" 13026 " void g() { return; }\n" 13027 "};\n" 13028 "enum E\n" 13029 "{\n" 13030 " A,\n" 13031 " // foo\n" 13032 " B,\n" 13033 " C\n" 13034 "};\n" 13035 "struct B\n" 13036 "{\n" 13037 " int x;\n" 13038 "};\n" 13039 "}\n", 13040 MozillaBraceStyle); 13041 verifyFormat("struct S\n" 13042 "{\n" 13043 " int Type;\n" 13044 " union\n" 13045 " {\n" 13046 " int x;\n" 13047 " double y;\n" 13048 " } Value;\n" 13049 " class C\n" 13050 " {\n" 13051 " MyFavoriteType Value;\n" 13052 " } Class;\n" 13053 "}\n", 13054 MozillaBraceStyle); 13055 } 13056 13057 TEST_F(FormatTest, StroustrupBraceBreaking) { 13058 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 13059 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 13060 verifyFormat("namespace a {\n" 13061 "class A {\n" 13062 " void f()\n" 13063 " {\n" 13064 " if (true) {\n" 13065 " a();\n" 13066 " b();\n" 13067 " }\n" 13068 " }\n" 13069 " void g() { return; }\n" 13070 "};\n" 13071 "struct B {\n" 13072 " int x;\n" 13073 "};\n" 13074 "} // namespace a\n", 13075 StroustrupBraceStyle); 13076 13077 verifyFormat("void foo()\n" 13078 "{\n" 13079 " if (a) {\n" 13080 " a();\n" 13081 " }\n" 13082 " else {\n" 13083 " b();\n" 13084 " }\n" 13085 "}\n", 13086 StroustrupBraceStyle); 13087 13088 verifyFormat("#ifdef _DEBUG\n" 13089 "int foo(int i = 0)\n" 13090 "#else\n" 13091 "int foo(int i = 5)\n" 13092 "#endif\n" 13093 "{\n" 13094 " return i;\n" 13095 "}", 13096 StroustrupBraceStyle); 13097 13098 verifyFormat("void foo() {}\n" 13099 "void bar()\n" 13100 "#ifdef _DEBUG\n" 13101 "{\n" 13102 " foo();\n" 13103 "}\n" 13104 "#else\n" 13105 "{\n" 13106 "}\n" 13107 "#endif", 13108 StroustrupBraceStyle); 13109 13110 verifyFormat("void foobar() { int i = 5; }\n" 13111 "#ifdef _DEBUG\n" 13112 "void bar() {}\n" 13113 "#else\n" 13114 "void bar() { foobar(); }\n" 13115 "#endif", 13116 StroustrupBraceStyle); 13117 } 13118 13119 TEST_F(FormatTest, AllmanBraceBreaking) { 13120 FormatStyle AllmanBraceStyle = getLLVMStyle(); 13121 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 13122 13123 EXPECT_EQ("namespace a\n" 13124 "{\n" 13125 "void f();\n" 13126 "void g();\n" 13127 "} // namespace a\n", 13128 format("namespace a\n" 13129 "{\n" 13130 "void f();\n" 13131 "void g();\n" 13132 "}\n", 13133 AllmanBraceStyle)); 13134 13135 verifyFormat("namespace a\n" 13136 "{\n" 13137 "class A\n" 13138 "{\n" 13139 " void f()\n" 13140 " {\n" 13141 " if (true)\n" 13142 " {\n" 13143 " a();\n" 13144 " b();\n" 13145 " }\n" 13146 " }\n" 13147 " void g() { return; }\n" 13148 "};\n" 13149 "struct B\n" 13150 "{\n" 13151 " int x;\n" 13152 "};\n" 13153 "union C\n" 13154 "{\n" 13155 "};\n" 13156 "} // namespace a", 13157 AllmanBraceStyle); 13158 13159 verifyFormat("void f()\n" 13160 "{\n" 13161 " if (true)\n" 13162 " {\n" 13163 " a();\n" 13164 " }\n" 13165 " else if (false)\n" 13166 " {\n" 13167 " b();\n" 13168 " }\n" 13169 " else\n" 13170 " {\n" 13171 " c();\n" 13172 " }\n" 13173 "}\n", 13174 AllmanBraceStyle); 13175 13176 verifyFormat("void f()\n" 13177 "{\n" 13178 " for (int i = 0; i < 10; ++i)\n" 13179 " {\n" 13180 " a();\n" 13181 " }\n" 13182 " while (false)\n" 13183 " {\n" 13184 " b();\n" 13185 " }\n" 13186 " do\n" 13187 " {\n" 13188 " c();\n" 13189 " } while (false)\n" 13190 "}\n", 13191 AllmanBraceStyle); 13192 13193 verifyFormat("void f(int a)\n" 13194 "{\n" 13195 " switch (a)\n" 13196 " {\n" 13197 " case 0:\n" 13198 " break;\n" 13199 " case 1:\n" 13200 " {\n" 13201 " break;\n" 13202 " }\n" 13203 " case 2:\n" 13204 " {\n" 13205 " }\n" 13206 " break;\n" 13207 " default:\n" 13208 " break;\n" 13209 " }\n" 13210 "}\n", 13211 AllmanBraceStyle); 13212 13213 verifyFormat("enum X\n" 13214 "{\n" 13215 " Y = 0,\n" 13216 "}\n", 13217 AllmanBraceStyle); 13218 verifyFormat("enum X\n" 13219 "{\n" 13220 " Y = 0\n" 13221 "}\n", 13222 AllmanBraceStyle); 13223 13224 verifyFormat("@interface BSApplicationController ()\n" 13225 "{\n" 13226 "@private\n" 13227 " id _extraIvar;\n" 13228 "}\n" 13229 "@end\n", 13230 AllmanBraceStyle); 13231 13232 verifyFormat("#ifdef _DEBUG\n" 13233 "int foo(int i = 0)\n" 13234 "#else\n" 13235 "int foo(int i = 5)\n" 13236 "#endif\n" 13237 "{\n" 13238 " return i;\n" 13239 "}", 13240 AllmanBraceStyle); 13241 13242 verifyFormat("void foo() {}\n" 13243 "void bar()\n" 13244 "#ifdef _DEBUG\n" 13245 "{\n" 13246 " foo();\n" 13247 "}\n" 13248 "#else\n" 13249 "{\n" 13250 "}\n" 13251 "#endif", 13252 AllmanBraceStyle); 13253 13254 verifyFormat("void foobar() { int i = 5; }\n" 13255 "#ifdef _DEBUG\n" 13256 "void bar() {}\n" 13257 "#else\n" 13258 "void bar() { foobar(); }\n" 13259 "#endif", 13260 AllmanBraceStyle); 13261 13262 // This shouldn't affect ObjC blocks.. 13263 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 13264 " // ...\n" 13265 " int i;\n" 13266 "}];", 13267 AllmanBraceStyle); 13268 verifyFormat("void (^block)(void) = ^{\n" 13269 " // ...\n" 13270 " int i;\n" 13271 "};", 13272 AllmanBraceStyle); 13273 // .. or dict literals. 13274 verifyFormat("void f()\n" 13275 "{\n" 13276 " // ...\n" 13277 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 13278 "}", 13279 AllmanBraceStyle); 13280 verifyFormat("void f()\n" 13281 "{\n" 13282 " // ...\n" 13283 " [object someMethod:@{a : @\"b\"}];\n" 13284 "}", 13285 AllmanBraceStyle); 13286 verifyFormat("int f()\n" 13287 "{ // comment\n" 13288 " return 42;\n" 13289 "}", 13290 AllmanBraceStyle); 13291 13292 AllmanBraceStyle.ColumnLimit = 19; 13293 verifyFormat("void f() { int i; }", AllmanBraceStyle); 13294 AllmanBraceStyle.ColumnLimit = 18; 13295 verifyFormat("void f()\n" 13296 "{\n" 13297 " int i;\n" 13298 "}", 13299 AllmanBraceStyle); 13300 AllmanBraceStyle.ColumnLimit = 80; 13301 13302 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 13303 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 13304 FormatStyle::SIS_WithoutElse; 13305 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 13306 verifyFormat("void f(bool b)\n" 13307 "{\n" 13308 " if (b)\n" 13309 " {\n" 13310 " return;\n" 13311 " }\n" 13312 "}\n", 13313 BreakBeforeBraceShortIfs); 13314 verifyFormat("void f(bool b)\n" 13315 "{\n" 13316 " if constexpr (b)\n" 13317 " {\n" 13318 " return;\n" 13319 " }\n" 13320 "}\n", 13321 BreakBeforeBraceShortIfs); 13322 verifyFormat("void f(bool b)\n" 13323 "{\n" 13324 " if CONSTEXPR (b)\n" 13325 " {\n" 13326 " return;\n" 13327 " }\n" 13328 "}\n", 13329 BreakBeforeBraceShortIfs); 13330 verifyFormat("void f(bool b)\n" 13331 "{\n" 13332 " if (b) return;\n" 13333 "}\n", 13334 BreakBeforeBraceShortIfs); 13335 verifyFormat("void f(bool b)\n" 13336 "{\n" 13337 " if constexpr (b) return;\n" 13338 "}\n", 13339 BreakBeforeBraceShortIfs); 13340 verifyFormat("void f(bool b)\n" 13341 "{\n" 13342 " if CONSTEXPR (b) return;\n" 13343 "}\n", 13344 BreakBeforeBraceShortIfs); 13345 verifyFormat("void f(bool b)\n" 13346 "{\n" 13347 " while (b)\n" 13348 " {\n" 13349 " return;\n" 13350 " }\n" 13351 "}\n", 13352 BreakBeforeBraceShortIfs); 13353 } 13354 13355 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 13356 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 13357 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 13358 13359 // Make a few changes to the style for testing purposes 13360 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 13361 FormatStyle::SFS_Empty; 13362 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13363 WhitesmithsBraceStyle.ColumnLimit = 0; 13364 13365 // FIXME: this test case can't decide whether there should be a blank line 13366 // after the ~D() line or not. It adds one if one doesn't exist in the test 13367 // and it removes the line if one exists. 13368 /* 13369 verifyFormat("class A;\n" 13370 "namespace B\n" 13371 " {\n" 13372 "class C;\n" 13373 "// Comment\n" 13374 "class D\n" 13375 " {\n" 13376 "public:\n" 13377 " D();\n" 13378 " ~D() {}\n" 13379 "private:\n" 13380 " enum E\n" 13381 " {\n" 13382 " F\n" 13383 " }\n" 13384 " };\n" 13385 " } // namespace B\n", 13386 WhitesmithsBraceStyle); 13387 */ 13388 13389 verifyFormat("namespace a\n" 13390 " {\n" 13391 "class A\n" 13392 " {\n" 13393 " void f()\n" 13394 " {\n" 13395 " if (true)\n" 13396 " {\n" 13397 " a();\n" 13398 " b();\n" 13399 " }\n" 13400 " }\n" 13401 " void g()\n" 13402 " {\n" 13403 " return;\n" 13404 " }\n" 13405 " };\n" 13406 "struct B\n" 13407 " {\n" 13408 " int x;\n" 13409 " };\n" 13410 " } // namespace a", 13411 WhitesmithsBraceStyle); 13412 13413 verifyFormat("void f()\n" 13414 " {\n" 13415 " if (true)\n" 13416 " {\n" 13417 " a();\n" 13418 " }\n" 13419 " else if (false)\n" 13420 " {\n" 13421 " b();\n" 13422 " }\n" 13423 " else\n" 13424 " {\n" 13425 " c();\n" 13426 " }\n" 13427 " }\n", 13428 WhitesmithsBraceStyle); 13429 13430 verifyFormat("void f()\n" 13431 " {\n" 13432 " for (int i = 0; i < 10; ++i)\n" 13433 " {\n" 13434 " a();\n" 13435 " }\n" 13436 " while (false)\n" 13437 " {\n" 13438 " b();\n" 13439 " }\n" 13440 " do\n" 13441 " {\n" 13442 " c();\n" 13443 " } while (false)\n" 13444 " }\n", 13445 WhitesmithsBraceStyle); 13446 13447 WhitesmithsBraceStyle.IndentCaseBlocks = true; 13448 verifyFormat("void switchTest1(int a)\n" 13449 " {\n" 13450 " switch (a)\n" 13451 " {\n" 13452 " case 2:\n" 13453 " {\n" 13454 " }\n" 13455 " break;\n" 13456 " }\n" 13457 " }\n", 13458 WhitesmithsBraceStyle); 13459 13460 verifyFormat("void switchTest2(int a)\n" 13461 " {\n" 13462 " switch (a)\n" 13463 " {\n" 13464 " case 0:\n" 13465 " break;\n" 13466 " case 1:\n" 13467 " {\n" 13468 " break;\n" 13469 " }\n" 13470 " case 2:\n" 13471 " {\n" 13472 " }\n" 13473 " break;\n" 13474 " default:\n" 13475 " break;\n" 13476 " }\n" 13477 " }\n", 13478 WhitesmithsBraceStyle); 13479 13480 verifyFormat("void switchTest3(int a)\n" 13481 " {\n" 13482 " switch (a)\n" 13483 " {\n" 13484 " case 0:\n" 13485 " {\n" 13486 " foo(x);\n" 13487 " }\n" 13488 " break;\n" 13489 " default:\n" 13490 " {\n" 13491 " foo(1);\n" 13492 " }\n" 13493 " break;\n" 13494 " }\n" 13495 " }\n", 13496 WhitesmithsBraceStyle); 13497 13498 WhitesmithsBraceStyle.IndentCaseBlocks = false; 13499 13500 verifyFormat("void switchTest4(int a)\n" 13501 " {\n" 13502 " switch (a)\n" 13503 " {\n" 13504 " case 2:\n" 13505 " {\n" 13506 " }\n" 13507 " break;\n" 13508 " }\n" 13509 " }\n", 13510 WhitesmithsBraceStyle); 13511 13512 verifyFormat("void switchTest5(int a)\n" 13513 " {\n" 13514 " switch (a)\n" 13515 " {\n" 13516 " case 0:\n" 13517 " break;\n" 13518 " case 1:\n" 13519 " {\n" 13520 " foo();\n" 13521 " break;\n" 13522 " }\n" 13523 " case 2:\n" 13524 " {\n" 13525 " }\n" 13526 " break;\n" 13527 " default:\n" 13528 " break;\n" 13529 " }\n" 13530 " }\n", 13531 WhitesmithsBraceStyle); 13532 13533 verifyFormat("void switchTest6(int a)\n" 13534 " {\n" 13535 " switch (a)\n" 13536 " {\n" 13537 " case 0:\n" 13538 " {\n" 13539 " foo(x);\n" 13540 " }\n" 13541 " break;\n" 13542 " default:\n" 13543 " {\n" 13544 " foo(1);\n" 13545 " }\n" 13546 " break;\n" 13547 " }\n" 13548 " }\n", 13549 WhitesmithsBraceStyle); 13550 13551 verifyFormat("enum X\n" 13552 " {\n" 13553 " Y = 0, // testing\n" 13554 " }\n", 13555 WhitesmithsBraceStyle); 13556 13557 verifyFormat("enum X\n" 13558 " {\n" 13559 " Y = 0\n" 13560 " }\n", 13561 WhitesmithsBraceStyle); 13562 verifyFormat("enum X\n" 13563 " {\n" 13564 " Y = 0,\n" 13565 " Z = 1\n" 13566 " };\n", 13567 WhitesmithsBraceStyle); 13568 13569 verifyFormat("@interface BSApplicationController ()\n" 13570 " {\n" 13571 "@private\n" 13572 " id _extraIvar;\n" 13573 " }\n" 13574 "@end\n", 13575 WhitesmithsBraceStyle); 13576 13577 verifyFormat("#ifdef _DEBUG\n" 13578 "int foo(int i = 0)\n" 13579 "#else\n" 13580 "int foo(int i = 5)\n" 13581 "#endif\n" 13582 " {\n" 13583 " return i;\n" 13584 " }", 13585 WhitesmithsBraceStyle); 13586 13587 verifyFormat("void foo() {}\n" 13588 "void bar()\n" 13589 "#ifdef _DEBUG\n" 13590 " {\n" 13591 " foo();\n" 13592 " }\n" 13593 "#else\n" 13594 " {\n" 13595 " }\n" 13596 "#endif", 13597 WhitesmithsBraceStyle); 13598 13599 verifyFormat("void foobar()\n" 13600 " {\n" 13601 " int i = 5;\n" 13602 " }\n" 13603 "#ifdef _DEBUG\n" 13604 "void bar()\n" 13605 " {\n" 13606 " }\n" 13607 "#else\n" 13608 "void bar()\n" 13609 " {\n" 13610 " foobar();\n" 13611 " }\n" 13612 "#endif", 13613 WhitesmithsBraceStyle); 13614 13615 // This shouldn't affect ObjC blocks.. 13616 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 13617 " // ...\n" 13618 " int i;\n" 13619 "}];", 13620 WhitesmithsBraceStyle); 13621 verifyFormat("void (^block)(void) = ^{\n" 13622 " // ...\n" 13623 " int i;\n" 13624 "};", 13625 WhitesmithsBraceStyle); 13626 // .. or dict literals. 13627 verifyFormat("void f()\n" 13628 " {\n" 13629 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 13630 " }", 13631 WhitesmithsBraceStyle); 13632 13633 verifyFormat("int f()\n" 13634 " { // comment\n" 13635 " return 42;\n" 13636 " }", 13637 WhitesmithsBraceStyle); 13638 13639 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 13640 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 13641 FormatStyle::SIS_Always; 13642 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 13643 verifyFormat("void f(bool b)\n" 13644 " {\n" 13645 " if (b)\n" 13646 " {\n" 13647 " return;\n" 13648 " }\n" 13649 " }\n", 13650 BreakBeforeBraceShortIfs); 13651 verifyFormat("void f(bool b)\n" 13652 " {\n" 13653 " if (b) return;\n" 13654 " }\n", 13655 BreakBeforeBraceShortIfs); 13656 verifyFormat("void f(bool b)\n" 13657 " {\n" 13658 " while (b)\n" 13659 " {\n" 13660 " return;\n" 13661 " }\n" 13662 " }\n", 13663 BreakBeforeBraceShortIfs); 13664 } 13665 13666 TEST_F(FormatTest, GNUBraceBreaking) { 13667 FormatStyle GNUBraceStyle = getLLVMStyle(); 13668 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 13669 verifyFormat("namespace a\n" 13670 "{\n" 13671 "class A\n" 13672 "{\n" 13673 " void f()\n" 13674 " {\n" 13675 " int a;\n" 13676 " {\n" 13677 " int b;\n" 13678 " }\n" 13679 " if (true)\n" 13680 " {\n" 13681 " a();\n" 13682 " b();\n" 13683 " }\n" 13684 " }\n" 13685 " void g() { return; }\n" 13686 "}\n" 13687 "} // namespace a", 13688 GNUBraceStyle); 13689 13690 verifyFormat("void f()\n" 13691 "{\n" 13692 " if (true)\n" 13693 " {\n" 13694 " a();\n" 13695 " }\n" 13696 " else if (false)\n" 13697 " {\n" 13698 " b();\n" 13699 " }\n" 13700 " else\n" 13701 " {\n" 13702 " c();\n" 13703 " }\n" 13704 "}\n", 13705 GNUBraceStyle); 13706 13707 verifyFormat("void f()\n" 13708 "{\n" 13709 " for (int i = 0; i < 10; ++i)\n" 13710 " {\n" 13711 " a();\n" 13712 " }\n" 13713 " while (false)\n" 13714 " {\n" 13715 " b();\n" 13716 " }\n" 13717 " do\n" 13718 " {\n" 13719 " c();\n" 13720 " }\n" 13721 " while (false);\n" 13722 "}\n", 13723 GNUBraceStyle); 13724 13725 verifyFormat("void f(int a)\n" 13726 "{\n" 13727 " switch (a)\n" 13728 " {\n" 13729 " case 0:\n" 13730 " break;\n" 13731 " case 1:\n" 13732 " {\n" 13733 " break;\n" 13734 " }\n" 13735 " case 2:\n" 13736 " {\n" 13737 " }\n" 13738 " break;\n" 13739 " default:\n" 13740 " break;\n" 13741 " }\n" 13742 "}\n", 13743 GNUBraceStyle); 13744 13745 verifyFormat("enum X\n" 13746 "{\n" 13747 " Y = 0,\n" 13748 "}\n", 13749 GNUBraceStyle); 13750 13751 verifyFormat("@interface BSApplicationController ()\n" 13752 "{\n" 13753 "@private\n" 13754 " id _extraIvar;\n" 13755 "}\n" 13756 "@end\n", 13757 GNUBraceStyle); 13758 13759 verifyFormat("#ifdef _DEBUG\n" 13760 "int foo(int i = 0)\n" 13761 "#else\n" 13762 "int foo(int i = 5)\n" 13763 "#endif\n" 13764 "{\n" 13765 " return i;\n" 13766 "}", 13767 GNUBraceStyle); 13768 13769 verifyFormat("void foo() {}\n" 13770 "void bar()\n" 13771 "#ifdef _DEBUG\n" 13772 "{\n" 13773 " foo();\n" 13774 "}\n" 13775 "#else\n" 13776 "{\n" 13777 "}\n" 13778 "#endif", 13779 GNUBraceStyle); 13780 13781 verifyFormat("void foobar() { int i = 5; }\n" 13782 "#ifdef _DEBUG\n" 13783 "void bar() {}\n" 13784 "#else\n" 13785 "void bar() { foobar(); }\n" 13786 "#endif", 13787 GNUBraceStyle); 13788 } 13789 13790 TEST_F(FormatTest, WebKitBraceBreaking) { 13791 FormatStyle WebKitBraceStyle = getLLVMStyle(); 13792 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 13793 WebKitBraceStyle.FixNamespaceComments = false; 13794 verifyFormat("namespace a {\n" 13795 "class A {\n" 13796 " void f()\n" 13797 " {\n" 13798 " if (true) {\n" 13799 " a();\n" 13800 " b();\n" 13801 " }\n" 13802 " }\n" 13803 " void g() { return; }\n" 13804 "};\n" 13805 "enum E {\n" 13806 " A,\n" 13807 " // foo\n" 13808 " B,\n" 13809 " C\n" 13810 "};\n" 13811 "struct B {\n" 13812 " int x;\n" 13813 "};\n" 13814 "}\n", 13815 WebKitBraceStyle); 13816 verifyFormat("struct S {\n" 13817 " int Type;\n" 13818 " union {\n" 13819 " int x;\n" 13820 " double y;\n" 13821 " } Value;\n" 13822 " class C {\n" 13823 " MyFavoriteType Value;\n" 13824 " } Class;\n" 13825 "};\n", 13826 WebKitBraceStyle); 13827 } 13828 13829 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 13830 verifyFormat("void f() {\n" 13831 " try {\n" 13832 " } catch (const Exception &e) {\n" 13833 " }\n" 13834 "}\n", 13835 getLLVMStyle()); 13836 } 13837 13838 TEST_F(FormatTest, UnderstandsPragmas) { 13839 verifyFormat("#pragma omp reduction(| : var)"); 13840 verifyFormat("#pragma omp reduction(+ : var)"); 13841 13842 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 13843 "(including parentheses).", 13844 format("#pragma mark Any non-hyphenated or hyphenated string " 13845 "(including parentheses).")); 13846 } 13847 13848 TEST_F(FormatTest, UnderstandPragmaOption) { 13849 verifyFormat("#pragma option -C -A"); 13850 13851 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 13852 } 13853 13854 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 13855 FormatStyle Style = getLLVMStyle(); 13856 Style.ColumnLimit = 20; 13857 13858 // See PR41213 13859 EXPECT_EQ("/*\n" 13860 " *\t9012345\n" 13861 " * /8901\n" 13862 " */", 13863 format("/*\n" 13864 " *\t9012345 /8901\n" 13865 " */", 13866 Style)); 13867 EXPECT_EQ("/*\n" 13868 " *345678\n" 13869 " *\t/8901\n" 13870 " */", 13871 format("/*\n" 13872 " *345678\t/8901\n" 13873 " */", 13874 Style)); 13875 13876 verifyFormat("int a; // the\n" 13877 " // comment", 13878 Style); 13879 EXPECT_EQ("int a; /* first line\n" 13880 " * second\n" 13881 " * line third\n" 13882 " * line\n" 13883 " */", 13884 format("int a; /* first line\n" 13885 " * second\n" 13886 " * line third\n" 13887 " * line\n" 13888 " */", 13889 Style)); 13890 EXPECT_EQ("int a; // first line\n" 13891 " // second\n" 13892 " // line third\n" 13893 " // line", 13894 format("int a; // first line\n" 13895 " // second line\n" 13896 " // third line", 13897 Style)); 13898 13899 Style.PenaltyExcessCharacter = 90; 13900 verifyFormat("int a; // the comment", Style); 13901 EXPECT_EQ("int a; // the comment\n" 13902 " // aaa", 13903 format("int a; // the comment aaa", Style)); 13904 EXPECT_EQ("int a; /* first line\n" 13905 " * second line\n" 13906 " * third line\n" 13907 " */", 13908 format("int a; /* first line\n" 13909 " * second line\n" 13910 " * third line\n" 13911 " */", 13912 Style)); 13913 EXPECT_EQ("int a; // first line\n" 13914 " // second line\n" 13915 " // third line", 13916 format("int a; // first line\n" 13917 " // second line\n" 13918 " // third line", 13919 Style)); 13920 // FIXME: Investigate why this is not getting the same layout as the test 13921 // above. 13922 EXPECT_EQ("int a; /* first line\n" 13923 " * second line\n" 13924 " * third line\n" 13925 " */", 13926 format("int a; /* first line second line third line" 13927 "\n*/", 13928 Style)); 13929 13930 EXPECT_EQ("// foo bar baz bazfoo\n" 13931 "// foo bar foo bar\n", 13932 format("// foo bar baz bazfoo\n" 13933 "// foo bar foo bar\n", 13934 Style)); 13935 EXPECT_EQ("// foo bar baz bazfoo\n" 13936 "// foo bar foo bar\n", 13937 format("// foo bar baz bazfoo\n" 13938 "// foo bar foo bar\n", 13939 Style)); 13940 13941 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 13942 // next one. 13943 EXPECT_EQ("// foo bar baz bazfoo\n" 13944 "// bar foo bar\n", 13945 format("// foo bar baz bazfoo bar\n" 13946 "// foo bar\n", 13947 Style)); 13948 13949 EXPECT_EQ("// foo bar baz bazfoo\n" 13950 "// foo bar baz bazfoo\n" 13951 "// bar foo bar\n", 13952 format("// foo bar baz bazfoo\n" 13953 "// foo bar baz bazfoo bar\n" 13954 "// foo bar\n", 13955 Style)); 13956 13957 EXPECT_EQ("// foo bar baz bazfoo\n" 13958 "// foo bar baz bazfoo\n" 13959 "// bar foo bar\n", 13960 format("// foo bar baz bazfoo\n" 13961 "// foo bar baz bazfoo bar\n" 13962 "// foo bar\n", 13963 Style)); 13964 13965 // Make sure we do not keep protruding characters if strict mode reflow is 13966 // cheaper than keeping protruding characters. 13967 Style.ColumnLimit = 21; 13968 EXPECT_EQ( 13969 "// foo foo foo foo\n" 13970 "// foo foo foo foo\n" 13971 "// foo foo foo foo\n", 13972 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 13973 13974 EXPECT_EQ("int a = /* long block\n" 13975 " comment */\n" 13976 " 42;", 13977 format("int a = /* long block comment */ 42;", Style)); 13978 } 13979 13980 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 13981 for (size_t i = 1; i < Styles.size(); ++i) \ 13982 EXPECT_EQ(Styles[0], Styles[i]) \ 13983 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 13984 13985 TEST_F(FormatTest, GetsPredefinedStyleByName) { 13986 SmallVector<FormatStyle, 3> Styles; 13987 Styles.resize(3); 13988 13989 Styles[0] = getLLVMStyle(); 13990 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 13991 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 13992 EXPECT_ALL_STYLES_EQUAL(Styles); 13993 13994 Styles[0] = getGoogleStyle(); 13995 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 13996 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 13997 EXPECT_ALL_STYLES_EQUAL(Styles); 13998 13999 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 14000 EXPECT_TRUE( 14001 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 14002 EXPECT_TRUE( 14003 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 14004 EXPECT_ALL_STYLES_EQUAL(Styles); 14005 14006 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 14007 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 14008 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 14009 EXPECT_ALL_STYLES_EQUAL(Styles); 14010 14011 Styles[0] = getMozillaStyle(); 14012 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 14013 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 14014 EXPECT_ALL_STYLES_EQUAL(Styles); 14015 14016 Styles[0] = getWebKitStyle(); 14017 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 14018 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 14019 EXPECT_ALL_STYLES_EQUAL(Styles); 14020 14021 Styles[0] = getGNUStyle(); 14022 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 14023 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 14024 EXPECT_ALL_STYLES_EQUAL(Styles); 14025 14026 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 14027 } 14028 14029 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 14030 SmallVector<FormatStyle, 8> Styles; 14031 Styles.resize(2); 14032 14033 Styles[0] = getGoogleStyle(); 14034 Styles[1] = getLLVMStyle(); 14035 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 14036 EXPECT_ALL_STYLES_EQUAL(Styles); 14037 14038 Styles.resize(5); 14039 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 14040 Styles[1] = getLLVMStyle(); 14041 Styles[1].Language = FormatStyle::LK_JavaScript; 14042 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 14043 14044 Styles[2] = getLLVMStyle(); 14045 Styles[2].Language = FormatStyle::LK_JavaScript; 14046 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 14047 "BasedOnStyle: Google", 14048 &Styles[2]) 14049 .value()); 14050 14051 Styles[3] = getLLVMStyle(); 14052 Styles[3].Language = FormatStyle::LK_JavaScript; 14053 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 14054 "Language: JavaScript", 14055 &Styles[3]) 14056 .value()); 14057 14058 Styles[4] = getLLVMStyle(); 14059 Styles[4].Language = FormatStyle::LK_JavaScript; 14060 EXPECT_EQ(0, parseConfiguration("---\n" 14061 "BasedOnStyle: LLVM\n" 14062 "IndentWidth: 123\n" 14063 "---\n" 14064 "BasedOnStyle: Google\n" 14065 "Language: JavaScript", 14066 &Styles[4]) 14067 .value()); 14068 EXPECT_ALL_STYLES_EQUAL(Styles); 14069 } 14070 14071 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 14072 Style.FIELD = false; \ 14073 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 14074 EXPECT_TRUE(Style.FIELD); \ 14075 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 14076 EXPECT_FALSE(Style.FIELD); 14077 14078 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 14079 14080 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 14081 Style.STRUCT.FIELD = false; \ 14082 EXPECT_EQ(0, \ 14083 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 14084 .value()); \ 14085 EXPECT_TRUE(Style.STRUCT.FIELD); \ 14086 EXPECT_EQ(0, \ 14087 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 14088 .value()); \ 14089 EXPECT_FALSE(Style.STRUCT.FIELD); 14090 14091 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 14092 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 14093 14094 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 14095 EXPECT_NE(VALUE, Style.FIELD) << "Initial value already the same!"; \ 14096 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 14097 EXPECT_EQ(VALUE, Style.FIELD) << "Unexpected value after parsing!" 14098 14099 TEST_F(FormatTest, ParsesConfigurationBools) { 14100 FormatStyle Style = {}; 14101 Style.Language = FormatStyle::LK_Cpp; 14102 CHECK_PARSE_BOOL(AlignTrailingComments); 14103 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 14104 CHECK_PARSE_BOOL(AlignConsecutiveBitFields); 14105 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 14106 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 14107 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 14108 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 14109 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 14110 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 14111 CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine); 14112 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 14113 CHECK_PARSE_BOOL(BinPackArguments); 14114 CHECK_PARSE_BOOL(BinPackParameters); 14115 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 14116 CHECK_PARSE_BOOL(BreakBeforeConceptDeclarations); 14117 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 14118 CHECK_PARSE_BOOL(BreakStringLiterals); 14119 CHECK_PARSE_BOOL(CompactNamespaces); 14120 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 14121 CHECK_PARSE_BOOL(DeriveLineEnding); 14122 CHECK_PARSE_BOOL(DerivePointerAlignment); 14123 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 14124 CHECK_PARSE_BOOL(DisableFormat); 14125 CHECK_PARSE_BOOL(IndentCaseLabels); 14126 CHECK_PARSE_BOOL(IndentCaseBlocks); 14127 CHECK_PARSE_BOOL(IndentGotoLabels); 14128 CHECK_PARSE_BOOL(IndentPragmas); 14129 CHECK_PARSE_BOOL(IndentRequires); 14130 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 14131 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 14132 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 14133 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 14134 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 14135 CHECK_PARSE_BOOL(ReflowComments); 14136 CHECK_PARSE_BOOL(SortIncludes); 14137 CHECK_PARSE_BOOL(SortUsingDeclarations); 14138 CHECK_PARSE_BOOL(SpacesInParentheses); 14139 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 14140 CHECK_PARSE_BOOL(SpacesInAngles); 14141 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 14142 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 14143 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 14144 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 14145 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 14146 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 14147 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 14148 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 14149 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 14150 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 14151 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 14152 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 14153 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 14154 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 14155 CHECK_PARSE_BOOL(UseCRLF); 14156 14157 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 14158 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 14159 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 14160 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 14161 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 14162 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 14163 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 14164 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 14165 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 14166 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 14167 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 14168 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody); 14169 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile); 14170 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 14171 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 14172 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 14173 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 14174 } 14175 14176 #undef CHECK_PARSE_BOOL 14177 14178 TEST_F(FormatTest, ParsesConfiguration) { 14179 FormatStyle Style = {}; 14180 Style.Language = FormatStyle::LK_Cpp; 14181 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 14182 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 14183 ConstructorInitializerIndentWidth, 1234u); 14184 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 14185 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 14186 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 14187 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 14188 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 14189 PenaltyBreakBeforeFirstCallParameter, 1234u); 14190 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 14191 PenaltyBreakTemplateDeclaration, 1234u); 14192 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 14193 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 14194 PenaltyReturnTypeOnItsOwnLine, 1234u); 14195 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 14196 SpacesBeforeTrailingComments, 1234u); 14197 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 14198 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 14199 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 14200 14201 Style.PointerAlignment = FormatStyle::PAS_Middle; 14202 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 14203 FormatStyle::PAS_Left); 14204 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 14205 FormatStyle::PAS_Right); 14206 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 14207 FormatStyle::PAS_Middle); 14208 // For backward compatibility: 14209 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 14210 FormatStyle::PAS_Left); 14211 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 14212 FormatStyle::PAS_Right); 14213 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 14214 FormatStyle::PAS_Middle); 14215 14216 Style.Standard = FormatStyle::LS_Auto; 14217 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 14218 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 14219 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 14220 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 14221 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 14222 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 14223 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 14224 // Legacy aliases: 14225 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 14226 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 14227 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 14228 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 14229 14230 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 14231 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 14232 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 14233 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 14234 FormatStyle::BOS_None); 14235 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 14236 FormatStyle::BOS_All); 14237 // For backward compatibility: 14238 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 14239 FormatStyle::BOS_None); 14240 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 14241 FormatStyle::BOS_All); 14242 14243 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 14244 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 14245 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 14246 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 14247 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 14248 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 14249 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 14250 // For backward compatibility: 14251 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 14252 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 14253 14254 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 14255 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 14256 FormatStyle::BILS_BeforeComma); 14257 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 14258 FormatStyle::BILS_AfterColon); 14259 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 14260 FormatStyle::BILS_BeforeColon); 14261 // For backward compatibility: 14262 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 14263 FormatStyle::BILS_BeforeComma); 14264 14265 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 14266 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 14267 FormatStyle::BAS_Align); 14268 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 14269 FormatStyle::BAS_DontAlign); 14270 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 14271 FormatStyle::BAS_AlwaysBreak); 14272 // For backward compatibility: 14273 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 14274 FormatStyle::BAS_DontAlign); 14275 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 14276 FormatStyle::BAS_Align); 14277 14278 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 14279 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 14280 FormatStyle::ENAS_DontAlign); 14281 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 14282 FormatStyle::ENAS_Left); 14283 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 14284 FormatStyle::ENAS_Right); 14285 // For backward compatibility: 14286 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 14287 FormatStyle::ENAS_Left); 14288 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 14289 FormatStyle::ENAS_Right); 14290 14291 Style.AlignOperands = FormatStyle::OAS_Align; 14292 CHECK_PARSE("AlignOperands: DontAlign", AlignOperands, 14293 FormatStyle::OAS_DontAlign); 14294 CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align); 14295 CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands, 14296 FormatStyle::OAS_AlignAfterOperator); 14297 // For backward compatibility: 14298 CHECK_PARSE("AlignOperands: false", AlignOperands, 14299 FormatStyle::OAS_DontAlign); 14300 CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align); 14301 14302 Style.UseTab = FormatStyle::UT_ForIndentation; 14303 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 14304 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 14305 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 14306 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 14307 FormatStyle::UT_ForContinuationAndIndentation); 14308 CHECK_PARSE("UseTab: AlignWithSpaces", UseTab, 14309 FormatStyle::UT_AlignWithSpaces); 14310 // For backward compatibility: 14311 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 14312 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 14313 14314 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 14315 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 14316 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 14317 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 14318 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 14319 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 14320 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 14321 // For backward compatibility: 14322 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 14323 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 14324 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 14325 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 14326 14327 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 14328 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 14329 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 14330 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 14331 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 14332 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 14333 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 14334 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 14335 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 14336 // For backward compatibility: 14337 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 14338 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 14339 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 14340 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 14341 14342 Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Both; 14343 CHECK_PARSE("SpaceAroundPointerQualifiers: Default", 14344 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Default); 14345 CHECK_PARSE("SpaceAroundPointerQualifiers: Before", 14346 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Before); 14347 CHECK_PARSE("SpaceAroundPointerQualifiers: After", 14348 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_After); 14349 CHECK_PARSE("SpaceAroundPointerQualifiers: Both", 14350 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both); 14351 14352 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 14353 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 14354 FormatStyle::SBPO_Never); 14355 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 14356 FormatStyle::SBPO_Always); 14357 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 14358 FormatStyle::SBPO_ControlStatements); 14359 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 14360 FormatStyle::SBPO_NonEmptyParentheses); 14361 // For backward compatibility: 14362 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 14363 FormatStyle::SBPO_Never); 14364 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 14365 FormatStyle::SBPO_ControlStatements); 14366 14367 Style.ColumnLimit = 123; 14368 FormatStyle BaseStyle = getLLVMStyle(); 14369 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 14370 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 14371 14372 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 14373 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 14374 FormatStyle::BS_Attach); 14375 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 14376 FormatStyle::BS_Linux); 14377 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 14378 FormatStyle::BS_Mozilla); 14379 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 14380 FormatStyle::BS_Stroustrup); 14381 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 14382 FormatStyle::BS_Allman); 14383 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 14384 FormatStyle::BS_Whitesmiths); 14385 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 14386 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 14387 FormatStyle::BS_WebKit); 14388 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 14389 FormatStyle::BS_Custom); 14390 14391 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 14392 CHECK_PARSE("BraceWrapping:\n" 14393 " AfterControlStatement: MultiLine", 14394 BraceWrapping.AfterControlStatement, 14395 FormatStyle::BWACS_MultiLine); 14396 CHECK_PARSE("BraceWrapping:\n" 14397 " AfterControlStatement: Always", 14398 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 14399 CHECK_PARSE("BraceWrapping:\n" 14400 " AfterControlStatement: Never", 14401 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 14402 // For backward compatibility: 14403 CHECK_PARSE("BraceWrapping:\n" 14404 " AfterControlStatement: true", 14405 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 14406 CHECK_PARSE("BraceWrapping:\n" 14407 " AfterControlStatement: false", 14408 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 14409 14410 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 14411 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 14412 FormatStyle::RTBS_None); 14413 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 14414 FormatStyle::RTBS_All); 14415 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 14416 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 14417 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 14418 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 14419 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 14420 AlwaysBreakAfterReturnType, 14421 FormatStyle::RTBS_TopLevelDefinitions); 14422 14423 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 14424 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 14425 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 14426 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 14427 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 14428 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 14429 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 14430 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 14431 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 14432 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 14433 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 14434 14435 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 14436 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 14437 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 14438 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 14439 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 14440 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 14441 AlwaysBreakAfterDefinitionReturnType, 14442 FormatStyle::DRTBS_TopLevel); 14443 14444 Style.NamespaceIndentation = FormatStyle::NI_All; 14445 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 14446 FormatStyle::NI_None); 14447 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 14448 FormatStyle::NI_Inner); 14449 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 14450 FormatStyle::NI_All); 14451 14452 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 14453 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 14454 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 14455 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 14456 AllowShortIfStatementsOnASingleLine, 14457 FormatStyle::SIS_WithoutElse); 14458 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 14459 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 14460 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 14461 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 14462 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 14463 AllowShortIfStatementsOnASingleLine, 14464 FormatStyle::SIS_WithoutElse); 14465 14466 Style.IndentExternBlock = FormatStyle::IEBS_NoIndent; 14467 CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock, 14468 FormatStyle::IEBS_AfterExternBlock); 14469 CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock, 14470 FormatStyle::IEBS_Indent); 14471 CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock, 14472 FormatStyle::IEBS_NoIndent); 14473 CHECK_PARSE("IndentExternBlock: true", IndentExternBlock, 14474 FormatStyle::IEBS_Indent); 14475 CHECK_PARSE("IndentExternBlock: false", IndentExternBlock, 14476 FormatStyle::IEBS_NoIndent); 14477 14478 Style.BitFieldColonSpacing = FormatStyle::BFCS_None; 14479 CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing, 14480 FormatStyle::BFCS_Both); 14481 CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing, 14482 FormatStyle::BFCS_None); 14483 CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing, 14484 FormatStyle::BFCS_Before); 14485 CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing, 14486 FormatStyle::BFCS_After); 14487 14488 Style.SortJavaStaticImport = FormatStyle::SJSIO_Before; 14489 CHECK_PARSE("SortJavaStaticImport: After", SortJavaStaticImport, 14490 FormatStyle::SJSIO_After); 14491 CHECK_PARSE("SortJavaStaticImport: Before", SortJavaStaticImport, 14492 FormatStyle::SJSIO_Before); 14493 14494 // FIXME: This is required because parsing a configuration simply overwrites 14495 // the first N elements of the list instead of resetting it. 14496 Style.ForEachMacros.clear(); 14497 std::vector<std::string> BoostForeach; 14498 BoostForeach.push_back("BOOST_FOREACH"); 14499 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 14500 std::vector<std::string> BoostAndQForeach; 14501 BoostAndQForeach.push_back("BOOST_FOREACH"); 14502 BoostAndQForeach.push_back("Q_FOREACH"); 14503 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 14504 BoostAndQForeach); 14505 14506 Style.AttributeMacros.clear(); 14507 CHECK_PARSE("BasedOnStyle: LLVM", AttributeMacros, 14508 std::vector<std::string>{"__capability"}); 14509 CHECK_PARSE("AttributeMacros: [attr1, attr2]", AttributeMacros, 14510 std::vector<std::string>({"attr1", "attr2"})); 14511 14512 Style.StatementMacros.clear(); 14513 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 14514 std::vector<std::string>{"QUNUSED"}); 14515 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 14516 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 14517 14518 Style.NamespaceMacros.clear(); 14519 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 14520 std::vector<std::string>{"TESTSUITE"}); 14521 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 14522 std::vector<std::string>({"TESTSUITE", "SUITE"})); 14523 14524 Style.WhitespaceSensitiveMacros.clear(); 14525 CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]", 14526 WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"}); 14527 CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]", 14528 WhitespaceSensitiveMacros, 14529 std::vector<std::string>({"STRINGIZE", "ASSERT"})); 14530 Style.WhitespaceSensitiveMacros.clear(); 14531 CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']", 14532 WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"}); 14533 CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']", 14534 WhitespaceSensitiveMacros, 14535 std::vector<std::string>({"STRINGIZE", "ASSERT"})); 14536 14537 Style.IncludeStyle.IncludeCategories.clear(); 14538 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 14539 {"abc/.*", 2, 0, false}, {".*", 1, 0, true}}; 14540 CHECK_PARSE("IncludeCategories:\n" 14541 " - Regex: abc/.*\n" 14542 " Priority: 2\n" 14543 " - Regex: .*\n" 14544 " Priority: 1\n" 14545 " CaseSensitive: true\n", 14546 IncludeStyle.IncludeCategories, ExpectedCategories); 14547 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 14548 "abc$"); 14549 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 14550 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 14551 14552 Style.RawStringFormats.clear(); 14553 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 14554 { 14555 FormatStyle::LK_TextProto, 14556 {"pb", "proto"}, 14557 {"PARSE_TEXT_PROTO"}, 14558 /*CanonicalDelimiter=*/"", 14559 "llvm", 14560 }, 14561 { 14562 FormatStyle::LK_Cpp, 14563 {"cc", "cpp"}, 14564 {"C_CODEBLOCK", "CPPEVAL"}, 14565 /*CanonicalDelimiter=*/"cc", 14566 /*BasedOnStyle=*/"", 14567 }, 14568 }; 14569 14570 CHECK_PARSE("RawStringFormats:\n" 14571 " - Language: TextProto\n" 14572 " Delimiters:\n" 14573 " - 'pb'\n" 14574 " - 'proto'\n" 14575 " EnclosingFunctions:\n" 14576 " - 'PARSE_TEXT_PROTO'\n" 14577 " BasedOnStyle: llvm\n" 14578 " - Language: Cpp\n" 14579 " Delimiters:\n" 14580 " - 'cc'\n" 14581 " - 'cpp'\n" 14582 " EnclosingFunctions:\n" 14583 " - 'C_CODEBLOCK'\n" 14584 " - 'CPPEVAL'\n" 14585 " CanonicalDelimiter: 'cc'", 14586 RawStringFormats, ExpectedRawStringFormats); 14587 } 14588 14589 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 14590 FormatStyle Style = {}; 14591 Style.Language = FormatStyle::LK_Cpp; 14592 CHECK_PARSE("Language: Cpp\n" 14593 "IndentWidth: 12", 14594 IndentWidth, 12u); 14595 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 14596 "IndentWidth: 34", 14597 &Style), 14598 ParseError::Unsuitable); 14599 FormatStyle BinPackedTCS = {}; 14600 BinPackedTCS.Language = FormatStyle::LK_JavaScript; 14601 EXPECT_EQ(parseConfiguration("BinPackArguments: true\n" 14602 "InsertTrailingCommas: Wrapped", 14603 &BinPackedTCS), 14604 ParseError::BinPackTrailingCommaConflict); 14605 EXPECT_EQ(12u, Style.IndentWidth); 14606 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 14607 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14608 14609 Style.Language = FormatStyle::LK_JavaScript; 14610 CHECK_PARSE("Language: JavaScript\n" 14611 "IndentWidth: 12", 14612 IndentWidth, 12u); 14613 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 14614 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 14615 "IndentWidth: 34", 14616 &Style), 14617 ParseError::Unsuitable); 14618 EXPECT_EQ(23u, Style.IndentWidth); 14619 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 14620 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14621 14622 CHECK_PARSE("BasedOnStyle: LLVM\n" 14623 "IndentWidth: 67", 14624 IndentWidth, 67u); 14625 14626 CHECK_PARSE("---\n" 14627 "Language: JavaScript\n" 14628 "IndentWidth: 12\n" 14629 "---\n" 14630 "Language: Cpp\n" 14631 "IndentWidth: 34\n" 14632 "...\n", 14633 IndentWidth, 12u); 14634 14635 Style.Language = FormatStyle::LK_Cpp; 14636 CHECK_PARSE("---\n" 14637 "Language: JavaScript\n" 14638 "IndentWidth: 12\n" 14639 "---\n" 14640 "Language: Cpp\n" 14641 "IndentWidth: 34\n" 14642 "...\n", 14643 IndentWidth, 34u); 14644 CHECK_PARSE("---\n" 14645 "IndentWidth: 78\n" 14646 "---\n" 14647 "Language: JavaScript\n" 14648 "IndentWidth: 56\n" 14649 "...\n", 14650 IndentWidth, 78u); 14651 14652 Style.ColumnLimit = 123; 14653 Style.IndentWidth = 234; 14654 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 14655 Style.TabWidth = 345; 14656 EXPECT_FALSE(parseConfiguration("---\n" 14657 "IndentWidth: 456\n" 14658 "BreakBeforeBraces: Allman\n" 14659 "---\n" 14660 "Language: JavaScript\n" 14661 "IndentWidth: 111\n" 14662 "TabWidth: 111\n" 14663 "---\n" 14664 "Language: Cpp\n" 14665 "BreakBeforeBraces: Stroustrup\n" 14666 "TabWidth: 789\n" 14667 "...\n", 14668 &Style)); 14669 EXPECT_EQ(123u, Style.ColumnLimit); 14670 EXPECT_EQ(456u, Style.IndentWidth); 14671 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 14672 EXPECT_EQ(789u, Style.TabWidth); 14673 14674 EXPECT_EQ(parseConfiguration("---\n" 14675 "Language: JavaScript\n" 14676 "IndentWidth: 56\n" 14677 "---\n" 14678 "IndentWidth: 78\n" 14679 "...\n", 14680 &Style), 14681 ParseError::Error); 14682 EXPECT_EQ(parseConfiguration("---\n" 14683 "Language: JavaScript\n" 14684 "IndentWidth: 56\n" 14685 "---\n" 14686 "Language: JavaScript\n" 14687 "IndentWidth: 78\n" 14688 "...\n", 14689 &Style), 14690 ParseError::Error); 14691 14692 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14693 } 14694 14695 #undef CHECK_PARSE 14696 14697 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 14698 FormatStyle Style = {}; 14699 Style.Language = FormatStyle::LK_JavaScript; 14700 Style.BreakBeforeTernaryOperators = true; 14701 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 14702 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14703 14704 Style.BreakBeforeTernaryOperators = true; 14705 EXPECT_EQ(0, parseConfiguration("---\n" 14706 "BasedOnStyle: Google\n" 14707 "---\n" 14708 "Language: JavaScript\n" 14709 "IndentWidth: 76\n" 14710 "...\n", 14711 &Style) 14712 .value()); 14713 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14714 EXPECT_EQ(76u, Style.IndentWidth); 14715 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14716 } 14717 14718 TEST_F(FormatTest, ConfigurationRoundTripTest) { 14719 FormatStyle Style = getLLVMStyle(); 14720 std::string YAML = configurationAsText(Style); 14721 FormatStyle ParsedStyle = {}; 14722 ParsedStyle.Language = FormatStyle::LK_Cpp; 14723 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 14724 EXPECT_EQ(Style, ParsedStyle); 14725 } 14726 14727 TEST_F(FormatTest, WorksFor8bitEncodings) { 14728 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 14729 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 14730 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 14731 "\"\xef\xee\xf0\xf3...\"", 14732 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 14733 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 14734 "\xef\xee\xf0\xf3...\"", 14735 getLLVMStyleWithColumns(12))); 14736 } 14737 14738 TEST_F(FormatTest, HandlesUTF8BOM) { 14739 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 14740 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 14741 format("\xef\xbb\xbf#include <iostream>")); 14742 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 14743 format("\xef\xbb\xbf\n#include <iostream>")); 14744 } 14745 14746 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 14747 #if !defined(_MSC_VER) 14748 14749 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 14750 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 14751 getLLVMStyleWithColumns(35)); 14752 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 14753 getLLVMStyleWithColumns(31)); 14754 verifyFormat("// Однажды в студёную зимнюю пору...", 14755 getLLVMStyleWithColumns(36)); 14756 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 14757 verifyFormat("/* Однажды в студёную зимнюю пору... */", 14758 getLLVMStyleWithColumns(39)); 14759 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 14760 getLLVMStyleWithColumns(35)); 14761 } 14762 14763 TEST_F(FormatTest, SplitsUTF8Strings) { 14764 // Non-printable characters' width is currently considered to be the length in 14765 // bytes in UTF8. The characters can be displayed in very different manner 14766 // (zero-width, single width with a substitution glyph, expanded to their code 14767 // (e.g. "<8d>"), so there's no single correct way to handle them. 14768 EXPECT_EQ("\"aaaaÄ\"\n" 14769 "\"\xc2\x8d\";", 14770 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14771 EXPECT_EQ("\"aaaaaaaÄ\"\n" 14772 "\"\xc2\x8d\";", 14773 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14774 EXPECT_EQ("\"Однажды, в \"\n" 14775 "\"студёную \"\n" 14776 "\"зимнюю \"\n" 14777 "\"пору,\"", 14778 format("\"Однажды, в студёную зимнюю пору,\"", 14779 getLLVMStyleWithColumns(13))); 14780 EXPECT_EQ( 14781 "\"一 二 三 \"\n" 14782 "\"四 五六 \"\n" 14783 "\"七 八 九 \"\n" 14784 "\"十\"", 14785 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 14786 EXPECT_EQ("\"一\t\"\n" 14787 "\"二 \t\"\n" 14788 "\"三 四 \"\n" 14789 "\"五\t\"\n" 14790 "\"六 \t\"\n" 14791 "\"七 \"\n" 14792 "\"八九十\tqq\"", 14793 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 14794 getLLVMStyleWithColumns(11))); 14795 14796 // UTF8 character in an escape sequence. 14797 EXPECT_EQ("\"aaaaaa\"\n" 14798 "\"\\\xC2\x8D\"", 14799 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 14800 } 14801 14802 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 14803 EXPECT_EQ("const char *sssss =\n" 14804 " \"一二三四五六七八\\\n" 14805 " 九 十\";", 14806 format("const char *sssss = \"一二三四五六七八\\\n" 14807 " 九 十\";", 14808 getLLVMStyleWithColumns(30))); 14809 } 14810 14811 TEST_F(FormatTest, SplitsUTF8LineComments) { 14812 EXPECT_EQ("// aaaaÄ\xc2\x8d", 14813 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 14814 EXPECT_EQ("// Я из лесу\n" 14815 "// вышел; был\n" 14816 "// сильный\n" 14817 "// мороз.", 14818 format("// Я из лесу вышел; был сильный мороз.", 14819 getLLVMStyleWithColumns(13))); 14820 EXPECT_EQ("// 一二三\n" 14821 "// 四五六七\n" 14822 "// 八 九\n" 14823 "// 十", 14824 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 14825 } 14826 14827 TEST_F(FormatTest, SplitsUTF8BlockComments) { 14828 EXPECT_EQ("/* Гляжу,\n" 14829 " * поднимается\n" 14830 " * медленно в\n" 14831 " * гору\n" 14832 " * Лошадка,\n" 14833 " * везущая\n" 14834 " * хворосту\n" 14835 " * воз. */", 14836 format("/* Гляжу, поднимается медленно в гору\n" 14837 " * Лошадка, везущая хворосту воз. */", 14838 getLLVMStyleWithColumns(13))); 14839 EXPECT_EQ( 14840 "/* 一二三\n" 14841 " * 四五六七\n" 14842 " * 八 九\n" 14843 " * 十 */", 14844 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 14845 EXPECT_EQ("/* \n" 14846 " * \n" 14847 " * - */", 14848 format("/* - */", getLLVMStyleWithColumns(12))); 14849 } 14850 14851 #endif // _MSC_VER 14852 14853 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 14854 FormatStyle Style = getLLVMStyle(); 14855 14856 Style.ConstructorInitializerIndentWidth = 4; 14857 verifyFormat( 14858 "SomeClass::Constructor()\n" 14859 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14860 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14861 Style); 14862 14863 Style.ConstructorInitializerIndentWidth = 2; 14864 verifyFormat( 14865 "SomeClass::Constructor()\n" 14866 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14867 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14868 Style); 14869 14870 Style.ConstructorInitializerIndentWidth = 0; 14871 verifyFormat( 14872 "SomeClass::Constructor()\n" 14873 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14874 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14875 Style); 14876 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 14877 verifyFormat( 14878 "SomeLongTemplateVariableName<\n" 14879 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 14880 Style); 14881 verifyFormat("bool smaller = 1 < " 14882 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 14883 " " 14884 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 14885 Style); 14886 14887 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 14888 verifyFormat("SomeClass::Constructor() :\n" 14889 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 14890 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 14891 Style); 14892 } 14893 14894 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 14895 FormatStyle Style = getLLVMStyle(); 14896 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 14897 Style.ConstructorInitializerIndentWidth = 4; 14898 verifyFormat("SomeClass::Constructor()\n" 14899 " : a(a)\n" 14900 " , b(b)\n" 14901 " , c(c) {}", 14902 Style); 14903 verifyFormat("SomeClass::Constructor()\n" 14904 " : a(a) {}", 14905 Style); 14906 14907 Style.ColumnLimit = 0; 14908 verifyFormat("SomeClass::Constructor()\n" 14909 " : a(a) {}", 14910 Style); 14911 verifyFormat("SomeClass::Constructor() noexcept\n" 14912 " : a(a) {}", 14913 Style); 14914 verifyFormat("SomeClass::Constructor()\n" 14915 " : a(a)\n" 14916 " , b(b)\n" 14917 " , c(c) {}", 14918 Style); 14919 verifyFormat("SomeClass::Constructor()\n" 14920 " : a(a) {\n" 14921 " foo();\n" 14922 " bar();\n" 14923 "}", 14924 Style); 14925 14926 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 14927 verifyFormat("SomeClass::Constructor()\n" 14928 " : a(a)\n" 14929 " , b(b)\n" 14930 " , c(c) {\n}", 14931 Style); 14932 verifyFormat("SomeClass::Constructor()\n" 14933 " : a(a) {\n}", 14934 Style); 14935 14936 Style.ColumnLimit = 80; 14937 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 14938 Style.ConstructorInitializerIndentWidth = 2; 14939 verifyFormat("SomeClass::Constructor()\n" 14940 " : a(a)\n" 14941 " , b(b)\n" 14942 " , c(c) {}", 14943 Style); 14944 14945 Style.ConstructorInitializerIndentWidth = 0; 14946 verifyFormat("SomeClass::Constructor()\n" 14947 ": a(a)\n" 14948 ", b(b)\n" 14949 ", c(c) {}", 14950 Style); 14951 14952 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 14953 Style.ConstructorInitializerIndentWidth = 4; 14954 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 14955 verifyFormat( 14956 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 14957 Style); 14958 verifyFormat( 14959 "SomeClass::Constructor()\n" 14960 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 14961 Style); 14962 Style.ConstructorInitializerIndentWidth = 4; 14963 Style.ColumnLimit = 60; 14964 verifyFormat("SomeClass::Constructor()\n" 14965 " : aaaaaaaa(aaaaaaaa)\n" 14966 " , aaaaaaaa(aaaaaaaa)\n" 14967 " , aaaaaaaa(aaaaaaaa) {}", 14968 Style); 14969 } 14970 14971 TEST_F(FormatTest, Destructors) { 14972 verifyFormat("void F(int &i) { i.~int(); }"); 14973 verifyFormat("void F(int &i) { i->~int(); }"); 14974 } 14975 14976 TEST_F(FormatTest, FormatsWithWebKitStyle) { 14977 FormatStyle Style = getWebKitStyle(); 14978 14979 // Don't indent in outer namespaces. 14980 verifyFormat("namespace outer {\n" 14981 "int i;\n" 14982 "namespace inner {\n" 14983 " int i;\n" 14984 "} // namespace inner\n" 14985 "} // namespace outer\n" 14986 "namespace other_outer {\n" 14987 "int i;\n" 14988 "}", 14989 Style); 14990 14991 // Don't indent case labels. 14992 verifyFormat("switch (variable) {\n" 14993 "case 1:\n" 14994 "case 2:\n" 14995 " doSomething();\n" 14996 " break;\n" 14997 "default:\n" 14998 " ++variable;\n" 14999 "}", 15000 Style); 15001 15002 // Wrap before binary operators. 15003 EXPECT_EQ("void f()\n" 15004 "{\n" 15005 " if (aaaaaaaaaaaaaaaa\n" 15006 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 15007 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 15008 " return;\n" 15009 "}", 15010 format("void f() {\n" 15011 "if (aaaaaaaaaaaaaaaa\n" 15012 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 15013 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 15014 "return;\n" 15015 "}", 15016 Style)); 15017 15018 // Allow functions on a single line. 15019 verifyFormat("void f() { return; }", Style); 15020 15021 // Allow empty blocks on a single line and insert a space in empty blocks. 15022 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 15023 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 15024 // However, don't merge non-empty short loops. 15025 EXPECT_EQ("while (true) {\n" 15026 " continue;\n" 15027 "}", 15028 format("while (true) { continue; }", Style)); 15029 15030 // Constructor initializers are formatted one per line with the "," on the 15031 // new line. 15032 verifyFormat("Constructor()\n" 15033 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 15034 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 15035 " aaaaaaaaaaaaaa)\n" 15036 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 15037 "{\n" 15038 "}", 15039 Style); 15040 verifyFormat("SomeClass::Constructor()\n" 15041 " : a(a)\n" 15042 "{\n" 15043 "}", 15044 Style); 15045 EXPECT_EQ("SomeClass::Constructor()\n" 15046 " : a(a)\n" 15047 "{\n" 15048 "}", 15049 format("SomeClass::Constructor():a(a){}", Style)); 15050 verifyFormat("SomeClass::Constructor()\n" 15051 " : a(a)\n" 15052 " , b(b)\n" 15053 " , c(c)\n" 15054 "{\n" 15055 "}", 15056 Style); 15057 verifyFormat("SomeClass::Constructor()\n" 15058 " : a(a)\n" 15059 "{\n" 15060 " foo();\n" 15061 " bar();\n" 15062 "}", 15063 Style); 15064 15065 // Access specifiers should be aligned left. 15066 verifyFormat("class C {\n" 15067 "public:\n" 15068 " int i;\n" 15069 "};", 15070 Style); 15071 15072 // Do not align comments. 15073 verifyFormat("int a; // Do not\n" 15074 "double b; // align comments.", 15075 Style); 15076 15077 // Do not align operands. 15078 EXPECT_EQ("ASSERT(aaaa\n" 15079 " || bbbb);", 15080 format("ASSERT ( aaaa\n||bbbb);", Style)); 15081 15082 // Accept input's line breaks. 15083 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 15084 " || bbbbbbbbbbbbbbb) {\n" 15085 " i++;\n" 15086 "}", 15087 format("if (aaaaaaaaaaaaaaa\n" 15088 "|| bbbbbbbbbbbbbbb) { i++; }", 15089 Style)); 15090 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 15091 " i++;\n" 15092 "}", 15093 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 15094 15095 // Don't automatically break all macro definitions (llvm.org/PR17842). 15096 verifyFormat("#define aNumber 10", Style); 15097 // However, generally keep the line breaks that the user authored. 15098 EXPECT_EQ("#define aNumber \\\n" 15099 " 10", 15100 format("#define aNumber \\\n" 15101 " 10", 15102 Style)); 15103 15104 // Keep empty and one-element array literals on a single line. 15105 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 15106 " copyItems:YES];", 15107 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 15108 "copyItems:YES];", 15109 Style)); 15110 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 15111 " copyItems:YES];", 15112 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 15113 " copyItems:YES];", 15114 Style)); 15115 // FIXME: This does not seem right, there should be more indentation before 15116 // the array literal's entries. Nested blocks have the same problem. 15117 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 15118 " @\"a\",\n" 15119 " @\"a\"\n" 15120 "]\n" 15121 " copyItems:YES];", 15122 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 15123 " @\"a\",\n" 15124 " @\"a\"\n" 15125 " ]\n" 15126 " copyItems:YES];", 15127 Style)); 15128 EXPECT_EQ( 15129 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 15130 " copyItems:YES];", 15131 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 15132 " copyItems:YES];", 15133 Style)); 15134 15135 verifyFormat("[self.a b:c c:d];", Style); 15136 EXPECT_EQ("[self.a b:c\n" 15137 " c:d];", 15138 format("[self.a b:c\n" 15139 "c:d];", 15140 Style)); 15141 } 15142 15143 TEST_F(FormatTest, FormatsLambdas) { 15144 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 15145 verifyFormat( 15146 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 15147 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 15148 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 15149 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 15150 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 15151 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 15152 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 15153 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 15154 verifyFormat("int x = f(*+[] {});"); 15155 verifyFormat("void f() {\n" 15156 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 15157 "}\n"); 15158 verifyFormat("void f() {\n" 15159 " other(x.begin(), //\n" 15160 " x.end(), //\n" 15161 " [&](int, int) { return 1; });\n" 15162 "}\n"); 15163 verifyFormat("void f() {\n" 15164 " other.other.other.other.other(\n" 15165 " x.begin(), x.end(),\n" 15166 " [something, rather](int, int, int, int, int, int, int) { " 15167 "return 1; });\n" 15168 "}\n"); 15169 verifyFormat( 15170 "void f() {\n" 15171 " other.other.other.other.other(\n" 15172 " x.begin(), x.end(),\n" 15173 " [something, rather](int, int, int, int, int, int, int) {\n" 15174 " //\n" 15175 " });\n" 15176 "}\n"); 15177 verifyFormat("SomeFunction([]() { // A cool function...\n" 15178 " return 43;\n" 15179 "});"); 15180 EXPECT_EQ("SomeFunction([]() {\n" 15181 "#define A a\n" 15182 " return 43;\n" 15183 "});", 15184 format("SomeFunction([](){\n" 15185 "#define A a\n" 15186 "return 43;\n" 15187 "});")); 15188 verifyFormat("void f() {\n" 15189 " SomeFunction([](decltype(x), A *a) {});\n" 15190 " SomeFunction([](typeof(x), A *a) {});\n" 15191 " SomeFunction([](_Atomic(x), A *a) {});\n" 15192 " SomeFunction([](__underlying_type(x), A *a) {});\n" 15193 "}"); 15194 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15195 " [](const aaaaaaaaaa &a) { return a; });"); 15196 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 15197 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 15198 "});"); 15199 verifyFormat("Constructor()\n" 15200 " : Field([] { // comment\n" 15201 " int i;\n" 15202 " }) {}"); 15203 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 15204 " return some_parameter.size();\n" 15205 "};"); 15206 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 15207 " [](const string &s) { return s; };"); 15208 verifyFormat("int i = aaaaaa ? 1 //\n" 15209 " : [] {\n" 15210 " return 2; //\n" 15211 " }();"); 15212 verifyFormat("llvm::errs() << \"number of twos is \"\n" 15213 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 15214 " return x == 2; // force break\n" 15215 " });"); 15216 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15217 " [=](int iiiiiiiiiiii) {\n" 15218 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 15219 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 15220 " });", 15221 getLLVMStyleWithColumns(60)); 15222 verifyFormat("SomeFunction({[&] {\n" 15223 " // comment\n" 15224 " },\n" 15225 " [&] {\n" 15226 " // comment\n" 15227 " }});"); 15228 verifyFormat("SomeFunction({[&] {\n" 15229 " // comment\n" 15230 "}});"); 15231 verifyFormat( 15232 "virtual aaaaaaaaaaaaaaaa(\n" 15233 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 15234 " aaaaa aaaaaaaaa);"); 15235 15236 // Lambdas with return types. 15237 verifyFormat("int c = []() -> int { return 2; }();\n"); 15238 verifyFormat("int c = []() -> int * { return 2; }();\n"); 15239 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 15240 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 15241 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 15242 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 15243 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 15244 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 15245 verifyFormat("[a, a]() -> a<1> {};"); 15246 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 15247 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 15248 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 15249 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 15250 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 15251 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 15252 verifyFormat("[]() -> foo<!5> { return {}; };"); 15253 verifyFormat("[]() -> foo<~5> { return {}; };"); 15254 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 15255 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 15256 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 15257 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 15258 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 15259 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 15260 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 15261 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 15262 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 15263 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 15264 verifyFormat("namespace bar {\n" 15265 "// broken:\n" 15266 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 15267 "} // namespace bar"); 15268 verifyFormat("namespace bar {\n" 15269 "// broken:\n" 15270 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 15271 "} // namespace bar"); 15272 verifyFormat("namespace bar {\n" 15273 "// broken:\n" 15274 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 15275 "} // namespace bar"); 15276 verifyFormat("namespace bar {\n" 15277 "// broken:\n" 15278 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 15279 "} // namespace bar"); 15280 verifyFormat("namespace bar {\n" 15281 "// broken:\n" 15282 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 15283 "} // namespace bar"); 15284 verifyFormat("namespace bar {\n" 15285 "// broken:\n" 15286 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 15287 "} // namespace bar"); 15288 verifyFormat("namespace bar {\n" 15289 "// broken:\n" 15290 "auto foo{[]() -> foo<!5> { return {}; }};\n" 15291 "} // namespace bar"); 15292 verifyFormat("namespace bar {\n" 15293 "// broken:\n" 15294 "auto foo{[]() -> foo<~5> { return {}; }};\n" 15295 "} // namespace bar"); 15296 verifyFormat("namespace bar {\n" 15297 "// broken:\n" 15298 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 15299 "} // namespace bar"); 15300 verifyFormat("namespace bar {\n" 15301 "// broken:\n" 15302 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 15303 "} // namespace bar"); 15304 verifyFormat("namespace bar {\n" 15305 "// broken:\n" 15306 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 15307 "} // namespace bar"); 15308 verifyFormat("namespace bar {\n" 15309 "// broken:\n" 15310 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 15311 "} // namespace bar"); 15312 verifyFormat("namespace bar {\n" 15313 "// broken:\n" 15314 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 15315 "} // namespace bar"); 15316 verifyFormat("namespace bar {\n" 15317 "// broken:\n" 15318 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 15319 "} // namespace bar"); 15320 verifyFormat("namespace bar {\n" 15321 "// broken:\n" 15322 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 15323 "} // namespace bar"); 15324 verifyFormat("namespace bar {\n" 15325 "// broken:\n" 15326 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 15327 "} // namespace bar"); 15328 verifyFormat("namespace bar {\n" 15329 "// broken:\n" 15330 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 15331 "} // namespace bar"); 15332 verifyFormat("namespace bar {\n" 15333 "// broken:\n" 15334 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 15335 "} // namespace bar"); 15336 verifyFormat("[]() -> a<1> {};"); 15337 verifyFormat("[]() -> a<1> { ; };"); 15338 verifyFormat("[]() -> a<1> { ; }();"); 15339 verifyFormat("[a, a]() -> a<true> {};"); 15340 verifyFormat("[]() -> a<true> {};"); 15341 verifyFormat("[]() -> a<true> { ; };"); 15342 verifyFormat("[]() -> a<true> { ; }();"); 15343 verifyFormat("[a, a]() -> a<false> {};"); 15344 verifyFormat("[]() -> a<false> {};"); 15345 verifyFormat("[]() -> a<false> { ; };"); 15346 verifyFormat("[]() -> a<false> { ; }();"); 15347 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 15348 verifyFormat("namespace bar {\n" 15349 "auto foo{[]() -> foo<false> { ; }};\n" 15350 "} // namespace bar"); 15351 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 15352 " int j) -> int {\n" 15353 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 15354 "};"); 15355 verifyFormat( 15356 "aaaaaaaaaaaaaaaaaaaaaa(\n" 15357 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 15358 " return aaaaaaaaaaaaaaaaa;\n" 15359 " });", 15360 getLLVMStyleWithColumns(70)); 15361 verifyFormat("[]() //\n" 15362 " -> int {\n" 15363 " return 1; //\n" 15364 "};"); 15365 verifyFormat("[]() -> Void<T...> {};"); 15366 verifyFormat("[a, b]() -> Tuple<T...> { return {}; };"); 15367 15368 // Lambdas with explicit template argument lists. 15369 verifyFormat( 15370 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 15371 15372 // Multiple lambdas in the same parentheses change indentation rules. These 15373 // lambdas are forced to start on new lines. 15374 verifyFormat("SomeFunction(\n" 15375 " []() {\n" 15376 " //\n" 15377 " },\n" 15378 " []() {\n" 15379 " //\n" 15380 " });"); 15381 15382 // A lambda passed as arg0 is always pushed to the next line. 15383 verifyFormat("SomeFunction(\n" 15384 " [this] {\n" 15385 " //\n" 15386 " },\n" 15387 " 1);\n"); 15388 15389 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 15390 // the arg0 case above. 15391 auto Style = getGoogleStyle(); 15392 Style.BinPackArguments = false; 15393 verifyFormat("SomeFunction(\n" 15394 " a,\n" 15395 " [this] {\n" 15396 " //\n" 15397 " },\n" 15398 " b);\n", 15399 Style); 15400 verifyFormat("SomeFunction(\n" 15401 " a,\n" 15402 " [this] {\n" 15403 " //\n" 15404 " },\n" 15405 " b);\n"); 15406 15407 // A lambda with a very long line forces arg0 to be pushed out irrespective of 15408 // the BinPackArguments value (as long as the code is wide enough). 15409 verifyFormat( 15410 "something->SomeFunction(\n" 15411 " a,\n" 15412 " [this] {\n" 15413 " " 15414 "D0000000000000000000000000000000000000000000000000000000000001();\n" 15415 " },\n" 15416 " b);\n"); 15417 15418 // A multi-line lambda is pulled up as long as the introducer fits on the 15419 // previous line and there are no further args. 15420 verifyFormat("function(1, [this, that] {\n" 15421 " //\n" 15422 "});\n"); 15423 verifyFormat("function([this, that] {\n" 15424 " //\n" 15425 "});\n"); 15426 // FIXME: this format is not ideal and we should consider forcing the first 15427 // arg onto its own line. 15428 verifyFormat("function(a, b, c, //\n" 15429 " d, [this, that] {\n" 15430 " //\n" 15431 " });\n"); 15432 15433 // Multiple lambdas are treated correctly even when there is a short arg0. 15434 verifyFormat("SomeFunction(\n" 15435 " 1,\n" 15436 " [this] {\n" 15437 " //\n" 15438 " },\n" 15439 " [this] {\n" 15440 " //\n" 15441 " },\n" 15442 " 1);\n"); 15443 15444 // More complex introducers. 15445 verifyFormat("return [i, args...] {};"); 15446 15447 // Not lambdas. 15448 verifyFormat("constexpr char hello[]{\"hello\"};"); 15449 verifyFormat("double &operator[](int i) { return 0; }\n" 15450 "int i;"); 15451 verifyFormat("std::unique_ptr<int[]> foo() {}"); 15452 verifyFormat("int i = a[a][a]->f();"); 15453 verifyFormat("int i = (*b)[a]->f();"); 15454 15455 // Other corner cases. 15456 verifyFormat("void f() {\n" 15457 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 15458 " );\n" 15459 "}"); 15460 15461 // Lambdas created through weird macros. 15462 verifyFormat("void f() {\n" 15463 " MACRO((const AA &a) { return 1; });\n" 15464 " MACRO((AA &a) { return 1; });\n" 15465 "}"); 15466 15467 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 15468 " doo_dah();\n" 15469 " doo_dah();\n" 15470 " })) {\n" 15471 "}"); 15472 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 15473 " doo_dah();\n" 15474 " doo_dah();\n" 15475 " })) {\n" 15476 "}"); 15477 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 15478 " doo_dah();\n" 15479 " doo_dah();\n" 15480 " })) {\n" 15481 "}"); 15482 verifyFormat("auto lambda = []() {\n" 15483 " int a = 2\n" 15484 "#if A\n" 15485 " + 2\n" 15486 "#endif\n" 15487 " ;\n" 15488 "};"); 15489 15490 // Lambdas with complex multiline introducers. 15491 verifyFormat( 15492 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15493 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 15494 " -> ::std::unordered_set<\n" 15495 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 15496 " //\n" 15497 " });"); 15498 15499 FormatStyle DoNotMerge = getLLVMStyle(); 15500 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 15501 verifyFormat("auto c = []() {\n" 15502 " return b;\n" 15503 "};", 15504 "auto c = []() { return b; };", DoNotMerge); 15505 verifyFormat("auto c = []() {\n" 15506 "};", 15507 " auto c = []() {};", DoNotMerge); 15508 15509 FormatStyle MergeEmptyOnly = getLLVMStyle(); 15510 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 15511 verifyFormat("auto c = []() {\n" 15512 " return b;\n" 15513 "};", 15514 "auto c = []() {\n" 15515 " return b;\n" 15516 " };", 15517 MergeEmptyOnly); 15518 verifyFormat("auto c = []() {};", 15519 "auto c = []() {\n" 15520 "};", 15521 MergeEmptyOnly); 15522 15523 FormatStyle MergeInline = getLLVMStyle(); 15524 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 15525 verifyFormat("auto c = []() {\n" 15526 " return b;\n" 15527 "};", 15528 "auto c = []() { return b; };", MergeInline); 15529 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 15530 MergeInline); 15531 verifyFormat("function([]() { return b; }, a)", 15532 "function([]() { return b; }, a)", MergeInline); 15533 verifyFormat("function(a, []() { return b; })", 15534 "function(a, []() { return b; })", MergeInline); 15535 15536 // Check option "BraceWrapping.BeforeLambdaBody" and different state of 15537 // AllowShortLambdasOnASingleLine 15538 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15539 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15540 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15541 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15542 FormatStyle::ShortLambdaStyle::SLS_None; 15543 verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n" 15544 " []()\n" 15545 " {\n" 15546 " return 17;\n" 15547 " });", 15548 LLVMWithBeforeLambdaBody); 15549 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n" 15550 " []()\n" 15551 " {\n" 15552 " });", 15553 LLVMWithBeforeLambdaBody); 15554 verifyFormat("auto fct_SLS_None = []()\n" 15555 "{\n" 15556 " return 17;\n" 15557 "};", 15558 LLVMWithBeforeLambdaBody); 15559 verifyFormat("TwoNestedLambdas_SLS_None(\n" 15560 " []()\n" 15561 " {\n" 15562 " return Call(\n" 15563 " []()\n" 15564 " {\n" 15565 " return 17;\n" 15566 " });\n" 15567 " });", 15568 LLVMWithBeforeLambdaBody); 15569 verifyFormat("void Fct()\n" 15570 "{\n" 15571 " return {[]()\n" 15572 " {\n" 15573 " return 17;\n" 15574 " }};\n" 15575 "}", 15576 LLVMWithBeforeLambdaBody); 15577 15578 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15579 FormatStyle::ShortLambdaStyle::SLS_Empty; 15580 verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" 15581 " []()\n" 15582 " {\n" 15583 " return 17;\n" 15584 " });", 15585 LLVMWithBeforeLambdaBody); 15586 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});", 15587 LLVMWithBeforeLambdaBody); 15588 verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL" 15589 "ongFunctionName_SLS_Empty(\n" 15590 " []() {});", 15591 LLVMWithBeforeLambdaBody); 15592 verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n" 15593 " []()\n" 15594 " {\n" 15595 " return 17;\n" 15596 " });", 15597 LLVMWithBeforeLambdaBody); 15598 verifyFormat("auto fct_SLS_Empty = []()\n" 15599 "{\n" 15600 " return 17;\n" 15601 "};", 15602 LLVMWithBeforeLambdaBody); 15603 verifyFormat("TwoNestedLambdas_SLS_Empty(\n" 15604 " []()\n" 15605 " {\n" 15606 " return Call([]() {});\n" 15607 " });", 15608 LLVMWithBeforeLambdaBody); 15609 verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n" 15610 " []()\n" 15611 " {\n" 15612 " return Call([]() {});\n" 15613 " });", 15614 LLVMWithBeforeLambdaBody); 15615 verifyFormat( 15616 "FctWithLongLineInLambda_SLS_Empty(\n" 15617 " []()\n" 15618 " {\n" 15619 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15620 " AndShouldNotBeConsiderAsInline,\n" 15621 " LambdaBodyMustBeBreak);\n" 15622 " });", 15623 LLVMWithBeforeLambdaBody); 15624 15625 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15626 FormatStyle::ShortLambdaStyle::SLS_Inline; 15627 verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });", 15628 LLVMWithBeforeLambdaBody); 15629 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});", 15630 LLVMWithBeforeLambdaBody); 15631 verifyFormat("auto fct_SLS_Inline = []()\n" 15632 "{\n" 15633 " return 17;\n" 15634 "};", 15635 LLVMWithBeforeLambdaBody); 15636 verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return " 15637 "17; }); });", 15638 LLVMWithBeforeLambdaBody); 15639 verifyFormat( 15640 "FctWithLongLineInLambda_SLS_Inline(\n" 15641 " []()\n" 15642 " {\n" 15643 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15644 " AndShouldNotBeConsiderAsInline,\n" 15645 " LambdaBodyMustBeBreak);\n" 15646 " });", 15647 LLVMWithBeforeLambdaBody); 15648 verifyFormat("FctWithMultipleParams_SLS_Inline(" 15649 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15650 " []() { return 17; });", 15651 LLVMWithBeforeLambdaBody); 15652 verifyFormat( 15653 "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });", 15654 LLVMWithBeforeLambdaBody); 15655 15656 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15657 FormatStyle::ShortLambdaStyle::SLS_All; 15658 verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });", 15659 LLVMWithBeforeLambdaBody); 15660 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});", 15661 LLVMWithBeforeLambdaBody); 15662 verifyFormat("auto fct_SLS_All = []() { return 17; };", 15663 LLVMWithBeforeLambdaBody); 15664 verifyFormat("FctWithOneParam_SLS_All(\n" 15665 " []()\n" 15666 " {\n" 15667 " // A cool function...\n" 15668 " return 43;\n" 15669 " });", 15670 LLVMWithBeforeLambdaBody); 15671 verifyFormat("FctWithMultipleParams_SLS_All(" 15672 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15673 " []() { return 17; });", 15674 LLVMWithBeforeLambdaBody); 15675 verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });", 15676 LLVMWithBeforeLambdaBody); 15677 verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });", 15678 LLVMWithBeforeLambdaBody); 15679 verifyFormat( 15680 "FctWithLongLineInLambda_SLS_All(\n" 15681 " []()\n" 15682 " {\n" 15683 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15684 " AndShouldNotBeConsiderAsInline,\n" 15685 " LambdaBodyMustBeBreak);\n" 15686 " });", 15687 LLVMWithBeforeLambdaBody); 15688 verifyFormat( 15689 "auto fct_SLS_All = []()\n" 15690 "{\n" 15691 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15692 " AndShouldNotBeConsiderAsInline,\n" 15693 " LambdaBodyMustBeBreak);\n" 15694 "};", 15695 LLVMWithBeforeLambdaBody); 15696 LLVMWithBeforeLambdaBody.BinPackParameters = false; 15697 verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);", 15698 LLVMWithBeforeLambdaBody); 15699 verifyFormat( 15700 "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n" 15701 " FirstParam,\n" 15702 " SecondParam,\n" 15703 " ThirdParam,\n" 15704 " FourthParam);", 15705 LLVMWithBeforeLambdaBody); 15706 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15707 " []() { return " 15708 "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n" 15709 " FirstParam,\n" 15710 " SecondParam,\n" 15711 " ThirdParam,\n" 15712 " FourthParam);", 15713 LLVMWithBeforeLambdaBody); 15714 verifyFormat( 15715 "FctWithLongLineInLambda_SLS_All(FirstParam,\n" 15716 " SecondParam,\n" 15717 " ThirdParam,\n" 15718 " FourthParam,\n" 15719 " []() { return SomeValueNotSoLong; });", 15720 LLVMWithBeforeLambdaBody); 15721 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15722 " []()\n" 15723 " {\n" 15724 " return " 15725 "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB" 15726 "eConsiderAsInline;\n" 15727 " });", 15728 LLVMWithBeforeLambdaBody); 15729 verifyFormat( 15730 "FctWithLongLineInLambda_SLS_All(\n" 15731 " []()\n" 15732 " {\n" 15733 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15734 " AndShouldNotBeConsiderAsInline,\n" 15735 " LambdaBodyMustBeBreak);\n" 15736 " });", 15737 LLVMWithBeforeLambdaBody); 15738 verifyFormat("FctWithTwoParams_SLS_All(\n" 15739 " []()\n" 15740 " {\n" 15741 " // A cool function...\n" 15742 " return 43;\n" 15743 " },\n" 15744 " 87);", 15745 LLVMWithBeforeLambdaBody); 15746 verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);", 15747 LLVMWithBeforeLambdaBody); 15748 verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });", 15749 LLVMWithBeforeLambdaBody); 15750 verifyFormat( 15751 "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });", 15752 LLVMWithBeforeLambdaBody); 15753 verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; " 15754 "}); }, x);", 15755 LLVMWithBeforeLambdaBody); 15756 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15757 " []()\n" 15758 " {\n" 15759 " // A cool function...\n" 15760 " return Call([]() { return 17; });\n" 15761 " });", 15762 LLVMWithBeforeLambdaBody); 15763 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15764 " []()\n" 15765 " {\n" 15766 " return Call(\n" 15767 " []()\n" 15768 " {\n" 15769 " // A cool function...\n" 15770 " return 17;\n" 15771 " });\n" 15772 " });", 15773 LLVMWithBeforeLambdaBody); 15774 } 15775 15776 TEST_F(FormatTest, LambdaWithLineComments) { 15777 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15778 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15779 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15780 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15781 FormatStyle::ShortLambdaStyle::SLS_All; 15782 15783 verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody); 15784 verifyFormat("auto k = []() // comment\n" 15785 "{ return; }", 15786 LLVMWithBeforeLambdaBody); 15787 verifyFormat("auto k = []() /* comment */ { return; }", 15788 LLVMWithBeforeLambdaBody); 15789 verifyFormat("auto k = []() /* comment */ /* comment */ { return; }", 15790 LLVMWithBeforeLambdaBody); 15791 verifyFormat("auto k = []() // X\n" 15792 "{ return; }", 15793 LLVMWithBeforeLambdaBody); 15794 verifyFormat( 15795 "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" 15796 "{ return; }", 15797 LLVMWithBeforeLambdaBody); 15798 } 15799 15800 TEST_F(FormatTest, EmptyLinesInLambdas) { 15801 verifyFormat("auto lambda = []() {\n" 15802 " x(); //\n" 15803 "};", 15804 "auto lambda = []() {\n" 15805 "\n" 15806 " x(); //\n" 15807 "\n" 15808 "};"); 15809 } 15810 15811 TEST_F(FormatTest, FormatsBlocks) { 15812 FormatStyle ShortBlocks = getLLVMStyle(); 15813 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15814 verifyFormat("int (^Block)(int, int);", ShortBlocks); 15815 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 15816 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 15817 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 15818 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 15819 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 15820 15821 verifyFormat("foo(^{ bar(); });", ShortBlocks); 15822 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 15823 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 15824 15825 verifyFormat("[operation setCompletionBlock:^{\n" 15826 " [self onOperationDone];\n" 15827 "}];"); 15828 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 15829 " [self onOperationDone];\n" 15830 "}]};"); 15831 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 15832 " f();\n" 15833 "}];"); 15834 verifyFormat("int a = [operation block:^int(int *i) {\n" 15835 " return 1;\n" 15836 "}];"); 15837 verifyFormat("[myObject doSomethingWith:arg1\n" 15838 " aaa:^int(int *a) {\n" 15839 " return 1;\n" 15840 " }\n" 15841 " bbb:f(a * bbbbbbbb)];"); 15842 15843 verifyFormat("[operation setCompletionBlock:^{\n" 15844 " [self.delegate newDataAvailable];\n" 15845 "}];", 15846 getLLVMStyleWithColumns(60)); 15847 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 15848 " NSString *path = [self sessionFilePath];\n" 15849 " if (path) {\n" 15850 " // ...\n" 15851 " }\n" 15852 "});"); 15853 verifyFormat("[[SessionService sharedService]\n" 15854 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15855 " if (window) {\n" 15856 " [self windowDidLoad:window];\n" 15857 " } else {\n" 15858 " [self errorLoadingWindow];\n" 15859 " }\n" 15860 " }];"); 15861 verifyFormat("void (^largeBlock)(void) = ^{\n" 15862 " // ...\n" 15863 "};\n", 15864 getLLVMStyleWithColumns(40)); 15865 verifyFormat("[[SessionService sharedService]\n" 15866 " loadWindowWithCompletionBlock: //\n" 15867 " ^(SessionWindow *window) {\n" 15868 " if (window) {\n" 15869 " [self windowDidLoad:window];\n" 15870 " } else {\n" 15871 " [self errorLoadingWindow];\n" 15872 " }\n" 15873 " }];", 15874 getLLVMStyleWithColumns(60)); 15875 verifyFormat("[myObject doSomethingWith:arg1\n" 15876 " firstBlock:^(Foo *a) {\n" 15877 " // ...\n" 15878 " int i;\n" 15879 " }\n" 15880 " secondBlock:^(Bar *b) {\n" 15881 " // ...\n" 15882 " int i;\n" 15883 " }\n" 15884 " thirdBlock:^Foo(Bar *b) {\n" 15885 " // ...\n" 15886 " int i;\n" 15887 " }];"); 15888 verifyFormat("[myObject doSomethingWith:arg1\n" 15889 " firstBlock:-1\n" 15890 " secondBlock:^(Bar *b) {\n" 15891 " // ...\n" 15892 " int i;\n" 15893 " }];"); 15894 15895 verifyFormat("f(^{\n" 15896 " @autoreleasepool {\n" 15897 " if (a) {\n" 15898 " g();\n" 15899 " }\n" 15900 " }\n" 15901 "});"); 15902 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 15903 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 15904 "};"); 15905 15906 FormatStyle FourIndent = getLLVMStyle(); 15907 FourIndent.ObjCBlockIndentWidth = 4; 15908 verifyFormat("[operation setCompletionBlock:^{\n" 15909 " [self onOperationDone];\n" 15910 "}];", 15911 FourIndent); 15912 } 15913 15914 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 15915 FormatStyle ZeroColumn = getLLVMStyle(); 15916 ZeroColumn.ColumnLimit = 0; 15917 15918 verifyFormat("[[SessionService sharedService] " 15919 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15920 " if (window) {\n" 15921 " [self windowDidLoad:window];\n" 15922 " } else {\n" 15923 " [self errorLoadingWindow];\n" 15924 " }\n" 15925 "}];", 15926 ZeroColumn); 15927 EXPECT_EQ("[[SessionService sharedService]\n" 15928 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15929 " if (window) {\n" 15930 " [self windowDidLoad:window];\n" 15931 " } else {\n" 15932 " [self errorLoadingWindow];\n" 15933 " }\n" 15934 " }];", 15935 format("[[SessionService sharedService]\n" 15936 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15937 " if (window) {\n" 15938 " [self windowDidLoad:window];\n" 15939 " } else {\n" 15940 " [self errorLoadingWindow];\n" 15941 " }\n" 15942 "}];", 15943 ZeroColumn)); 15944 verifyFormat("[myObject doSomethingWith:arg1\n" 15945 " firstBlock:^(Foo *a) {\n" 15946 " // ...\n" 15947 " int i;\n" 15948 " }\n" 15949 " secondBlock:^(Bar *b) {\n" 15950 " // ...\n" 15951 " int i;\n" 15952 " }\n" 15953 " thirdBlock:^Foo(Bar *b) {\n" 15954 " // ...\n" 15955 " int i;\n" 15956 " }];", 15957 ZeroColumn); 15958 verifyFormat("f(^{\n" 15959 " @autoreleasepool {\n" 15960 " if (a) {\n" 15961 " g();\n" 15962 " }\n" 15963 " }\n" 15964 "});", 15965 ZeroColumn); 15966 verifyFormat("void (^largeBlock)(void) = ^{\n" 15967 " // ...\n" 15968 "};", 15969 ZeroColumn); 15970 15971 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15972 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 15973 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 15974 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 15975 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 15976 " int i;\n" 15977 "};", 15978 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 15979 } 15980 15981 TEST_F(FormatTest, SupportsCRLF) { 15982 EXPECT_EQ("int a;\r\n" 15983 "int b;\r\n" 15984 "int c;\r\n", 15985 format("int a;\r\n" 15986 " int b;\r\n" 15987 " int c;\r\n", 15988 getLLVMStyle())); 15989 EXPECT_EQ("int a;\r\n" 15990 "int b;\r\n" 15991 "int c;\r\n", 15992 format("int a;\r\n" 15993 " int b;\n" 15994 " int c;\r\n", 15995 getLLVMStyle())); 15996 EXPECT_EQ("int a;\n" 15997 "int b;\n" 15998 "int c;\n", 15999 format("int a;\r\n" 16000 " int b;\n" 16001 " int c;\n", 16002 getLLVMStyle())); 16003 EXPECT_EQ("\"aaaaaaa \"\r\n" 16004 "\"bbbbbbb\";\r\n", 16005 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 16006 EXPECT_EQ("#define A \\\r\n" 16007 " b; \\\r\n" 16008 " c; \\\r\n" 16009 " d;\r\n", 16010 format("#define A \\\r\n" 16011 " b; \\\r\n" 16012 " c; d; \r\n", 16013 getGoogleStyle())); 16014 16015 EXPECT_EQ("/*\r\n" 16016 "multi line block comments\r\n" 16017 "should not introduce\r\n" 16018 "an extra carriage return\r\n" 16019 "*/\r\n", 16020 format("/*\r\n" 16021 "multi line block comments\r\n" 16022 "should not introduce\r\n" 16023 "an extra carriage return\r\n" 16024 "*/\r\n")); 16025 EXPECT_EQ("/*\r\n" 16026 "\r\n" 16027 "*/", 16028 format("/*\r\n" 16029 " \r\r\r\n" 16030 "*/")); 16031 16032 FormatStyle style = getLLVMStyle(); 16033 16034 style.DeriveLineEnding = true; 16035 style.UseCRLF = false; 16036 EXPECT_EQ("union FooBarBazQux {\n" 16037 " int foo;\n" 16038 " int bar;\n" 16039 " int baz;\n" 16040 "};", 16041 format("union FooBarBazQux {\r\n" 16042 " int foo;\n" 16043 " int bar;\r\n" 16044 " int baz;\n" 16045 "};", 16046 style)); 16047 style.UseCRLF = true; 16048 EXPECT_EQ("union FooBarBazQux {\r\n" 16049 " int foo;\r\n" 16050 " int bar;\r\n" 16051 " int baz;\r\n" 16052 "};", 16053 format("union FooBarBazQux {\r\n" 16054 " int foo;\n" 16055 " int bar;\r\n" 16056 " int baz;\n" 16057 "};", 16058 style)); 16059 16060 style.DeriveLineEnding = false; 16061 style.UseCRLF = false; 16062 EXPECT_EQ("union FooBarBazQux {\n" 16063 " int foo;\n" 16064 " int bar;\n" 16065 " int baz;\n" 16066 " int qux;\n" 16067 "};", 16068 format("union FooBarBazQux {\r\n" 16069 " int foo;\n" 16070 " int bar;\r\n" 16071 " int baz;\n" 16072 " int qux;\r\n" 16073 "};", 16074 style)); 16075 style.UseCRLF = true; 16076 EXPECT_EQ("union FooBarBazQux {\r\n" 16077 " int foo;\r\n" 16078 " int bar;\r\n" 16079 " int baz;\r\n" 16080 " int qux;\r\n" 16081 "};", 16082 format("union FooBarBazQux {\r\n" 16083 " int foo;\n" 16084 " int bar;\r\n" 16085 " int baz;\n" 16086 " int qux;\n" 16087 "};", 16088 style)); 16089 16090 style.DeriveLineEnding = true; 16091 style.UseCRLF = false; 16092 EXPECT_EQ("union FooBarBazQux {\r\n" 16093 " int foo;\r\n" 16094 " int bar;\r\n" 16095 " int baz;\r\n" 16096 " int qux;\r\n" 16097 "};", 16098 format("union FooBarBazQux {\r\n" 16099 " int foo;\n" 16100 " int bar;\r\n" 16101 " int baz;\n" 16102 " int qux;\r\n" 16103 "};", 16104 style)); 16105 style.UseCRLF = true; 16106 EXPECT_EQ("union FooBarBazQux {\n" 16107 " int foo;\n" 16108 " int bar;\n" 16109 " int baz;\n" 16110 " int qux;\n" 16111 "};", 16112 format("union FooBarBazQux {\r\n" 16113 " int foo;\n" 16114 " int bar;\r\n" 16115 " int baz;\n" 16116 " int qux;\n" 16117 "};", 16118 style)); 16119 } 16120 16121 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 16122 verifyFormat("MY_CLASS(C) {\n" 16123 " int i;\n" 16124 " int j;\n" 16125 "};"); 16126 } 16127 16128 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 16129 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 16130 TwoIndent.ContinuationIndentWidth = 2; 16131 16132 EXPECT_EQ("int i =\n" 16133 " longFunction(\n" 16134 " arg);", 16135 format("int i = longFunction(arg);", TwoIndent)); 16136 16137 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 16138 SixIndent.ContinuationIndentWidth = 6; 16139 16140 EXPECT_EQ("int i =\n" 16141 " longFunction(\n" 16142 " arg);", 16143 format("int i = longFunction(arg);", SixIndent)); 16144 } 16145 16146 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 16147 FormatStyle Style = getLLVMStyle(); 16148 verifyFormat("int Foo::getter(\n" 16149 " //\n" 16150 ") const {\n" 16151 " return foo;\n" 16152 "}", 16153 Style); 16154 verifyFormat("void Foo::setter(\n" 16155 " //\n" 16156 ") {\n" 16157 " foo = 1;\n" 16158 "}", 16159 Style); 16160 } 16161 16162 TEST_F(FormatTest, SpacesInAngles) { 16163 FormatStyle Spaces = getLLVMStyle(); 16164 Spaces.SpacesInAngles = true; 16165 16166 verifyFormat("static_cast< int >(arg);", Spaces); 16167 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 16168 verifyFormat("f< int, float >();", Spaces); 16169 verifyFormat("template <> g() {}", Spaces); 16170 verifyFormat("template < std::vector< int > > f() {}", Spaces); 16171 verifyFormat("std::function< void(int, int) > fct;", Spaces); 16172 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 16173 Spaces); 16174 16175 Spaces.Standard = FormatStyle::LS_Cpp03; 16176 Spaces.SpacesInAngles = true; 16177 verifyFormat("A< A< int > >();", Spaces); 16178 16179 Spaces.SpacesInAngles = false; 16180 verifyFormat("A<A<int> >();", Spaces); 16181 16182 Spaces.Standard = FormatStyle::LS_Cpp11; 16183 Spaces.SpacesInAngles = true; 16184 verifyFormat("A< A< int > >();", Spaces); 16185 16186 Spaces.SpacesInAngles = false; 16187 verifyFormat("A<A<int>>();", Spaces); 16188 } 16189 16190 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 16191 FormatStyle Style = getLLVMStyle(); 16192 Style.SpaceAfterTemplateKeyword = false; 16193 verifyFormat("template<int> void foo();", Style); 16194 } 16195 16196 TEST_F(FormatTest, TripleAngleBrackets) { 16197 verifyFormat("f<<<1, 1>>>();"); 16198 verifyFormat("f<<<1, 1, 1, s>>>();"); 16199 verifyFormat("f<<<a, b, c, d>>>();"); 16200 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 16201 verifyFormat("f<param><<<1, 1>>>();"); 16202 verifyFormat("f<1><<<1, 1>>>();"); 16203 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 16204 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16205 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 16206 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 16207 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 16208 } 16209 16210 TEST_F(FormatTest, MergeLessLessAtEnd) { 16211 verifyFormat("<<"); 16212 EXPECT_EQ("< < <", format("\\\n<<<")); 16213 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16214 "aaallvm::outs() <<"); 16215 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16216 "aaaallvm::outs()\n <<"); 16217 } 16218 16219 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 16220 std::string code = "#if A\n" 16221 "#if B\n" 16222 "a.\n" 16223 "#endif\n" 16224 " a = 1;\n" 16225 "#else\n" 16226 "#endif\n" 16227 "#if C\n" 16228 "#else\n" 16229 "#endif\n"; 16230 EXPECT_EQ(code, format(code)); 16231 } 16232 16233 TEST_F(FormatTest, HandleConflictMarkers) { 16234 // Git/SVN conflict markers. 16235 EXPECT_EQ("int a;\n" 16236 "void f() {\n" 16237 " callme(some(parameter1,\n" 16238 "<<<<<<< text by the vcs\n" 16239 " parameter2),\n" 16240 "||||||| text by the vcs\n" 16241 " parameter2),\n" 16242 " parameter3,\n" 16243 "======= text by the vcs\n" 16244 " parameter2, parameter3),\n" 16245 ">>>>>>> text by the vcs\n" 16246 " otherparameter);\n", 16247 format("int a;\n" 16248 "void f() {\n" 16249 " callme(some(parameter1,\n" 16250 "<<<<<<< text by the vcs\n" 16251 " parameter2),\n" 16252 "||||||| text by the vcs\n" 16253 " parameter2),\n" 16254 " parameter3,\n" 16255 "======= text by the vcs\n" 16256 " parameter2,\n" 16257 " parameter3),\n" 16258 ">>>>>>> text by the vcs\n" 16259 " otherparameter);\n")); 16260 16261 // Perforce markers. 16262 EXPECT_EQ("void f() {\n" 16263 " function(\n" 16264 ">>>> text by the vcs\n" 16265 " parameter,\n" 16266 "==== text by the vcs\n" 16267 " parameter,\n" 16268 "==== text by the vcs\n" 16269 " parameter,\n" 16270 "<<<< text by the vcs\n" 16271 " parameter);\n", 16272 format("void f() {\n" 16273 " function(\n" 16274 ">>>> text by the vcs\n" 16275 " parameter,\n" 16276 "==== text by the vcs\n" 16277 " parameter,\n" 16278 "==== text by the vcs\n" 16279 " parameter,\n" 16280 "<<<< text by the vcs\n" 16281 " parameter);\n")); 16282 16283 EXPECT_EQ("<<<<<<<\n" 16284 "|||||||\n" 16285 "=======\n" 16286 ">>>>>>>", 16287 format("<<<<<<<\n" 16288 "|||||||\n" 16289 "=======\n" 16290 ">>>>>>>")); 16291 16292 EXPECT_EQ("<<<<<<<\n" 16293 "|||||||\n" 16294 "int i;\n" 16295 "=======\n" 16296 ">>>>>>>", 16297 format("<<<<<<<\n" 16298 "|||||||\n" 16299 "int i;\n" 16300 "=======\n" 16301 ">>>>>>>")); 16302 16303 // FIXME: Handle parsing of macros around conflict markers correctly: 16304 EXPECT_EQ("#define Macro \\\n" 16305 "<<<<<<<\n" 16306 "Something \\\n" 16307 "|||||||\n" 16308 "Else \\\n" 16309 "=======\n" 16310 "Other \\\n" 16311 ">>>>>>>\n" 16312 " End int i;\n", 16313 format("#define Macro \\\n" 16314 "<<<<<<<\n" 16315 " Something \\\n" 16316 "|||||||\n" 16317 " Else \\\n" 16318 "=======\n" 16319 " Other \\\n" 16320 ">>>>>>>\n" 16321 " End\n" 16322 "int i;\n")); 16323 } 16324 16325 TEST_F(FormatTest, DisableRegions) { 16326 EXPECT_EQ("int i;\n" 16327 "// clang-format off\n" 16328 " int j;\n" 16329 "// clang-format on\n" 16330 "int k;", 16331 format(" int i;\n" 16332 " // clang-format off\n" 16333 " int j;\n" 16334 " // clang-format on\n" 16335 " int k;")); 16336 EXPECT_EQ("int i;\n" 16337 "/* clang-format off */\n" 16338 " int j;\n" 16339 "/* clang-format on */\n" 16340 "int k;", 16341 format(" int i;\n" 16342 " /* clang-format off */\n" 16343 " int j;\n" 16344 " /* clang-format on */\n" 16345 " int k;")); 16346 16347 // Don't reflow comments within disabled regions. 16348 EXPECT_EQ("// clang-format off\n" 16349 "// long long long long long long line\n" 16350 "/* clang-format on */\n" 16351 "/* long long long\n" 16352 " * long long long\n" 16353 " * line */\n" 16354 "int i;\n" 16355 "/* clang-format off */\n" 16356 "/* long long long long long long line */\n", 16357 format("// clang-format off\n" 16358 "// long long long long long long line\n" 16359 "/* clang-format on */\n" 16360 "/* long long long long long long line */\n" 16361 "int i;\n" 16362 "/* clang-format off */\n" 16363 "/* long long long long long long line */\n", 16364 getLLVMStyleWithColumns(20))); 16365 } 16366 16367 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 16368 format("? ) ="); 16369 verifyNoCrash("#define a\\\n /**/}"); 16370 } 16371 16372 TEST_F(FormatTest, FormatsTableGenCode) { 16373 FormatStyle Style = getLLVMStyle(); 16374 Style.Language = FormatStyle::LK_TableGen; 16375 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 16376 } 16377 16378 TEST_F(FormatTest, ArrayOfTemplates) { 16379 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 16380 format("auto a = new unique_ptr<int > [ 10];")); 16381 16382 FormatStyle Spaces = getLLVMStyle(); 16383 Spaces.SpacesInSquareBrackets = true; 16384 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 16385 format("auto a = new unique_ptr<int > [10];", Spaces)); 16386 } 16387 16388 TEST_F(FormatTest, ArrayAsTemplateType) { 16389 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 16390 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 16391 16392 FormatStyle Spaces = getLLVMStyle(); 16393 Spaces.SpacesInSquareBrackets = true; 16394 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 16395 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 16396 } 16397 16398 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 16399 16400 TEST(FormatStyle, GetStyleWithEmptyFileName) { 16401 llvm::vfs::InMemoryFileSystem FS; 16402 auto Style1 = getStyle("file", "", "Google", "", &FS); 16403 ASSERT_TRUE((bool)Style1); 16404 ASSERT_EQ(*Style1, getGoogleStyle()); 16405 } 16406 16407 TEST(FormatStyle, GetStyleOfFile) { 16408 llvm::vfs::InMemoryFileSystem FS; 16409 // Test 1: format file in the same directory. 16410 ASSERT_TRUE( 16411 FS.addFile("/a/.clang-format", 0, 16412 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 16413 ASSERT_TRUE( 16414 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16415 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 16416 ASSERT_TRUE((bool)Style1); 16417 ASSERT_EQ(*Style1, getLLVMStyle()); 16418 16419 // Test 2.1: fallback to default. 16420 ASSERT_TRUE( 16421 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16422 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 16423 ASSERT_TRUE((bool)Style2); 16424 ASSERT_EQ(*Style2, getMozillaStyle()); 16425 16426 // Test 2.2: no format on 'none' fallback style. 16427 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 16428 ASSERT_TRUE((bool)Style2); 16429 ASSERT_EQ(*Style2, getNoStyle()); 16430 16431 // Test 2.3: format if config is found with no based style while fallback is 16432 // 'none'. 16433 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 16434 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 16435 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 16436 ASSERT_TRUE((bool)Style2); 16437 ASSERT_EQ(*Style2, getLLVMStyle()); 16438 16439 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 16440 Style2 = getStyle("{}", "a.h", "none", "", &FS); 16441 ASSERT_TRUE((bool)Style2); 16442 ASSERT_EQ(*Style2, getLLVMStyle()); 16443 16444 // Test 3: format file in parent directory. 16445 ASSERT_TRUE( 16446 FS.addFile("/c/.clang-format", 0, 16447 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 16448 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 16449 llvm::MemoryBuffer::getMemBuffer("int i;"))); 16450 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 16451 ASSERT_TRUE((bool)Style3); 16452 ASSERT_EQ(*Style3, getGoogleStyle()); 16453 16454 // Test 4: error on invalid fallback style 16455 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 16456 ASSERT_FALSE((bool)Style4); 16457 llvm::consumeError(Style4.takeError()); 16458 16459 // Test 5: error on invalid yaml on command line 16460 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 16461 ASSERT_FALSE((bool)Style5); 16462 llvm::consumeError(Style5.takeError()); 16463 16464 // Test 6: error on invalid style 16465 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 16466 ASSERT_FALSE((bool)Style6); 16467 llvm::consumeError(Style6.takeError()); 16468 16469 // Test 7: found config file, error on parsing it 16470 ASSERT_TRUE( 16471 FS.addFile("/d/.clang-format", 0, 16472 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 16473 "InvalidKey: InvalidValue"))); 16474 ASSERT_TRUE( 16475 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16476 auto Style7a = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 16477 ASSERT_FALSE((bool)Style7a); 16478 llvm::consumeError(Style7a.takeError()); 16479 16480 auto Style7b = getStyle("file", "/d/.clang-format", "LLVM", "", &FS, true); 16481 ASSERT_TRUE((bool)Style7b); 16482 16483 // Test 8: inferred per-language defaults apply. 16484 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 16485 ASSERT_TRUE((bool)StyleTd); 16486 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 16487 } 16488 16489 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 16490 // Column limit is 20. 16491 std::string Code = "Type *a =\n" 16492 " new Type();\n" 16493 "g(iiiii, 0, jjjjj,\n" 16494 " 0, kkkkk, 0, mm);\n" 16495 "int bad = format ;"; 16496 std::string Expected = "auto a = new Type();\n" 16497 "g(iiiii, nullptr,\n" 16498 " jjjjj, nullptr,\n" 16499 " kkkkk, nullptr,\n" 16500 " mm);\n" 16501 "int bad = format ;"; 16502 FileID ID = Context.createInMemoryFile("format.cpp", Code); 16503 tooling::Replacements Replaces = toReplacements( 16504 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 16505 "auto "), 16506 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 16507 "nullptr"), 16508 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 16509 "nullptr"), 16510 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 16511 "nullptr")}); 16512 16513 format::FormatStyle Style = format::getLLVMStyle(); 16514 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 16515 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 16516 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 16517 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 16518 auto Result = applyAllReplacements(Code, *FormattedReplaces); 16519 EXPECT_TRUE(static_cast<bool>(Result)); 16520 EXPECT_EQ(Expected, *Result); 16521 } 16522 16523 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 16524 std::string Code = "#include \"a.h\"\n" 16525 "#include \"c.h\"\n" 16526 "\n" 16527 "int main() {\n" 16528 " return 0;\n" 16529 "}"; 16530 std::string Expected = "#include \"a.h\"\n" 16531 "#include \"b.h\"\n" 16532 "#include \"c.h\"\n" 16533 "\n" 16534 "int main() {\n" 16535 " return 0;\n" 16536 "}"; 16537 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 16538 tooling::Replacements Replaces = toReplacements( 16539 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 16540 "#include \"b.h\"\n")}); 16541 16542 format::FormatStyle Style = format::getLLVMStyle(); 16543 Style.SortIncludes = true; 16544 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 16545 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 16546 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 16547 auto Result = applyAllReplacements(Code, *FormattedReplaces); 16548 EXPECT_TRUE(static_cast<bool>(Result)); 16549 EXPECT_EQ(Expected, *Result); 16550 } 16551 16552 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 16553 EXPECT_EQ("using std::cin;\n" 16554 "using std::cout;", 16555 format("using std::cout;\n" 16556 "using std::cin;", 16557 getGoogleStyle())); 16558 } 16559 16560 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 16561 format::FormatStyle Style = format::getLLVMStyle(); 16562 Style.Standard = FormatStyle::LS_Cpp03; 16563 // cpp03 recognize this string as identifier u8 and literal character 'a' 16564 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 16565 } 16566 16567 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 16568 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 16569 // all modes, including C++11, C++14 and C++17 16570 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 16571 } 16572 16573 TEST_F(FormatTest, DoNotFormatLikelyXml) { 16574 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 16575 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 16576 } 16577 16578 TEST_F(FormatTest, StructuredBindings) { 16579 // Structured bindings is a C++17 feature. 16580 // all modes, including C++11, C++14 and C++17 16581 verifyFormat("auto [a, b] = f();"); 16582 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 16583 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 16584 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 16585 EXPECT_EQ("auto const volatile [a, b] = f();", 16586 format("auto const volatile[a, b] = f();")); 16587 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 16588 EXPECT_EQ("auto &[a, b, c] = f();", 16589 format("auto &[ a , b,c ] = f();")); 16590 EXPECT_EQ("auto &&[a, b, c] = f();", 16591 format("auto &&[ a , b,c ] = f();")); 16592 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 16593 EXPECT_EQ("auto const volatile &&[a, b] = f();", 16594 format("auto const volatile &&[a, b] = f();")); 16595 EXPECT_EQ("auto const &&[a, b] = f();", 16596 format("auto const && [a, b] = f();")); 16597 EXPECT_EQ("const auto &[a, b] = f();", 16598 format("const auto & [a, b] = f();")); 16599 EXPECT_EQ("const auto volatile &&[a, b] = f();", 16600 format("const auto volatile &&[a, b] = f();")); 16601 EXPECT_EQ("volatile const auto &&[a, b] = f();", 16602 format("volatile const auto &&[a, b] = f();")); 16603 EXPECT_EQ("const auto &&[a, b] = f();", 16604 format("const auto && [a, b] = f();")); 16605 16606 // Make sure we don't mistake structured bindings for lambdas. 16607 FormatStyle PointerMiddle = getLLVMStyle(); 16608 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 16609 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 16610 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 16611 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 16612 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 16613 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 16614 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 16615 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 16616 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 16617 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 16618 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 16619 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 16620 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 16621 16622 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 16623 format("for (const auto && [a, b] : some_range) {\n}")); 16624 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 16625 format("for (const auto & [a, b] : some_range) {\n}")); 16626 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 16627 format("for (const auto[a, b] : some_range) {\n}")); 16628 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 16629 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 16630 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 16631 EXPECT_EQ("auto const &[x, y](expr);", 16632 format("auto const & [x,y] (expr);")); 16633 EXPECT_EQ("auto const &&[x, y](expr);", 16634 format("auto const && [x,y] (expr);")); 16635 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 16636 EXPECT_EQ("auto const &[x, y]{expr};", 16637 format("auto const & [x,y] {expr};")); 16638 EXPECT_EQ("auto const &&[x, y]{expr};", 16639 format("auto const && [x,y] {expr};")); 16640 16641 format::FormatStyle Spaces = format::getLLVMStyle(); 16642 Spaces.SpacesInSquareBrackets = true; 16643 verifyFormat("auto [ a, b ] = f();", Spaces); 16644 verifyFormat("auto &&[ a, b ] = f();", Spaces); 16645 verifyFormat("auto &[ a, b ] = f();", Spaces); 16646 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 16647 verifyFormat("auto const &[ a, b ] = f();", Spaces); 16648 } 16649 16650 TEST_F(FormatTest, FileAndCode) { 16651 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 16652 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 16653 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 16654 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 16655 EXPECT_EQ(FormatStyle::LK_ObjC, 16656 guessLanguage("foo.h", "@interface Foo\n@end\n")); 16657 EXPECT_EQ( 16658 FormatStyle::LK_ObjC, 16659 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 16660 EXPECT_EQ(FormatStyle::LK_ObjC, 16661 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 16662 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 16663 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 16664 EXPECT_EQ(FormatStyle::LK_ObjC, 16665 guessLanguage("foo", "@interface Foo\n@end\n")); 16666 EXPECT_EQ(FormatStyle::LK_ObjC, 16667 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 16668 EXPECT_EQ( 16669 FormatStyle::LK_ObjC, 16670 guessLanguage("foo.h", 16671 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 16672 EXPECT_EQ( 16673 FormatStyle::LK_Cpp, 16674 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 16675 } 16676 16677 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 16678 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 16679 EXPECT_EQ(FormatStyle::LK_ObjC, 16680 guessLanguage("foo.h", "array[[calculator getIndex]];")); 16681 EXPECT_EQ(FormatStyle::LK_Cpp, 16682 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 16683 EXPECT_EQ( 16684 FormatStyle::LK_Cpp, 16685 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 16686 EXPECT_EQ(FormatStyle::LK_ObjC, 16687 guessLanguage("foo.h", "[[noreturn foo] bar];")); 16688 EXPECT_EQ(FormatStyle::LK_Cpp, 16689 guessLanguage("foo.h", "[[clang::fallthrough]];")); 16690 EXPECT_EQ(FormatStyle::LK_ObjC, 16691 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 16692 EXPECT_EQ(FormatStyle::LK_Cpp, 16693 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 16694 EXPECT_EQ(FormatStyle::LK_Cpp, 16695 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 16696 EXPECT_EQ(FormatStyle::LK_ObjC, 16697 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 16698 EXPECT_EQ(FormatStyle::LK_Cpp, 16699 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 16700 EXPECT_EQ( 16701 FormatStyle::LK_Cpp, 16702 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 16703 EXPECT_EQ( 16704 FormatStyle::LK_Cpp, 16705 guessLanguage("foo.h", 16706 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 16707 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 16708 } 16709 16710 TEST_F(FormatTest, GuessLanguageWithCaret) { 16711 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 16712 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 16713 EXPECT_EQ(FormatStyle::LK_ObjC, 16714 guessLanguage("foo.h", "int(^)(char, float);")); 16715 EXPECT_EQ(FormatStyle::LK_ObjC, 16716 guessLanguage("foo.h", "int(^foo)(char, float);")); 16717 EXPECT_EQ(FormatStyle::LK_ObjC, 16718 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 16719 EXPECT_EQ(FormatStyle::LK_ObjC, 16720 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 16721 EXPECT_EQ( 16722 FormatStyle::LK_ObjC, 16723 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 16724 } 16725 16726 TEST_F(FormatTest, GuessLanguageWithPragmas) { 16727 EXPECT_EQ(FormatStyle::LK_Cpp, 16728 guessLanguage("foo.h", "__pragma(warning(disable:))")); 16729 EXPECT_EQ(FormatStyle::LK_Cpp, 16730 guessLanguage("foo.h", "#pragma(warning(disable:))")); 16731 EXPECT_EQ(FormatStyle::LK_Cpp, 16732 guessLanguage("foo.h", "_Pragma(warning(disable:))")); 16733 } 16734 16735 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) { 16736 // ASM symbolic names are identifiers that must be surrounded by [] without 16737 // space in between: 16738 // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands 16739 16740 // Example from https://bugs.llvm.org/show_bug.cgi?id=45108. 16741 verifyFormat(R"(// 16742 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result)); 16743 )"); 16744 16745 // A list of several ASM symbolic names. 16746 verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)"); 16747 16748 // ASM symbolic names in inline ASM with inputs and outputs. 16749 verifyFormat(R"(// 16750 asm("cmoveq %1, %2, %[result]" 16751 : [result] "=r"(result) 16752 : "r"(test), "r"(new), "[result]"(old)); 16753 )"); 16754 16755 // ASM symbolic names in inline ASM with no outputs. 16756 verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)"); 16757 } 16758 16759 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 16760 EXPECT_EQ(FormatStyle::LK_Cpp, 16761 guessLanguage("foo.h", "void f() {\n" 16762 " asm (\"mov %[e], %[d]\"\n" 16763 " : [d] \"=rm\" (d)\n" 16764 " [e] \"rm\" (*e));\n" 16765 "}")); 16766 EXPECT_EQ(FormatStyle::LK_Cpp, 16767 guessLanguage("foo.h", "void f() {\n" 16768 " _asm (\"mov %[e], %[d]\"\n" 16769 " : [d] \"=rm\" (d)\n" 16770 " [e] \"rm\" (*e));\n" 16771 "}")); 16772 EXPECT_EQ(FormatStyle::LK_Cpp, 16773 guessLanguage("foo.h", "void f() {\n" 16774 " __asm (\"mov %[e], %[d]\"\n" 16775 " : [d] \"=rm\" (d)\n" 16776 " [e] \"rm\" (*e));\n" 16777 "}")); 16778 EXPECT_EQ(FormatStyle::LK_Cpp, 16779 guessLanguage("foo.h", "void f() {\n" 16780 " __asm__ (\"mov %[e], %[d]\"\n" 16781 " : [d] \"=rm\" (d)\n" 16782 " [e] \"rm\" (*e));\n" 16783 "}")); 16784 EXPECT_EQ(FormatStyle::LK_Cpp, 16785 guessLanguage("foo.h", "void f() {\n" 16786 " asm (\"mov %[e], %[d]\"\n" 16787 " : [d] \"=rm\" (d),\n" 16788 " [e] \"rm\" (*e));\n" 16789 "}")); 16790 EXPECT_EQ(FormatStyle::LK_Cpp, 16791 guessLanguage("foo.h", "void f() {\n" 16792 " asm volatile (\"mov %[e], %[d]\"\n" 16793 " : [d] \"=rm\" (d)\n" 16794 " [e] \"rm\" (*e));\n" 16795 "}")); 16796 } 16797 16798 TEST_F(FormatTest, GuessLanguageWithChildLines) { 16799 EXPECT_EQ(FormatStyle::LK_Cpp, 16800 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 16801 EXPECT_EQ(FormatStyle::LK_ObjC, 16802 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 16803 EXPECT_EQ( 16804 FormatStyle::LK_Cpp, 16805 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 16806 EXPECT_EQ( 16807 FormatStyle::LK_ObjC, 16808 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 16809 } 16810 16811 TEST_F(FormatTest, TypenameMacros) { 16812 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 16813 16814 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 16815 FormatStyle Google = getGoogleStyleWithColumns(0); 16816 Google.TypenameMacros = TypenameMacros; 16817 verifyFormat("struct foo {\n" 16818 " int bar;\n" 16819 " TAILQ_ENTRY(a) bleh;\n" 16820 "};", 16821 Google); 16822 16823 FormatStyle Macros = getLLVMStyle(); 16824 Macros.TypenameMacros = TypenameMacros; 16825 16826 verifyFormat("STACK_OF(int) a;", Macros); 16827 verifyFormat("STACK_OF(int) *a;", Macros); 16828 verifyFormat("STACK_OF(int const *) *a;", Macros); 16829 verifyFormat("STACK_OF(int *const) *a;", Macros); 16830 verifyFormat("STACK_OF(int, string) a;", Macros); 16831 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 16832 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 16833 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 16834 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 16835 verifyFormat("vector<LIST(uint64_t) *attr> x;", Macros); 16836 verifyFormat("vector<LIST(uint64_t) *const> f(LIST(uint64_t) *arg);", Macros); 16837 16838 Macros.PointerAlignment = FormatStyle::PAS_Left; 16839 verifyFormat("STACK_OF(int)* a;", Macros); 16840 verifyFormat("STACK_OF(int*)* a;", Macros); 16841 verifyFormat("x = (STACK_OF(uint64_t))*a;", Macros); 16842 verifyFormat("x = (STACK_OF(uint64_t))&a;", Macros); 16843 verifyFormat("vector<STACK_OF(uint64_t)* attr> x;", Macros); 16844 } 16845 16846 TEST_F(FormatTest, AtomicQualifier) { 16847 // Check that we treate _Atomic as a type and not a function call 16848 FormatStyle Google = getGoogleStyleWithColumns(0); 16849 verifyFormat("struct foo {\n" 16850 " int a1;\n" 16851 " _Atomic(a) a2;\n" 16852 " _Atomic(_Atomic(int) *const) a3;\n" 16853 "};", 16854 Google); 16855 verifyFormat("_Atomic(uint64_t) a;"); 16856 verifyFormat("_Atomic(uint64_t) *a;"); 16857 verifyFormat("_Atomic(uint64_t const *) *a;"); 16858 verifyFormat("_Atomic(uint64_t *const) *a;"); 16859 verifyFormat("_Atomic(const uint64_t *) *a;"); 16860 verifyFormat("_Atomic(uint64_t) a;"); 16861 verifyFormat("_Atomic(_Atomic(uint64_t)) a;"); 16862 verifyFormat("_Atomic(_Atomic(uint64_t)) a, b;"); 16863 verifyFormat("for (_Atomic(uint64_t) *a = NULL; a;) {\n}"); 16864 verifyFormat("_Atomic(uint64_t) f(_Atomic(uint64_t) *arg);"); 16865 16866 verifyFormat("_Atomic(uint64_t) *s(InitValue);"); 16867 verifyFormat("_Atomic(uint64_t) *s{InitValue};"); 16868 FormatStyle Style = getLLVMStyle(); 16869 Style.PointerAlignment = FormatStyle::PAS_Left; 16870 verifyFormat("_Atomic(uint64_t)* s(InitValue);", Style); 16871 verifyFormat("_Atomic(uint64_t)* s{InitValue};", Style); 16872 verifyFormat("_Atomic(int)* a;", Style); 16873 verifyFormat("_Atomic(int*)* a;", Style); 16874 verifyFormat("vector<_Atomic(uint64_t)* attr> x;", Style); 16875 16876 Style.SpacesInCStyleCastParentheses = true; 16877 Style.SpacesInParentheses = false; 16878 verifyFormat("x = ( _Atomic(uint64_t) )*a;", Style); 16879 Style.SpacesInCStyleCastParentheses = false; 16880 Style.SpacesInParentheses = true; 16881 verifyFormat("x = (_Atomic( uint64_t ))*a;", Style); 16882 verifyFormat("x = (_Atomic( uint64_t ))&a;", Style); 16883 } 16884 16885 TEST_F(FormatTest, AmbersandInLamda) { 16886 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 16887 FormatStyle AlignStyle = getLLVMStyle(); 16888 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 16889 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 16890 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 16891 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 16892 } 16893 16894 TEST_F(FormatTest, SpacesInConditionalStatement) { 16895 FormatStyle Spaces = getLLVMStyle(); 16896 Spaces.SpacesInConditionalStatement = true; 16897 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 16898 verifyFormat("if ( !a )\n return;", Spaces); 16899 verifyFormat("if ( a )\n return;", Spaces); 16900 verifyFormat("if constexpr ( a )\n return;", Spaces); 16901 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 16902 verifyFormat("while ( a )\n return;", Spaces); 16903 verifyFormat("while ( (a && b) )\n return;", Spaces); 16904 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 16905 verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces); 16906 // Check that space on the left of "::" is inserted as expected at beginning 16907 // of condition. 16908 verifyFormat("while ( ::func() )\n return;", Spaces); 16909 } 16910 16911 TEST_F(FormatTest, AlternativeOperators) { 16912 // Test case for ensuring alternate operators are not 16913 // combined with their right most neighbour. 16914 verifyFormat("int a and b;"); 16915 verifyFormat("int a and_eq b;"); 16916 verifyFormat("int a bitand b;"); 16917 verifyFormat("int a bitor b;"); 16918 verifyFormat("int a compl b;"); 16919 verifyFormat("int a not b;"); 16920 verifyFormat("int a not_eq b;"); 16921 verifyFormat("int a or b;"); 16922 verifyFormat("int a xor b;"); 16923 verifyFormat("int a xor_eq b;"); 16924 verifyFormat("return this not_eq bitand other;"); 16925 verifyFormat("bool operator not_eq(const X bitand other)"); 16926 16927 verifyFormat("int a and 5;"); 16928 verifyFormat("int a and_eq 5;"); 16929 verifyFormat("int a bitand 5;"); 16930 verifyFormat("int a bitor 5;"); 16931 verifyFormat("int a compl 5;"); 16932 verifyFormat("int a not 5;"); 16933 verifyFormat("int a not_eq 5;"); 16934 verifyFormat("int a or 5;"); 16935 verifyFormat("int a xor 5;"); 16936 verifyFormat("int a xor_eq 5;"); 16937 16938 verifyFormat("int a compl(5);"); 16939 verifyFormat("int a not(5);"); 16940 16941 /* FIXME handle alternate tokens 16942 * https://en.cppreference.com/w/cpp/language/operator_alternative 16943 // alternative tokens 16944 verifyFormat("compl foo();"); // ~foo(); 16945 verifyFormat("foo() <%%>;"); // foo(); 16946 verifyFormat("void foo() <%%>;"); // void foo(){} 16947 verifyFormat("int a <:1:>;"); // int a[1];[ 16948 verifyFormat("%:define ABC abc"); // #define ABC abc 16949 verifyFormat("%:%:"); // ## 16950 */ 16951 } 16952 16953 TEST_F(FormatTest, STLWhileNotDefineChed) { 16954 verifyFormat("#if defined(while)\n" 16955 "#define while EMIT WARNING C4005\n" 16956 "#endif // while"); 16957 } 16958 16959 TEST_F(FormatTest, OperatorSpacing) { 16960 FormatStyle Style = getLLVMStyle(); 16961 Style.PointerAlignment = FormatStyle::PAS_Right; 16962 verifyFormat("Foo::operator*();", Style); 16963 verifyFormat("Foo::operator void *();", Style); 16964 verifyFormat("Foo::operator void **();", Style); 16965 verifyFormat("Foo::operator void *&();", Style); 16966 verifyFormat("Foo::operator void *&&();", Style); 16967 verifyFormat("Foo::operator()(void *);", Style); 16968 verifyFormat("Foo::operator*(void *);", Style); 16969 verifyFormat("Foo::operator*();", Style); 16970 verifyFormat("Foo::operator**();", Style); 16971 verifyFormat("Foo::operator&();", Style); 16972 verifyFormat("Foo::operator<int> *();", Style); 16973 verifyFormat("Foo::operator<Foo> *();", Style); 16974 verifyFormat("Foo::operator<int> **();", Style); 16975 verifyFormat("Foo::operator<Foo> **();", Style); 16976 verifyFormat("Foo::operator<int> &();", Style); 16977 verifyFormat("Foo::operator<Foo> &();", Style); 16978 verifyFormat("Foo::operator<int> &&();", Style); 16979 verifyFormat("Foo::operator<Foo> &&();", Style); 16980 verifyFormat("Foo::operator<int> *&();", Style); 16981 verifyFormat("Foo::operator<Foo> *&();", Style); 16982 verifyFormat("Foo::operator<int> *&&();", Style); 16983 verifyFormat("Foo::operator<Foo> *&&();", Style); 16984 verifyFormat("operator*(int (*)(), class Foo);", Style); 16985 16986 verifyFormat("Foo::operator&();", Style); 16987 verifyFormat("Foo::operator void &();", Style); 16988 verifyFormat("Foo::operator()(void &);", Style); 16989 verifyFormat("Foo::operator&(void &);", Style); 16990 verifyFormat("Foo::operator&();", Style); 16991 verifyFormat("operator&(int (&)(), class Foo);", Style); 16992 16993 verifyFormat("Foo::operator&&();", Style); 16994 verifyFormat("Foo::operator**();", Style); 16995 verifyFormat("Foo::operator void &&();", Style); 16996 verifyFormat("Foo::operator()(void &&);", Style); 16997 verifyFormat("Foo::operator&&(void &&);", Style); 16998 verifyFormat("Foo::operator&&();", Style); 16999 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 17000 verifyFormat("operator const nsTArrayRight<E> &()", Style); 17001 verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()", 17002 Style); 17003 verifyFormat("operator void **()", Style); 17004 verifyFormat("operator const FooRight<Object> &()", Style); 17005 verifyFormat("operator const FooRight<Object> *()", Style); 17006 verifyFormat("operator const FooRight<Object> **()", Style); 17007 verifyFormat("operator const FooRight<Object> *&()", Style); 17008 verifyFormat("operator const FooRight<Object> *&&()", Style); 17009 17010 Style.PointerAlignment = FormatStyle::PAS_Left; 17011 verifyFormat("Foo::operator*();", Style); 17012 verifyFormat("Foo::operator**();", Style); 17013 verifyFormat("Foo::operator void*();", Style); 17014 verifyFormat("Foo::operator void**();", Style); 17015 verifyFormat("Foo::operator void*&();", Style); 17016 verifyFormat("Foo::operator/*comment*/ void*();", Style); 17017 verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); 17018 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); 17019 verifyFormat("Foo::operator()(void*);", Style); 17020 verifyFormat("Foo::operator*(void*);", Style); 17021 verifyFormat("Foo::operator*();", Style); 17022 verifyFormat("Foo::operator<int>*();", Style); 17023 verifyFormat("Foo::operator<Foo>*();", Style); 17024 verifyFormat("Foo::operator<int>**();", Style); 17025 verifyFormat("Foo::operator<Foo>**();", Style); 17026 verifyFormat("Foo::operator<Foo>*&();", Style); 17027 verifyFormat("Foo::operator<int>&();", Style); 17028 verifyFormat("Foo::operator<Foo>&();", Style); 17029 verifyFormat("Foo::operator<int>&&();", Style); 17030 verifyFormat("Foo::operator<Foo>&&();", Style); 17031 verifyFormat("Foo::operator<int>*&();", Style); 17032 verifyFormat("Foo::operator<Foo>*&();", Style); 17033 verifyFormat("operator*(int (*)(), class Foo);", Style); 17034 17035 verifyFormat("Foo::operator&();", Style); 17036 verifyFormat("Foo::operator void&();", Style); 17037 verifyFormat("Foo::operator/*comment*/ void&();", Style); 17038 verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); 17039 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); 17040 verifyFormat("Foo::operator()(void&);", Style); 17041 verifyFormat("Foo::operator&(void&);", Style); 17042 verifyFormat("Foo::operator&();", Style); 17043 verifyFormat("operator&(int (&)(), class Foo);", Style); 17044 17045 verifyFormat("Foo::operator&&();", Style); 17046 verifyFormat("Foo::operator void&&();", Style); 17047 verifyFormat("Foo::operator/*comment*/ void&&();", Style); 17048 verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); 17049 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); 17050 verifyFormat("Foo::operator()(void&&);", Style); 17051 verifyFormat("Foo::operator&&(void&&);", Style); 17052 verifyFormat("Foo::operator&&();", Style); 17053 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 17054 verifyFormat("operator const nsTArrayLeft<E>&()", Style); 17055 verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()", 17056 Style); 17057 verifyFormat("operator void**()", Style); 17058 verifyFormat("operator const FooLeft<Object>&()", Style); 17059 verifyFormat("operator const FooLeft<Object>*()", Style); 17060 verifyFormat("operator const FooLeft<Object>**()", Style); 17061 verifyFormat("operator const FooLeft<Object>*&()", Style); 17062 verifyFormat("operator const FooLeft<Object>*&&()", Style); 17063 17064 // PR45107 17065 verifyFormat("operator Vector<String>&();", Style); 17066 verifyFormat("operator const Vector<String>&();", Style); 17067 verifyFormat("operator foo::Bar*();", Style); 17068 verifyFormat("operator const Foo<X>::Bar<Y>*();", Style); 17069 verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();", 17070 Style); 17071 17072 Style.PointerAlignment = FormatStyle::PAS_Middle; 17073 verifyFormat("Foo::operator*();", Style); 17074 verifyFormat("Foo::operator void *();", Style); 17075 verifyFormat("Foo::operator()(void *);", Style); 17076 verifyFormat("Foo::operator*(void *);", Style); 17077 verifyFormat("Foo::operator*();", Style); 17078 verifyFormat("operator*(int (*)(), class Foo);", Style); 17079 17080 verifyFormat("Foo::operator&();", Style); 17081 verifyFormat("Foo::operator void &();", Style); 17082 verifyFormat("Foo::operator()(void &);", Style); 17083 verifyFormat("Foo::operator&(void &);", Style); 17084 verifyFormat("Foo::operator&();", Style); 17085 verifyFormat("operator&(int (&)(), class Foo);", Style); 17086 17087 verifyFormat("Foo::operator&&();", Style); 17088 verifyFormat("Foo::operator void &&();", Style); 17089 verifyFormat("Foo::operator()(void &&);", Style); 17090 verifyFormat("Foo::operator&&(void &&);", Style); 17091 verifyFormat("Foo::operator&&();", Style); 17092 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 17093 } 17094 17095 TEST_F(FormatTest, OperatorPassedAsAFunctionPtr) { 17096 FormatStyle Style = getLLVMStyle(); 17097 // PR46157 17098 verifyFormat("foo(operator+, -42);", Style); 17099 verifyFormat("foo(operator++, -42);", Style); 17100 verifyFormat("foo(operator--, -42);", Style); 17101 verifyFormat("foo(-42, operator--);", Style); 17102 verifyFormat("foo(-42, operator, );", Style); 17103 verifyFormat("foo(operator, , -42);", Style); 17104 } 17105 17106 TEST_F(FormatTest, WhitespaceSensitiveMacros) { 17107 FormatStyle Style = getLLVMStyle(); 17108 Style.WhitespaceSensitiveMacros.push_back("FOO"); 17109 17110 // Don't use the helpers here, since 'mess up' will change the whitespace 17111 // and these are all whitespace sensitive by definition 17112 EXPECT_EQ("FOO(String-ized&Messy+But(: :Still)=Intentional);", 17113 format("FOO(String-ized&Messy+But(: :Still)=Intentional);", Style)); 17114 EXPECT_EQ( 17115 "FOO(String-ized&Messy+But\\(: :Still)=Intentional);", 17116 format("FOO(String-ized&Messy+But\\(: :Still)=Intentional);", Style)); 17117 EXPECT_EQ("FOO(String-ized&Messy+But,: :Still=Intentional);", 17118 format("FOO(String-ized&Messy+But,: :Still=Intentional);", Style)); 17119 EXPECT_EQ("FOO(String-ized&Messy+But,: :\n" 17120 " Still=Intentional);", 17121 format("FOO(String-ized&Messy+But,: :\n" 17122 " Still=Intentional);", 17123 Style)); 17124 Style.AlignConsecutiveAssignments = true; 17125 EXPECT_EQ("FOO(String-ized=&Messy+But,: :\n" 17126 " Still=Intentional);", 17127 format("FOO(String-ized=&Messy+But,: :\n" 17128 " Still=Intentional);", 17129 Style)); 17130 17131 Style.ColumnLimit = 21; 17132 EXPECT_EQ("FOO(String-ized&Messy+But: :Still=Intentional);", 17133 format("FOO(String-ized&Messy+But: :Still=Intentional);", Style)); 17134 } 17135 17136 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) { 17137 // These tests are not in NamespaceFixer because that doesn't 17138 // test its interaction with line wrapping 17139 FormatStyle Style = getLLVMStyle(); 17140 Style.ColumnLimit = 80; 17141 verifyFormat("namespace {\n" 17142 "int i;\n" 17143 "int j;\n" 17144 "} // namespace", 17145 Style); 17146 17147 verifyFormat("namespace AAA {\n" 17148 "int i;\n" 17149 "int j;\n" 17150 "} // namespace AAA", 17151 Style); 17152 17153 EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n" 17154 "int i;\n" 17155 "int j;\n" 17156 "} // namespace Averyveryveryverylongnamespace", 17157 format("namespace Averyveryveryverylongnamespace {\n" 17158 "int i;\n" 17159 "int j;\n" 17160 "}", 17161 Style)); 17162 17163 EXPECT_EQ( 17164 "namespace " 17165 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 17166 " went::mad::now {\n" 17167 "int i;\n" 17168 "int j;\n" 17169 "} // namespace\n" 17170 " // " 17171 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 17172 "went::mad::now", 17173 format("namespace " 17174 "would::it::save::you::a::lot::of::time::if_::i::" 17175 "just::gave::up::and_::went::mad::now {\n" 17176 "int i;\n" 17177 "int j;\n" 17178 "}", 17179 Style)); 17180 17181 // This used to duplicate the comment again and again on subsequent runs 17182 EXPECT_EQ( 17183 "namespace " 17184 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 17185 " went::mad::now {\n" 17186 "int i;\n" 17187 "int j;\n" 17188 "} // namespace\n" 17189 " // " 17190 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 17191 "went::mad::now", 17192 format("namespace " 17193 "would::it::save::you::a::lot::of::time::if_::i::" 17194 "just::gave::up::and_::went::mad::now {\n" 17195 "int i;\n" 17196 "int j;\n" 17197 "} // namespace\n" 17198 " // " 17199 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::" 17200 "and_::went::mad::now", 17201 Style)); 17202 } 17203 17204 TEST_F(FormatTest, LikelyUnlikely) { 17205 FormatStyle Style = getLLVMStyle(); 17206 17207 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17208 " return 29;\n" 17209 "}", 17210 Style); 17211 17212 verifyFormat("if (argc > 5) [[likely]] {\n" 17213 " return 29;\n" 17214 "}", 17215 Style); 17216 17217 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17218 " return 29;\n" 17219 "} else [[likely]] {\n" 17220 " return 42;\n" 17221 "}\n", 17222 Style); 17223 17224 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17225 " return 29;\n" 17226 "} else if (argc > 10) [[likely]] {\n" 17227 " return 99;\n" 17228 "} else {\n" 17229 " return 42;\n" 17230 "}\n", 17231 Style); 17232 17233 verifyFormat("if (argc > 5) [[gnu::unused]] {\n" 17234 " return 29;\n" 17235 "}", 17236 Style); 17237 } 17238 17239 TEST_F(FormatTest, PenaltyIndentedWhitespace) { 17240 verifyFormat("Constructor()\n" 17241 " : aaaaaa(aaaaaa), aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 17242 " aaaa(aaaaaaaaaaaaaaaaaa, " 17243 "aaaaaaaaaaaaaaaaaat))"); 17244 verifyFormat("Constructor()\n" 17245 " : aaaaaaaaaaaaa(aaaaaa), " 17246 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa)"); 17247 17248 FormatStyle StyleWithWhitespacePenalty = getLLVMStyle(); 17249 StyleWithWhitespacePenalty.PenaltyIndentedWhitespace = 5; 17250 verifyFormat("Constructor()\n" 17251 " : aaaaaa(aaaaaa),\n" 17252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 17253 " aaaa(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaat))", 17254 StyleWithWhitespacePenalty); 17255 verifyFormat("Constructor()\n" 17256 " : aaaaaaaaaaaaa(aaaaaa), " 17257 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa)", 17258 StyleWithWhitespacePenalty); 17259 } 17260 17261 TEST_F(FormatTest, LLVMDefaultStyle) { 17262 FormatStyle Style = getLLVMStyle(); 17263 verifyFormat("extern \"C\" {\n" 17264 "int foo();\n" 17265 "}", 17266 Style); 17267 } 17268 TEST_F(FormatTest, GNUDefaultStyle) { 17269 FormatStyle Style = getGNUStyle(); 17270 verifyFormat("extern \"C\"\n" 17271 "{\n" 17272 " int foo ();\n" 17273 "}", 17274 Style); 17275 } 17276 TEST_F(FormatTest, MozillaDefaultStyle) { 17277 FormatStyle Style = getMozillaStyle(); 17278 verifyFormat("extern \"C\"\n" 17279 "{\n" 17280 " int foo();\n" 17281 "}", 17282 Style); 17283 } 17284 TEST_F(FormatTest, GoogleDefaultStyle) { 17285 FormatStyle Style = getGoogleStyle(); 17286 verifyFormat("extern \"C\" {\n" 17287 "int foo();\n" 17288 "}", 17289 Style); 17290 } 17291 TEST_F(FormatTest, ChromiumDefaultStyle) { 17292 FormatStyle Style = getChromiumStyle(FormatStyle::LanguageKind::LK_Cpp); 17293 verifyFormat("extern \"C\" {\n" 17294 "int foo();\n" 17295 "}", 17296 Style); 17297 } 17298 TEST_F(FormatTest, MicrosoftDefaultStyle) { 17299 FormatStyle Style = getMicrosoftStyle(FormatStyle::LanguageKind::LK_Cpp); 17300 verifyFormat("extern \"C\"\n" 17301 "{\n" 17302 " int foo();\n" 17303 "}", 17304 Style); 17305 } 17306 TEST_F(FormatTest, WebKitDefaultStyle) { 17307 FormatStyle Style = getWebKitStyle(); 17308 verifyFormat("extern \"C\" {\n" 17309 "int foo();\n" 17310 "}", 17311 Style); 17312 } 17313 17314 TEST_F(FormatTest, ConceptsAndRequires) { 17315 FormatStyle Style = getLLVMStyle(); 17316 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 17317 17318 verifyFormat("template <typename T>\n" 17319 "concept Hashable = requires(T a) {\n" 17320 " { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n" 17321 "};", 17322 Style); 17323 verifyFormat("template <typename T>\n" 17324 "concept EqualityComparable = requires(T a, T b) {\n" 17325 " { a == b } -> bool;\n" 17326 "};", 17327 Style); 17328 verifyFormat("template <typename T>\n" 17329 "concept EqualityComparable = requires(T a, T b) {\n" 17330 " { a == b } -> bool;\n" 17331 " { a != b } -> bool;\n" 17332 "};", 17333 Style); 17334 verifyFormat("template <typename T>\n" 17335 "concept EqualityComparable = requires(T a, T b) {\n" 17336 " { a == b } -> bool;\n" 17337 " { a != b } -> bool;\n" 17338 "};", 17339 Style); 17340 17341 verifyFormat("template <typename It>\n" 17342 "requires Iterator<It>\n" 17343 "void sort(It begin, It end) {\n" 17344 " //....\n" 17345 "}", 17346 Style); 17347 17348 verifyFormat("template <typename T>\n" 17349 "concept Large = sizeof(T) > 10;", 17350 Style); 17351 17352 verifyFormat("template <typename T, typename U>\n" 17353 "concept FooableWith = requires(T t, U u) {\n" 17354 " typename T::foo_type;\n" 17355 " { t.foo(u) } -> typename T::foo_type;\n" 17356 " t++;\n" 17357 "};\n" 17358 "void doFoo(FooableWith<int> auto t) {\n" 17359 " t.foo(3);\n" 17360 "}", 17361 Style); 17362 verifyFormat("template <typename T>\n" 17363 "concept Context = sizeof(T) == 1;", 17364 Style); 17365 verifyFormat("template <typename T>\n" 17366 "concept Context = is_specialization_of_v<context, T>;", 17367 Style); 17368 verifyFormat("template <typename T>\n" 17369 "concept Node = std::is_object_v<T>;", 17370 Style); 17371 verifyFormat("template <typename T>\n" 17372 "concept Tree = true;", 17373 Style); 17374 17375 verifyFormat("template <typename T> int g(T i) requires Concept1<I> {\n" 17376 " //...\n" 17377 "}", 17378 Style); 17379 17380 verifyFormat( 17381 "template <typename T> int g(T i) requires Concept1<I> && Concept2<I> {\n" 17382 " //...\n" 17383 "}", 17384 Style); 17385 17386 verifyFormat( 17387 "template <typename T> int g(T i) requires Concept1<I> || Concept2<I> {\n" 17388 " //...\n" 17389 "}", 17390 Style); 17391 17392 verifyFormat("template <typename T>\n" 17393 "veryveryvery_long_return_type g(T i) requires Concept1<I> || " 17394 "Concept2<I> {\n" 17395 " //...\n" 17396 "}", 17397 Style); 17398 17399 verifyFormat("template <typename T>\n" 17400 "veryveryvery_long_return_type g(T i) requires Concept1<I> && " 17401 "Concept2<I> {\n" 17402 " //...\n" 17403 "}", 17404 Style); 17405 17406 verifyFormat( 17407 "template <typename T>\n" 17408 "veryveryvery_long_return_type g(T i) requires Concept1 && Concept2 {\n" 17409 " //...\n" 17410 "}", 17411 Style); 17412 17413 verifyFormat( 17414 "template <typename T>\n" 17415 "veryveryvery_long_return_type g(T i) requires Concept1 || Concept2 {\n" 17416 " //...\n" 17417 "}", 17418 Style); 17419 17420 verifyFormat("template <typename It>\n" 17421 "requires Foo<It>() && Bar<It> {\n" 17422 " //....\n" 17423 "}", 17424 Style); 17425 17426 verifyFormat("template <typename It>\n" 17427 "requires Foo<Bar<It>>() && Bar<Foo<It, It>> {\n" 17428 " //....\n" 17429 "}", 17430 Style); 17431 17432 verifyFormat("template <typename It>\n" 17433 "requires Foo<Bar<It, It>>() && Bar<Foo<It, It>> {\n" 17434 " //....\n" 17435 "}", 17436 Style); 17437 17438 verifyFormat( 17439 "template <typename It>\n" 17440 "requires Foo<Bar<It>, Baz<It>>() && Bar<Foo<It>, Baz<It, It>> {\n" 17441 " //....\n" 17442 "}", 17443 Style); 17444 17445 Style.IndentRequires = true; 17446 verifyFormat("template <typename It>\n" 17447 " requires Iterator<It>\n" 17448 "void sort(It begin, It end) {\n" 17449 " //....\n" 17450 "}", 17451 Style); 17452 verifyFormat("template <std::size index_>\n" 17453 " requires(index_ < sizeof...(Children_))\n" 17454 "Tree auto &child() {\n" 17455 " // ...\n" 17456 "}", 17457 Style); 17458 17459 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 17460 verifyFormat("template <typename T>\n" 17461 "concept Hashable = requires (T a) {\n" 17462 " { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n" 17463 "};", 17464 Style); 17465 17466 verifyFormat("template <class T = void>\n" 17467 " requires EqualityComparable<T> || Same<T, void>\n" 17468 "struct equal_to;", 17469 Style); 17470 17471 verifyFormat("template <class T>\n" 17472 " requires requires {\n" 17473 " T{};\n" 17474 " T (int);\n" 17475 " }\n", 17476 Style); 17477 17478 Style.ColumnLimit = 78; 17479 verifyFormat("template <typename T>\n" 17480 "concept Context = Traits<typename T::traits_type> and\n" 17481 " Interface<typename T::interface_type> and\n" 17482 " Request<typename T::request_type> and\n" 17483 " Response<typename T::response_type> and\n" 17484 " ContextExtension<typename T::extension_type> and\n" 17485 " ::std::is_copy_constructable<T> and " 17486 "::std::is_move_constructable<T> and\n" 17487 " requires (T c) {\n" 17488 " { c.response; } -> Response;\n" 17489 "} and requires (T c) {\n" 17490 " { c.request; } -> Request;\n" 17491 "}\n", 17492 Style); 17493 17494 verifyFormat("template <typename T>\n" 17495 "concept Context = Traits<typename T::traits_type> or\n" 17496 " Interface<typename T::interface_type> or\n" 17497 " Request<typename T::request_type> or\n" 17498 " Response<typename T::response_type> or\n" 17499 " ContextExtension<typename T::extension_type> or\n" 17500 " ::std::is_copy_constructable<T> or " 17501 "::std::is_move_constructable<T> or\n" 17502 " requires (T c) {\n" 17503 " { c.response; } -> Response;\n" 17504 "} or requires (T c) {\n" 17505 " { c.request; } -> Request;\n" 17506 "}\n", 17507 Style); 17508 17509 verifyFormat("template <typename T>\n" 17510 "concept Context = Traits<typename T::traits_type> &&\n" 17511 " Interface<typename T::interface_type> &&\n" 17512 " Request<typename T::request_type> &&\n" 17513 " Response<typename T::response_type> &&\n" 17514 " ContextExtension<typename T::extension_type> &&\n" 17515 " ::std::is_copy_constructable<T> && " 17516 "::std::is_move_constructable<T> &&\n" 17517 " requires (T c) {\n" 17518 " { c.response; } -> Response;\n" 17519 "} && requires (T c) {\n" 17520 " { c.request; } -> Request;\n" 17521 "}\n", 17522 Style); 17523 17524 verifyFormat("template <typename T>\nconcept someConcept = Constraint1<T> && " 17525 "Constraint2<T>;"); 17526 17527 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 17528 Style.BraceWrapping.AfterFunction = true; 17529 Style.BraceWrapping.AfterClass = true; 17530 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 17531 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 17532 verifyFormat("void Foo () requires (std::copyable<T>)\n" 17533 "{\n" 17534 " return\n" 17535 "}\n", 17536 Style); 17537 17538 verifyFormat("void Foo () requires std::copyable<T>\n" 17539 "{\n" 17540 " return\n" 17541 "}\n", 17542 Style); 17543 17544 verifyFormat("template <std::semiregular F, std::semiregular... Args>\n" 17545 " requires (std::invocable<F, std::invoke_result_t<Args>...>)\n" 17546 "struct constant;", 17547 Style); 17548 17549 verifyFormat("template <std::semiregular F, std::semiregular... Args>\n" 17550 " requires std::invocable<F, std::invoke_result_t<Args>...>\n" 17551 "struct constant;", 17552 Style); 17553 17554 verifyFormat("template <class T>\n" 17555 "class plane_with_very_very_very_long_name\n" 17556 "{\n" 17557 " constexpr plane_with_very_very_very_long_name () requires " 17558 "std::copyable<T>\n" 17559 " : plane_with_very_very_very_long_name (1)\n" 17560 " {\n" 17561 " }\n" 17562 "}\n", 17563 Style); 17564 17565 verifyFormat("template <class T>\n" 17566 "class plane_with_long_name\n" 17567 "{\n" 17568 " constexpr plane_with_long_name () requires std::copyable<T>\n" 17569 " : plane_with_long_name (1)\n" 17570 " {\n" 17571 " }\n" 17572 "}\n", 17573 Style); 17574 17575 Style.BreakBeforeConceptDeclarations = false; 17576 verifyFormat("template <typename T> concept Tree = true;", Style); 17577 17578 Style.IndentRequires = false; 17579 verifyFormat("template <std::semiregular F, std::semiregular... Args>\n" 17580 "requires (std::invocable<F, std::invoke_result_t<Args>...>) " 17581 "struct constant;", 17582 Style); 17583 } 17584 17585 TEST_F(FormatTest, IndentPragmas) { 17586 FormatStyle Style = getLLVMStyle(); 17587 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 17588 17589 Style.IndentPragmas = false; 17590 verifyFormat("#pragma once", Style); 17591 verifyFormat("#pragma omp simd\n" 17592 "for (int i = 0; i < 10; i++) {\n" 17593 "}", 17594 Style); 17595 verifyFormat("void foo() {\n" 17596 "#pragma omp simd\n" 17597 " for (int i = 0; i < 10; i++) {\n" 17598 " }\n" 17599 "}", 17600 Style); 17601 verifyFormat("void foo() {\n" 17602 "// outer loop\n" 17603 "#pragma omp simd\n" 17604 " for (int k = 0; k < 10; k++) {\n" 17605 "// inner loop\n" 17606 "#pragma omp simd\n" 17607 " for (int j = 0; j < 10; j++) {\n" 17608 " }\n" 17609 " }\n" 17610 "}", 17611 Style); 17612 17613 verifyFormat("void foo() {\n" 17614 "// outer loop\n" 17615 "#if 1\n" 17616 "#pragma omp simd\n" 17617 " for (int k = 0; k < 10; k++) {\n" 17618 "// inner loop\n" 17619 "#pragma omp simd\n" 17620 " for (int j = 0; j < 10; j++) {\n" 17621 " }\n" 17622 " }\n" 17623 "#endif\n" 17624 "}", 17625 Style); 17626 17627 Style.IndentPragmas = true; 17628 verifyFormat("#pragma once", Style); 17629 verifyFormat("#pragma omp simd\n" 17630 "for (int i = 0; i < 10; i++) {\n" 17631 "}", 17632 Style); 17633 verifyFormat("void foo() {\n" 17634 " #pragma omp simd\n" 17635 " for (int i = 0; i < 10; i++) {\n" 17636 " }\n" 17637 "}", 17638 Style); 17639 verifyFormat("void foo() {\n" 17640 " #pragma omp simd\n" 17641 " for (int i = 0; i < 10; i++) {\n" 17642 " #pragma omp simd\n" 17643 " for (int j = 0; j < 10; j++) {\n" 17644 " }\n" 17645 " }\n" 17646 "}", 17647 Style); 17648 17649 verifyFormat("void foo() {\n" 17650 " #pragma omp simd\n" 17651 " for (...) {\n" 17652 " #pragma omp simd\n" 17653 " for (...) {\n" 17654 " }\n" 17655 " }\n" 17656 "}", 17657 Style); 17658 17659 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 17660 17661 verifyFormat("void foo() {\n" 17662 "# pragma omp simd\n" 17663 " for (int i = 0; i < 10; i++) {\n" 17664 "# pragma omp simd\n" 17665 " for (int j = 0; j < 10; j++) {\n" 17666 " }\n" 17667 " }\n" 17668 "}", 17669 Style); 17670 17671 verifyFormat("void foo() {\n" 17672 "#if 1\n" 17673 "# pragma omp simd\n" 17674 " for (int k = 0; k < 10; k++) {\n" 17675 "# pragma omp simd\n" 17676 " for (int j = 0; j < 10; j++) {\n" 17677 " }\n" 17678 " }\n" 17679 "#endif\n" 17680 "}", 17681 Style); 17682 17683 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 17684 EXPECT_EQ("void foo() {\n" 17685 "#if 1\n" 17686 " #pragma omp simd\n" 17687 " for (int k = 0; k < 10; k++) {\n" 17688 " #pragma omp simd\n" 17689 " for (int j = 0; j < 10; j++) {\n" 17690 " }\n" 17691 " }\n" 17692 "#endif\n" 17693 "}", 17694 format("void foo() {\n" 17695 "#if 1\n" 17696 " #pragma omp simd\n" 17697 " for (int k = 0; k < 10; k++) {\n" 17698 " #pragma omp simd\n" 17699 " for (int j = 0; j < 10; j++) {\n" 17700 " }\n" 17701 " }\n" 17702 "#endif\n" 17703 "}", 17704 Style)); 17705 } 17706 17707 } // namespace 17708 } // namespace format 17709 } // namespace clang 17710