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, BreakConstructorInitializersAfterColon) { 4996 FormatStyle Style = getLLVMStyle(); 4997 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4998 4999 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 5000 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 5001 getStyleWithColumns(Style, 45)); 5002 verifyFormat("Constructor() :\n" 5003 " Initializer(FitsOnTheLine) {}", 5004 getStyleWithColumns(Style, 44)); 5005 verifyFormat("Constructor() :\n" 5006 " Initializer(FitsOnTheLine) {}", 5007 getStyleWithColumns(Style, 43)); 5008 5009 verifyFormat("template <typename T>\n" 5010 "Constructor() : Initializer(FitsOnTheLine) {}", 5011 getStyleWithColumns(Style, 50)); 5012 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5013 verifyFormat( 5014 "SomeClass::Constructor() :\n" 5015 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5016 Style); 5017 5018 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 5019 verifyFormat( 5020 "SomeClass::Constructor() :\n" 5021 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5022 Style); 5023 5024 verifyFormat( 5025 "SomeClass::Constructor() :\n" 5026 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5027 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5028 Style); 5029 verifyFormat( 5030 "SomeClass::Constructor() :\n" 5031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5032 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 5033 Style); 5034 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5035 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5036 " aaaaaaaaaa(aaaaaa) {}", 5037 Style); 5038 5039 verifyFormat("Constructor() :\n" 5040 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5041 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5042 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5043 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 5044 Style); 5045 5046 verifyFormat("Constructor() :\n" 5047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5049 Style); 5050 5051 verifyFormat("Constructor(int Parameter = 0) :\n" 5052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 5053 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 5054 Style); 5055 verifyFormat("Constructor() :\n" 5056 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 5057 "}", 5058 getStyleWithColumns(Style, 60)); 5059 verifyFormat("Constructor() :\n" 5060 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5061 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 5062 Style); 5063 5064 // Here a line could be saved by splitting the second initializer onto two 5065 // lines, but that is not desirable. 5066 verifyFormat("Constructor() :\n" 5067 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 5068 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 5069 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5070 Style); 5071 5072 FormatStyle OnePerLine = Style; 5073 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5074 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 5075 verifyFormat("SomeClass::Constructor() :\n" 5076 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5077 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5078 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5079 OnePerLine); 5080 verifyFormat("SomeClass::Constructor() :\n" 5081 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 5082 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5083 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5084 OnePerLine); 5085 verifyFormat("MyClass::MyClass(int var) :\n" 5086 " some_var_(var), // 4 space indent\n" 5087 " some_other_var_(var + 1) { // lined up\n" 5088 "}", 5089 OnePerLine); 5090 verifyFormat("Constructor() :\n" 5091 " aaaaa(aaaaaa),\n" 5092 " aaaaa(aaaaaa),\n" 5093 " aaaaa(aaaaaa),\n" 5094 " aaaaa(aaaaaa),\n" 5095 " aaaaa(aaaaaa) {}", 5096 OnePerLine); 5097 verifyFormat("Constructor() :\n" 5098 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 5099 " aaaaaaaaaaaaaaaaaaaaaa) {}", 5100 OnePerLine); 5101 OnePerLine.BinPackParameters = false; 5102 verifyFormat("Constructor() :\n" 5103 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5104 " aaaaaaaaaaa().aaa(),\n" 5105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5106 OnePerLine); 5107 OnePerLine.ColumnLimit = 60; 5108 verifyFormat("Constructor() :\n" 5109 " aaaaaaaaaaaaaaaaaaaa(a),\n" 5110 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 5111 OnePerLine); 5112 5113 EXPECT_EQ("Constructor() :\n" 5114 " // Comment forcing unwanted break.\n" 5115 " aaaa(aaaa) {}", 5116 format("Constructor() :\n" 5117 " // Comment forcing unwanted break.\n" 5118 " aaaa(aaaa) {}", 5119 Style)); 5120 5121 Style.ColumnLimit = 0; 5122 verifyFormat("SomeClass::Constructor() :\n" 5123 " a(a) {}", 5124 Style); 5125 verifyFormat("SomeClass::Constructor() noexcept :\n" 5126 " a(a) {}", 5127 Style); 5128 verifyFormat("SomeClass::Constructor() :\n" 5129 " a(a), b(b), c(c) {}", 5130 Style); 5131 verifyFormat("SomeClass::Constructor() :\n" 5132 " a(a) {\n" 5133 " foo();\n" 5134 " bar();\n" 5135 "}", 5136 Style); 5137 5138 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 5139 verifyFormat("SomeClass::Constructor() :\n" 5140 " a(a), b(b), c(c) {\n" 5141 "}", 5142 Style); 5143 verifyFormat("SomeClass::Constructor() :\n" 5144 " a(a) {\n" 5145 "}", 5146 Style); 5147 5148 Style.ColumnLimit = 80; 5149 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 5150 Style.ConstructorInitializerIndentWidth = 2; 5151 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 5152 verifyFormat("SomeClass::Constructor() :\n" 5153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5154 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 5155 Style); 5156 5157 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 5158 // well 5159 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 5160 verifyFormat( 5161 "class SomeClass\n" 5162 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5163 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5164 Style); 5165 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 5166 verifyFormat( 5167 "class SomeClass\n" 5168 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5169 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5170 Style); 5171 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 5172 verifyFormat( 5173 "class SomeClass :\n" 5174 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5175 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5176 Style); 5177 } 5178 5179 #ifndef EXPENSIVE_CHECKS 5180 // Expensive checks enables libstdc++ checking which includes validating the 5181 // state of ranges used in std::priority_queue - this blows out the 5182 // runtime/scalability of the function and makes this test unacceptably slow. 5183 TEST_F(FormatTest, MemoizationTests) { 5184 // This breaks if the memoization lookup does not take \c Indent and 5185 // \c LastSpace into account. 5186 verifyFormat( 5187 "extern CFRunLoopTimerRef\n" 5188 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 5189 " CFTimeInterval interval, CFOptionFlags flags,\n" 5190 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 5191 " CFRunLoopTimerContext *context) {}"); 5192 5193 // Deep nesting somewhat works around our memoization. 5194 verifyFormat( 5195 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5196 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5197 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5198 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5199 " aaaaa())))))))))))))))))))))))))))))))))))))));", 5200 getLLVMStyleWithColumns(65)); 5201 verifyFormat( 5202 "aaaaa(\n" 5203 " aaaaa,\n" 5204 " aaaaa(\n" 5205 " aaaaa,\n" 5206 " aaaaa(\n" 5207 " aaaaa,\n" 5208 " aaaaa(\n" 5209 " aaaaa,\n" 5210 " aaaaa(\n" 5211 " aaaaa,\n" 5212 " aaaaa(\n" 5213 " aaaaa,\n" 5214 " aaaaa(\n" 5215 " aaaaa,\n" 5216 " aaaaa(\n" 5217 " aaaaa,\n" 5218 " aaaaa(\n" 5219 " aaaaa,\n" 5220 " aaaaa(\n" 5221 " aaaaa,\n" 5222 " aaaaa(\n" 5223 " aaaaa,\n" 5224 " aaaaa(\n" 5225 " aaaaa,\n" 5226 " aaaaa))))))))))));", 5227 getLLVMStyleWithColumns(65)); 5228 verifyFormat( 5229 "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" 5230 " a),\n" 5231 " a),\n" 5232 " a),\n" 5233 " a),\n" 5234 " a),\n" 5235 " a),\n" 5236 " a),\n" 5237 " a),\n" 5238 " a),\n" 5239 " a),\n" 5240 " a),\n" 5241 " a),\n" 5242 " a),\n" 5243 " a),\n" 5244 " a),\n" 5245 " a),\n" 5246 " a)", 5247 getLLVMStyleWithColumns(65)); 5248 5249 // This test takes VERY long when memoization is broken. 5250 FormatStyle OnePerLine = getLLVMStyle(); 5251 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5252 OnePerLine.BinPackParameters = false; 5253 std::string input = "Constructor()\n" 5254 " : aaaa(a,\n"; 5255 for (unsigned i = 0, e = 80; i != e; ++i) { 5256 input += " a,\n"; 5257 } 5258 input += " a) {}"; 5259 verifyFormat(input, OnePerLine); 5260 } 5261 #endif 5262 5263 TEST_F(FormatTest, BreaksAsHighAsPossible) { 5264 verifyFormat( 5265 "void f() {\n" 5266 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 5267 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 5268 " f();\n" 5269 "}"); 5270 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 5271 " Intervals[i - 1].getRange().getLast()) {\n}"); 5272 } 5273 5274 TEST_F(FormatTest, BreaksFunctionDeclarations) { 5275 // Principially, we break function declarations in a certain order: 5276 // 1) break amongst arguments. 5277 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 5278 " Cccccccccccccc cccccccccccccc);"); 5279 verifyFormat("template <class TemplateIt>\n" 5280 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 5281 " TemplateIt *stop) {}"); 5282 5283 // 2) break after return type. 5284 verifyFormat( 5285 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5286 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 5287 getGoogleStyle()); 5288 5289 // 3) break after (. 5290 verifyFormat( 5291 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 5292 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 5293 getGoogleStyle()); 5294 5295 // 4) break before after nested name specifiers. 5296 verifyFormat( 5297 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5298 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 5299 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 5300 getGoogleStyle()); 5301 5302 // However, there are exceptions, if a sufficient amount of lines can be 5303 // saved. 5304 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 5305 // more adjusting. 5306 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5307 " Cccccccccccccc cccccccccc,\n" 5308 " Cccccccccccccc cccccccccc,\n" 5309 " Cccccccccccccc cccccccccc,\n" 5310 " Cccccccccccccc cccccccccc);"); 5311 verifyFormat( 5312 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5313 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5314 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5315 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 5316 getGoogleStyle()); 5317 verifyFormat( 5318 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5319 " Cccccccccccccc cccccccccc,\n" 5320 " Cccccccccccccc cccccccccc,\n" 5321 " Cccccccccccccc cccccccccc,\n" 5322 " Cccccccccccccc cccccccccc,\n" 5323 " Cccccccccccccc cccccccccc,\n" 5324 " Cccccccccccccc cccccccccc);"); 5325 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5326 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5327 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5328 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5329 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 5330 5331 // Break after multi-line parameters. 5332 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5333 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5335 " bbbb bbbb);"); 5336 verifyFormat("void SomeLoooooooooooongFunction(\n" 5337 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5338 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5339 " int bbbbbbbbbbbbb);"); 5340 5341 // Treat overloaded operators like other functions. 5342 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5343 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 5344 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5345 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 5346 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5347 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 5348 verifyGoogleFormat( 5349 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 5350 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5351 verifyGoogleFormat( 5352 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 5353 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5354 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5355 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5356 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 5357 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5358 verifyGoogleFormat( 5359 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 5360 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5361 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 5362 verifyGoogleFormat("template <typename T>\n" 5363 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5364 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 5365 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 5366 5367 FormatStyle Style = getLLVMStyle(); 5368 Style.PointerAlignment = FormatStyle::PAS_Left; 5369 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5370 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 5371 Style); 5372 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 5373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5374 Style); 5375 } 5376 5377 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 5378 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 5379 // Prefer keeping `::` followed by `operator` together. 5380 EXPECT_EQ("const aaaa::bbbbbbb &\n" 5381 "ccccccccc::operator++() {\n" 5382 " stuff();\n" 5383 "}", 5384 format("const aaaa::bbbbbbb\n" 5385 "&ccccccccc::operator++() { stuff(); }", 5386 getLLVMStyleWithColumns(40))); 5387 } 5388 5389 TEST_F(FormatTest, TrailingReturnType) { 5390 verifyFormat("auto foo() -> int;\n"); 5391 // correct trailing return type spacing 5392 verifyFormat("auto operator->() -> int;\n"); 5393 verifyFormat("auto operator++(int) -> int;\n"); 5394 5395 verifyFormat("struct S {\n" 5396 " auto bar() const -> int;\n" 5397 "};"); 5398 verifyFormat("template <size_t Order, typename T>\n" 5399 "auto load_img(const std::string &filename)\n" 5400 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5401 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5402 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5403 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5404 verifyFormat("template <typename T>\n" 5405 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5406 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5407 5408 // Not trailing return types. 5409 verifyFormat("void f() { auto a = b->c(); }"); 5410 } 5411 5412 TEST_F(FormatTest, DeductionGuides) { 5413 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5414 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5415 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5416 verifyFormat( 5417 "template <class... T>\n" 5418 "array(T &&...t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5419 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5420 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5421 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5422 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5423 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5424 verifyFormat("template <class T> x() -> x<1>;"); 5425 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5426 5427 // Ensure not deduction guides. 5428 verifyFormat("c()->f<int>();"); 5429 verifyFormat("x()->foo<1>;"); 5430 verifyFormat("x = p->foo<3>();"); 5431 verifyFormat("x()->x<1>();"); 5432 verifyFormat("x()->x<1>;"); 5433 } 5434 5435 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5436 // Avoid breaking before trailing 'const' or other trailing annotations, if 5437 // they are not function-like. 5438 FormatStyle Style = getGoogleStyle(); 5439 Style.ColumnLimit = 47; 5440 verifyFormat("void someLongFunction(\n" 5441 " int someLoooooooooooooongParameter) const {\n}", 5442 getLLVMStyleWithColumns(47)); 5443 verifyFormat("LoooooongReturnType\n" 5444 "someLoooooooongFunction() const {}", 5445 getLLVMStyleWithColumns(47)); 5446 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5447 " const {}", 5448 Style); 5449 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5450 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5451 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5452 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5453 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5454 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5455 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5456 " aaaaaaaaaaa aaaaa) const override;"); 5457 verifyGoogleFormat( 5458 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5459 " const override;"); 5460 5461 // Even if the first parameter has to be wrapped. 5462 verifyFormat("void someLongFunction(\n" 5463 " int someLongParameter) const {}", 5464 getLLVMStyleWithColumns(46)); 5465 verifyFormat("void someLongFunction(\n" 5466 " int someLongParameter) const {}", 5467 Style); 5468 verifyFormat("void someLongFunction(\n" 5469 " int someLongParameter) override {}", 5470 Style); 5471 verifyFormat("void someLongFunction(\n" 5472 " int someLongParameter) OVERRIDE {}", 5473 Style); 5474 verifyFormat("void someLongFunction(\n" 5475 " int someLongParameter) final {}", 5476 Style); 5477 verifyFormat("void someLongFunction(\n" 5478 " int someLongParameter) FINAL {}", 5479 Style); 5480 verifyFormat("void someLongFunction(\n" 5481 " int parameter) const override {}", 5482 Style); 5483 5484 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5485 verifyFormat("void someLongFunction(\n" 5486 " int someLongParameter) const\n" 5487 "{\n" 5488 "}", 5489 Style); 5490 5491 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5492 verifyFormat("void someLongFunction(\n" 5493 " int someLongParameter) const\n" 5494 " {\n" 5495 " }", 5496 Style); 5497 5498 // Unless these are unknown annotations. 5499 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5500 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5501 " LONG_AND_UGLY_ANNOTATION;"); 5502 5503 // Breaking before function-like trailing annotations is fine to keep them 5504 // close to their arguments. 5505 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5506 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5507 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5508 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5509 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5510 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5511 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5512 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5513 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5514 5515 verifyFormat( 5516 "void aaaaaaaaaaaaaaaaaa()\n" 5517 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5518 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5519 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5520 " __attribute__((unused));"); 5521 verifyGoogleFormat( 5522 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5523 " GUARDED_BY(aaaaaaaaaaaa);"); 5524 verifyGoogleFormat( 5525 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5526 " GUARDED_BY(aaaaaaaaaaaa);"); 5527 verifyGoogleFormat( 5528 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5529 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5530 verifyGoogleFormat( 5531 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5532 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5533 } 5534 5535 TEST_F(FormatTest, FunctionAnnotations) { 5536 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5537 "int OldFunction(const string ¶meter) {}"); 5538 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5539 "string OldFunction(const string ¶meter) {}"); 5540 verifyFormat("template <typename T>\n" 5541 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5542 "string OldFunction(const string ¶meter) {}"); 5543 5544 // Not function annotations. 5545 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5546 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5547 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5548 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5549 verifyFormat("MACRO(abc).function() // wrap\n" 5550 " << abc;"); 5551 verifyFormat("MACRO(abc)->function() // wrap\n" 5552 " << abc;"); 5553 verifyFormat("MACRO(abc)::function() // wrap\n" 5554 " << abc;"); 5555 } 5556 5557 TEST_F(FormatTest, BreaksDesireably) { 5558 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5559 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5560 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5561 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5562 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5563 "}"); 5564 5565 verifyFormat( 5566 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5568 5569 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5571 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5572 5573 verifyFormat( 5574 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5575 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5577 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5579 5580 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5581 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5582 5583 verifyFormat( 5584 "void f() {\n" 5585 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5586 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5587 "}"); 5588 verifyFormat( 5589 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5590 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5591 verifyFormat( 5592 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5594 verifyFormat( 5595 "aaaaaa(aaa,\n" 5596 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5597 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5598 " aaaa);"); 5599 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5600 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5602 5603 // Indent consistently independent of call expression and unary operator. 5604 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5605 " dddddddddddddddddddddddddddddd));"); 5606 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5607 " dddddddddddddddddddddddddddddd));"); 5608 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5609 " dddddddddddddddddddddddddddddd));"); 5610 5611 // This test case breaks on an incorrect memoization, i.e. an optimization not 5612 // taking into account the StopAt value. 5613 verifyFormat( 5614 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5615 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5616 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5617 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5618 5619 verifyFormat("{\n {\n {\n" 5620 " Annotation.SpaceRequiredBefore =\n" 5621 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5622 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5623 " }\n }\n}"); 5624 5625 // Break on an outer level if there was a break on an inner level. 5626 EXPECT_EQ("f(g(h(a, // comment\n" 5627 " b, c),\n" 5628 " d, e),\n" 5629 " x, y);", 5630 format("f(g(h(a, // comment\n" 5631 " b, c), d, e), x, y);")); 5632 5633 // Prefer breaking similar line breaks. 5634 verifyFormat( 5635 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5636 " NSTrackingMouseEnteredAndExited |\n" 5637 " NSTrackingActiveAlways;"); 5638 } 5639 5640 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5641 FormatStyle NoBinPacking = getGoogleStyle(); 5642 NoBinPacking.BinPackParameters = false; 5643 NoBinPacking.BinPackArguments = true; 5644 verifyFormat("void f() {\n" 5645 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5646 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5647 "}", 5648 NoBinPacking); 5649 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5650 " int aaaaaaaaaaaaaaaaaaaa,\n" 5651 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5652 NoBinPacking); 5653 5654 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5655 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5656 " vector<int> bbbbbbbbbbbbbbb);", 5657 NoBinPacking); 5658 // FIXME: This behavior difference is probably not wanted. However, currently 5659 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5660 // template arguments from BreakBeforeParameter being set because of the 5661 // one-per-line formatting. 5662 verifyFormat( 5663 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5664 " aaaaaaaaaa> aaaaaaaaaa);", 5665 NoBinPacking); 5666 verifyFormat( 5667 "void fffffffffff(\n" 5668 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5669 " aaaaaaaaaa);"); 5670 } 5671 5672 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5673 FormatStyle NoBinPacking = getGoogleStyle(); 5674 NoBinPacking.BinPackParameters = false; 5675 NoBinPacking.BinPackArguments = false; 5676 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5677 " aaaaaaaaaaaaaaaaaaaa,\n" 5678 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5679 NoBinPacking); 5680 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5681 " aaaaaaaaaaaaa,\n" 5682 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5683 NoBinPacking); 5684 verifyFormat( 5685 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5686 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5688 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5690 NoBinPacking); 5691 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5692 " .aaaaaaaaaaaaaaaaaa();", 5693 NoBinPacking); 5694 verifyFormat("void f() {\n" 5695 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5696 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5697 "}", 5698 NoBinPacking); 5699 5700 verifyFormat( 5701 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5702 " aaaaaaaaaaaa,\n" 5703 " aaaaaaaaaaaa);", 5704 NoBinPacking); 5705 verifyFormat( 5706 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5707 " ddddddddddddddddddddddddddddd),\n" 5708 " test);", 5709 NoBinPacking); 5710 5711 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5712 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5713 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5714 " aaaaaaaaaaaaaaaaaa;", 5715 NoBinPacking); 5716 verifyFormat("a(\"a\"\n" 5717 " \"a\",\n" 5718 " a);"); 5719 5720 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5721 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5722 " aaaaaaaaa,\n" 5723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5724 NoBinPacking); 5725 verifyFormat( 5726 "void f() {\n" 5727 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5728 " .aaaaaaa();\n" 5729 "}", 5730 NoBinPacking); 5731 verifyFormat( 5732 "template <class SomeType, class SomeOtherType>\n" 5733 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5734 NoBinPacking); 5735 } 5736 5737 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5738 FormatStyle Style = getLLVMStyleWithColumns(15); 5739 Style.ExperimentalAutoDetectBinPacking = true; 5740 EXPECT_EQ("aaa(aaaa,\n" 5741 " aaaa,\n" 5742 " aaaa);\n" 5743 "aaa(aaaa,\n" 5744 " aaaa,\n" 5745 " aaaa);", 5746 format("aaa(aaaa,\n" // one-per-line 5747 " aaaa,\n" 5748 " aaaa );\n" 5749 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5750 Style)); 5751 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5752 " aaaa);\n" 5753 "aaa(aaaa, aaaa,\n" 5754 " aaaa);", 5755 format("aaa(aaaa, aaaa,\n" // bin-packed 5756 " aaaa );\n" 5757 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5758 Style)); 5759 } 5760 5761 TEST_F(FormatTest, FormatsBuilderPattern) { 5762 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5763 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5764 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5765 " .StartsWith(\".init\", ORDER_INIT)\n" 5766 " .StartsWith(\".fini\", ORDER_FINI)\n" 5767 " .StartsWith(\".hash\", ORDER_HASH)\n" 5768 " .Default(ORDER_TEXT);\n"); 5769 5770 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5771 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5772 verifyFormat("aaaaaaa->aaaaaaa\n" 5773 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5775 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5776 verifyFormat( 5777 "aaaaaaa->aaaaaaa\n" 5778 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5779 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5780 verifyFormat( 5781 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5782 " aaaaaaaaaaaaaa);"); 5783 verifyFormat( 5784 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5785 " aaaaaa->aaaaaaaaaaaa()\n" 5786 " ->aaaaaaaaaaaaaaaa(\n" 5787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5788 " ->aaaaaaaaaaaaaaaaa();"); 5789 verifyGoogleFormat( 5790 "void f() {\n" 5791 " someo->Add((new util::filetools::Handler(dir))\n" 5792 " ->OnEvent1(NewPermanentCallback(\n" 5793 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5794 " ->OnEvent2(NewPermanentCallback(\n" 5795 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5796 " ->OnEvent3(NewPermanentCallback(\n" 5797 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5798 " ->OnEvent5(NewPermanentCallback(\n" 5799 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5800 " ->OnEvent6(NewPermanentCallback(\n" 5801 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5802 "}"); 5803 5804 verifyFormat( 5805 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5806 verifyFormat("aaaaaaaaaaaaaaa()\n" 5807 " .aaaaaaaaaaaaaaa()\n" 5808 " .aaaaaaaaaaaaaaa()\n" 5809 " .aaaaaaaaaaaaaaa()\n" 5810 " .aaaaaaaaaaaaaaa();"); 5811 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5812 " .aaaaaaaaaaaaaaa()\n" 5813 " .aaaaaaaaaaaaaaa()\n" 5814 " .aaaaaaaaaaaaaaa();"); 5815 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5816 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5817 " .aaaaaaaaaaaaaaa();"); 5818 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5819 " ->aaaaaaaaaaaaaae(0)\n" 5820 " ->aaaaaaaaaaaaaaa();"); 5821 5822 // Don't linewrap after very short segments. 5823 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5824 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5825 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5826 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5827 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5828 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5829 verifyFormat("aaa()\n" 5830 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5831 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5832 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5833 5834 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5835 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5836 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5837 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5838 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5839 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5840 5841 // Prefer not to break after empty parentheses. 5842 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5843 " First->LastNewlineOffset);"); 5844 5845 // Prefer not to create "hanging" indents. 5846 verifyFormat( 5847 "return !soooooooooooooome_map\n" 5848 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5849 " .second;"); 5850 verifyFormat( 5851 "return aaaaaaaaaaaaaaaa\n" 5852 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5853 " .aaaa(aaaaaaaaaaaaaa);"); 5854 // No hanging indent here. 5855 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5857 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5859 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5860 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5861 getLLVMStyleWithColumns(60)); 5862 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5863 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5864 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5865 getLLVMStyleWithColumns(59)); 5866 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5868 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5869 5870 // Dont break if only closing statements before member call 5871 verifyFormat("test() {\n" 5872 " ([]() -> {\n" 5873 " int b = 32;\n" 5874 " return 3;\n" 5875 " }).foo();\n" 5876 "}"); 5877 verifyFormat("test() {\n" 5878 " (\n" 5879 " []() -> {\n" 5880 " int b = 32;\n" 5881 " return 3;\n" 5882 " },\n" 5883 " foo, bar)\n" 5884 " .foo();\n" 5885 "}"); 5886 verifyFormat("test() {\n" 5887 " ([]() -> {\n" 5888 " int b = 32;\n" 5889 " return 3;\n" 5890 " })\n" 5891 " .foo()\n" 5892 " .bar();\n" 5893 "}"); 5894 verifyFormat("test() {\n" 5895 " ([]() -> {\n" 5896 " int b = 32;\n" 5897 " return 3;\n" 5898 " })\n" 5899 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5900 " \"bbbb\");\n" 5901 "}", 5902 getLLVMStyleWithColumns(30)); 5903 } 5904 5905 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5906 verifyFormat( 5907 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5908 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5909 verifyFormat( 5910 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5911 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5912 5913 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5914 " ccccccccccccccccccccccccc) {\n}"); 5915 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5916 " ccccccccccccccccccccccccc) {\n}"); 5917 5918 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5919 " ccccccccccccccccccccccccc) {\n}"); 5920 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5921 " ccccccccccccccccccccccccc) {\n}"); 5922 5923 verifyFormat( 5924 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5925 " ccccccccccccccccccccccccc) {\n}"); 5926 verifyFormat( 5927 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5928 " ccccccccccccccccccccccccc) {\n}"); 5929 5930 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5931 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5932 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5933 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5934 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5935 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5936 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5937 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5938 5939 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5940 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5941 " aaaaaaaaaaaaaaa != aa) {\n}"); 5942 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5943 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5944 " aaaaaaaaaaaaaaa != aa) {\n}"); 5945 } 5946 5947 TEST_F(FormatTest, BreaksAfterAssignments) { 5948 verifyFormat( 5949 "unsigned Cost =\n" 5950 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5951 " SI->getPointerAddressSpaceee());\n"); 5952 verifyFormat( 5953 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5954 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5955 5956 verifyFormat( 5957 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5958 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5959 verifyFormat("unsigned OriginalStartColumn =\n" 5960 " SourceMgr.getSpellingColumnNumber(\n" 5961 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5962 " 1;"); 5963 } 5964 5965 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5966 FormatStyle Style = getLLVMStyle(); 5967 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5968 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5969 Style); 5970 5971 Style.PenaltyBreakAssignment = 20; 5972 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5973 " cccccccccccccccccccccccccc;", 5974 Style); 5975 } 5976 5977 TEST_F(FormatTest, AlignsAfterAssignments) { 5978 verifyFormat( 5979 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5980 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5981 verifyFormat( 5982 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5983 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5984 verifyFormat( 5985 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5986 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5987 verifyFormat( 5988 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5989 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5990 verifyFormat( 5991 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5992 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5993 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5994 } 5995 5996 TEST_F(FormatTest, AlignsAfterReturn) { 5997 verifyFormat( 5998 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5999 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 6000 verifyFormat( 6001 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6002 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 6003 verifyFormat( 6004 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 6005 " aaaaaaaaaaaaaaaaaaaaaa();"); 6006 verifyFormat( 6007 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 6008 " aaaaaaaaaaaaaaaaaaaaaa());"); 6009 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6010 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6011 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6012 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 6013 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6014 verifyFormat("return\n" 6015 " // true if code is one of a or b.\n" 6016 " code == a || code == b;"); 6017 } 6018 6019 TEST_F(FormatTest, AlignsAfterOpenBracket) { 6020 verifyFormat( 6021 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 6022 " aaaaaaaaa aaaaaaa) {}"); 6023 verifyFormat( 6024 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 6025 " aaaaaaaaaaa aaaaaaaaa);"); 6026 verifyFormat( 6027 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 6028 " aaaaaaaaaaaaaaaaaaaaa));"); 6029 FormatStyle Style = getLLVMStyle(); 6030 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6031 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6032 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 6033 Style); 6034 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 6035 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 6036 Style); 6037 verifyFormat("SomeLongVariableName->someFunction(\n" 6038 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 6039 Style); 6040 verifyFormat( 6041 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 6042 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 6043 Style); 6044 verifyFormat( 6045 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 6046 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6047 Style); 6048 verifyFormat( 6049 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 6050 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 6051 Style); 6052 6053 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 6054 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 6055 " b));", 6056 Style); 6057 6058 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6059 Style.BinPackArguments = false; 6060 Style.BinPackParameters = false; 6061 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6062 " aaaaaaaaaaa aaaaaaaa,\n" 6063 " aaaaaaaaa aaaaaaa,\n" 6064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 6065 Style); 6066 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 6067 " aaaaaaaaaaa aaaaaaaaa,\n" 6068 " aaaaaaaaaaa aaaaaaaaa,\n" 6069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6070 Style); 6071 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 6072 " aaaaaaaaaaaaaaa,\n" 6073 " aaaaaaaaaaaaaaaaaaaaa,\n" 6074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 6075 Style); 6076 verifyFormat( 6077 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 6078 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 6079 Style); 6080 verifyFormat( 6081 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 6082 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 6083 Style); 6084 verifyFormat( 6085 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 6086 " aaaaaaaaaaaaaaaaaaaaa(\n" 6087 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 6088 " aaaaaaaaaaaaaaaa);", 6089 Style); 6090 verifyFormat( 6091 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 6092 " aaaaaaaaaaaaaaaaaaaaa(\n" 6093 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 6094 " aaaaaaaaaaaaaaaa);", 6095 Style); 6096 } 6097 6098 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 6099 FormatStyle Style = getLLVMStyleWithColumns(40); 6100 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6101 " bbbbbbbbbbbbbbbbbbbbbb);", 6102 Style); 6103 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 6104 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6105 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6106 " bbbbbbbbbbbbbbbbbbbbbb);", 6107 Style); 6108 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6109 Style.AlignOperands = FormatStyle::OAS_Align; 6110 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6111 " bbbbbbbbbbbbbbbbbbbbbb);", 6112 Style); 6113 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6114 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6115 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6116 " bbbbbbbbbbbbbbbbbbbbbb);", 6117 Style); 6118 } 6119 6120 TEST_F(FormatTest, BreaksConditionalExpressions) { 6121 verifyFormat( 6122 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6123 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6124 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6125 verifyFormat( 6126 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6127 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6128 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6129 verifyFormat( 6130 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6131 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6132 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 6133 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6134 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6135 verifyFormat( 6136 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 6137 " : aaaaaaaaaaaaa);"); 6138 verifyFormat( 6139 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6140 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6141 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6142 " aaaaaaaaaaaaa);"); 6143 verifyFormat( 6144 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6145 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6146 " aaaaaaaaaaaaa);"); 6147 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6148 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6150 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6152 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6154 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6155 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6156 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6158 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6159 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6161 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6163 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6164 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6165 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6166 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6167 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6169 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6170 " : aaaaaaaaaaaaaaaa;"); 6171 verifyFormat( 6172 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6173 " ? aaaaaaaaaaaaaaa\n" 6174 " : aaaaaaaaaaaaaaa;"); 6175 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6176 " aaaaaaaaa\n" 6177 " ? b\n" 6178 " : c);"); 6179 verifyFormat("return aaaa == bbbb\n" 6180 " // comment\n" 6181 " ? aaaa\n" 6182 " : bbbb;"); 6183 verifyFormat("unsigned Indent =\n" 6184 " format(TheLine.First,\n" 6185 " IndentForLevel[TheLine.Level] >= 0\n" 6186 " ? IndentForLevel[TheLine.Level]\n" 6187 " : TheLine * 2,\n" 6188 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6189 getLLVMStyleWithColumns(60)); 6190 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6191 " ? aaaaaaaaaaaaaaa\n" 6192 " : bbbbbbbbbbbbbbb //\n" 6193 " ? ccccccccccccccc\n" 6194 " : ddddddddddddddd;"); 6195 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6196 " ? aaaaaaaaaaaaaaa\n" 6197 " : (bbbbbbbbbbbbbbb //\n" 6198 " ? ccccccccccccccc\n" 6199 " : ddddddddddddddd);"); 6200 verifyFormat( 6201 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6202 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6203 " aaaaaaaaaaaaaaaaaaaaa +\n" 6204 " aaaaaaaaaaaaaaaaaaaaa\n" 6205 " : aaaaaaaaaa;"); 6206 verifyFormat( 6207 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6208 " : aaaaaaaaaaaaaaaaaaaaaa\n" 6209 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6210 6211 FormatStyle NoBinPacking = getLLVMStyle(); 6212 NoBinPacking.BinPackArguments = false; 6213 verifyFormat( 6214 "void f() {\n" 6215 " g(aaa,\n" 6216 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6218 " ? aaaaaaaaaaaaaaa\n" 6219 " : aaaaaaaaaaaaaaa);\n" 6220 "}", 6221 NoBinPacking); 6222 verifyFormat( 6223 "void f() {\n" 6224 " g(aaa,\n" 6225 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6227 " ?: aaaaaaaaaaaaaaa);\n" 6228 "}", 6229 NoBinPacking); 6230 6231 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 6232 " // comment.\n" 6233 " ccccccccccccccccccccccccccccccccccccccc\n" 6234 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6235 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 6236 6237 // Assignments in conditional expressions. Apparently not uncommon :-(. 6238 verifyFormat("return a != b\n" 6239 " // comment\n" 6240 " ? a = b\n" 6241 " : a = b;"); 6242 verifyFormat("return a != b\n" 6243 " // comment\n" 6244 " ? a = a != b\n" 6245 " // comment\n" 6246 " ? a = b\n" 6247 " : a\n" 6248 " : a;\n"); 6249 verifyFormat("return a != b\n" 6250 " // comment\n" 6251 " ? a\n" 6252 " : a = a != b\n" 6253 " // comment\n" 6254 " ? a = b\n" 6255 " : a;"); 6256 6257 // Chained conditionals 6258 FormatStyle Style = getLLVMStyle(); 6259 Style.ColumnLimit = 70; 6260 Style.AlignOperands = FormatStyle::OAS_Align; 6261 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6262 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6263 " : 3333333333333333;", 6264 Style); 6265 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6266 " : bbbbbbbbbb ? 2222222222222222\n" 6267 " : 3333333333333333;", 6268 Style); 6269 verifyFormat("return aaaaaaaaaa ? 1111111111111111\n" 6270 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 6271 " : 3333333333333333;", 6272 Style); 6273 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6274 " : bbbbbbbbbbbbbb ? 222222\n" 6275 " : 333333;", 6276 Style); 6277 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6278 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6279 " : cccccccccccccc ? 3333333333333333\n" 6280 " : 4444444444444444;", 6281 Style); 6282 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n" 6283 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6284 " : 3333333333333333;", 6285 Style); 6286 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6287 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6288 " : (aaa ? bbb : ccc);", 6289 Style); 6290 verifyFormat( 6291 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6292 " : cccccccccccccccccc)\n" 6293 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6294 " : 3333333333333333;", 6295 Style); 6296 verifyFormat( 6297 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6298 " : cccccccccccccccccc)\n" 6299 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6300 " : 3333333333333333;", 6301 Style); 6302 verifyFormat( 6303 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6304 " : dddddddddddddddddd)\n" 6305 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6306 " : 3333333333333333;", 6307 Style); 6308 verifyFormat( 6309 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6310 " : dddddddddddddddddd)\n" 6311 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6312 " : 3333333333333333;", 6313 Style); 6314 verifyFormat( 6315 "return aaaaaaaaa ? 1111111111111111\n" 6316 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6317 " : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6318 " : dddddddddddddddddd)\n", 6319 Style); 6320 verifyFormat( 6321 "return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6322 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6323 " : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6324 " : cccccccccccccccccc);", 6325 Style); 6326 verifyFormat( 6327 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6328 " : ccccccccccccccc ? dddddddddddddddddd\n" 6329 " : eeeeeeeeeeeeeeeeee)\n" 6330 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6331 " : 3333333333333333;", 6332 Style); 6333 verifyFormat( 6334 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6335 " : ccccccccccccccc ? dddddddddddddddddd\n" 6336 " : eeeeeeeeeeeeeeeeee)\n" 6337 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6338 " : 3333333333333333;", 6339 Style); 6340 verifyFormat( 6341 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6342 " : cccccccccccc ? dddddddddddddddddd\n" 6343 " : eeeeeeeeeeeeeeeeee)\n" 6344 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6345 " : 3333333333333333;", 6346 Style); 6347 verifyFormat( 6348 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6349 " : cccccccccccccccccc\n" 6350 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6351 " : 3333333333333333;", 6352 Style); 6353 verifyFormat( 6354 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6355 " : cccccccccccccccc ? dddddddddddddddddd\n" 6356 " : eeeeeeeeeeeeeeeeee\n" 6357 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6358 " : 3333333333333333;", 6359 Style); 6360 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n" 6361 " ? (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6362 " : cccccccccccccccccc ? dddddddddddddddddd\n" 6363 " : eeeeeeeeeeeeeeeeee)\n" 6364 " : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6365 " : 3333333333333333;", 6366 Style); 6367 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n" 6368 " ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6369 " : cccccccccccccccc ? dddddddddddddddddd\n" 6370 " : eeeeeeeeeeeeeeeeee\n" 6371 " : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6372 " : 3333333333333333;", 6373 Style); 6374 6375 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6376 Style.BreakBeforeTernaryOperators = false; 6377 // FIXME: Aligning the question marks is weird given DontAlign. 6378 // Consider disabling this alignment in this case. Also check whether this 6379 // will render the adjustment from https://reviews.llvm.org/D82199 6380 // unnecessary. 6381 verifyFormat("int x = aaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa :\n" 6382 " bbbb ? cccccccccccccccccc :\n" 6383 " ddddd;\n", 6384 Style); 6385 } 6386 6387 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 6388 FormatStyle Style = getLLVMStyle(); 6389 Style.BreakBeforeTernaryOperators = false; 6390 Style.ColumnLimit = 70; 6391 verifyFormat( 6392 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6393 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6395 Style); 6396 verifyFormat( 6397 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6398 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6400 Style); 6401 verifyFormat( 6402 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6404 Style); 6405 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 6406 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6407 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6408 Style); 6409 verifyFormat( 6410 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 6411 " aaaaaaaaaaaaa);", 6412 Style); 6413 verifyFormat( 6414 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6415 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6417 " aaaaaaaaaaaaa);", 6418 Style); 6419 verifyFormat( 6420 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6421 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6422 " aaaaaaaaaaaaa);", 6423 Style); 6424 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6425 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6429 Style); 6430 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6436 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6437 Style); 6438 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 6440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6442 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6443 Style); 6444 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6445 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6446 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6447 Style); 6448 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6449 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6452 Style); 6453 verifyFormat( 6454 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6455 " aaaaaaaaaaaaaaa :\n" 6456 " aaaaaaaaaaaaaaa;", 6457 Style); 6458 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6459 " aaaaaaaaa ?\n" 6460 " b :\n" 6461 " c);", 6462 Style); 6463 verifyFormat("unsigned Indent =\n" 6464 " format(TheLine.First,\n" 6465 " IndentForLevel[TheLine.Level] >= 0 ?\n" 6466 " IndentForLevel[TheLine.Level] :\n" 6467 " TheLine * 2,\n" 6468 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6469 Style); 6470 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6471 " aaaaaaaaaaaaaaa :\n" 6472 " bbbbbbbbbbbbbbb ? //\n" 6473 " ccccccccccccccc :\n" 6474 " ddddddddddddddd;", 6475 Style); 6476 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6477 " aaaaaaaaaaaaaaa :\n" 6478 " (bbbbbbbbbbbbbbb ? //\n" 6479 " ccccccccccccccc :\n" 6480 " ddddddddddddddd);", 6481 Style); 6482 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6483 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 6484 " ccccccccccccccccccccccccccc;", 6485 Style); 6486 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6487 " aaaaa :\n" 6488 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 6489 Style); 6490 6491 // Chained conditionals 6492 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6493 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6494 " 3333333333333333;", 6495 Style); 6496 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6497 " bbbbbbbbbb ? 2222222222222222 :\n" 6498 " 3333333333333333;", 6499 Style); 6500 verifyFormat("return aaaaaaaaaa ? 1111111111111111 :\n" 6501 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6502 " 3333333333333333;", 6503 Style); 6504 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6505 " bbbbbbbbbbbbbbbb ? 222222 :\n" 6506 " 333333;", 6507 Style); 6508 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6509 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6510 " cccccccccccccccc ? 3333333333333333 :\n" 6511 " 4444444444444444;", 6512 Style); 6513 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n" 6514 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6515 " 3333333333333333;", 6516 Style); 6517 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6518 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6519 " (aaa ? bbb : ccc);", 6520 Style); 6521 verifyFormat( 6522 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6523 " cccccccccccccccccc) :\n" 6524 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6525 " 3333333333333333;", 6526 Style); 6527 verifyFormat( 6528 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6529 " cccccccccccccccccc) :\n" 6530 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6531 " 3333333333333333;", 6532 Style); 6533 verifyFormat( 6534 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6535 " dddddddddddddddddd) :\n" 6536 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6537 " 3333333333333333;", 6538 Style); 6539 verifyFormat( 6540 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6541 " dddddddddddddddddd) :\n" 6542 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6543 " 3333333333333333;", 6544 Style); 6545 verifyFormat( 6546 "return aaaaaaaaa ? 1111111111111111 :\n" 6547 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6548 " a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6549 " dddddddddddddddddd)\n", 6550 Style); 6551 verifyFormat( 6552 "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6553 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6554 " (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6555 " cccccccccccccccccc);", 6556 Style); 6557 verifyFormat( 6558 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6559 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6560 " eeeeeeeeeeeeeeeeee) :\n" 6561 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6562 " 3333333333333333;", 6563 Style); 6564 verifyFormat( 6565 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6566 " ccccccccccccc ? dddddddddddddddddd :\n" 6567 " eeeeeeeeeeeeeeeeee) :\n" 6568 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6569 " 3333333333333333;", 6570 Style); 6571 verifyFormat( 6572 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6573 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6574 " eeeeeeeeeeeeeeeeee) :\n" 6575 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6576 " 3333333333333333;", 6577 Style); 6578 verifyFormat( 6579 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6580 " cccccccccccccccccc :\n" 6581 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6582 " 3333333333333333;", 6583 Style); 6584 verifyFormat( 6585 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6586 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6587 " eeeeeeeeeeeeeeeeee :\n" 6588 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6589 " 3333333333333333;", 6590 Style); 6591 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6592 " (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6593 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6594 " eeeeeeeeeeeeeeeeee) :\n" 6595 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6596 " 3333333333333333;", 6597 Style); 6598 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6599 " aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6600 " cccccccccccccccccccc ? dddddddddddddddddd :\n" 6601 " eeeeeeeeeeeeeeeeee :\n" 6602 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6603 " 3333333333333333;", 6604 Style); 6605 } 6606 6607 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 6608 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 6609 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 6610 verifyFormat("bool a = true, b = false;"); 6611 6612 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 6614 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 6615 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 6616 verifyFormat( 6617 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 6618 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 6619 " d = e && f;"); 6620 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 6621 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 6622 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6623 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 6624 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 6625 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 6626 6627 FormatStyle Style = getGoogleStyle(); 6628 Style.PointerAlignment = FormatStyle::PAS_Left; 6629 Style.DerivePointerAlignment = false; 6630 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6631 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 6632 " *b = bbbbbbbbbbbbbbbbbbb;", 6633 Style); 6634 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6635 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 6636 Style); 6637 verifyFormat("vector<int*> a, b;", Style); 6638 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 6639 } 6640 6641 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6642 verifyFormat("arr[foo ? bar : baz];"); 6643 verifyFormat("f()[foo ? bar : baz];"); 6644 verifyFormat("(a + b)[foo ? bar : baz];"); 6645 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6646 } 6647 6648 TEST_F(FormatTest, AlignsStringLiterals) { 6649 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6650 " \"short literal\");"); 6651 verifyFormat( 6652 "looooooooooooooooooooooooongFunction(\n" 6653 " \"short literal\"\n" 6654 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6655 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6656 " \" string literals\",\n" 6657 " and, other, parameters);"); 6658 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6659 " \"5678\";", 6660 format("fun + \"1243\" /* comment */\n" 6661 " \"5678\";", 6662 getLLVMStyleWithColumns(28))); 6663 EXPECT_EQ( 6664 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6665 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6666 " \"aaaaaaaaaaaaaaaa\";", 6667 format("aaaaaa =" 6668 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6669 "aaaaaaaaaaaaaaaaaaaaa\" " 6670 "\"aaaaaaaaaaaaaaaa\";")); 6671 verifyFormat("a = a + \"a\"\n" 6672 " \"a\"\n" 6673 " \"a\";"); 6674 verifyFormat("f(\"a\", \"b\"\n" 6675 " \"c\");"); 6676 6677 verifyFormat( 6678 "#define LL_FORMAT \"ll\"\n" 6679 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6680 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6681 6682 verifyFormat("#define A(X) \\\n" 6683 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6684 " \"ccccc\"", 6685 getLLVMStyleWithColumns(23)); 6686 verifyFormat("#define A \"def\"\n" 6687 "f(\"abc\" A \"ghi\"\n" 6688 " \"jkl\");"); 6689 6690 verifyFormat("f(L\"a\"\n" 6691 " L\"b\");"); 6692 verifyFormat("#define A(X) \\\n" 6693 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6694 " L\"ccccc\"", 6695 getLLVMStyleWithColumns(25)); 6696 6697 verifyFormat("f(@\"a\"\n" 6698 " @\"b\");"); 6699 verifyFormat("NSString s = @\"a\"\n" 6700 " @\"b\"\n" 6701 " @\"c\";"); 6702 verifyFormat("NSString s = @\"a\"\n" 6703 " \"b\"\n" 6704 " \"c\";"); 6705 } 6706 6707 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6708 FormatStyle Style = getLLVMStyle(); 6709 // No declarations or definitions should be moved to own line. 6710 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6711 verifyFormat("class A {\n" 6712 " int f() { return 1; }\n" 6713 " int g();\n" 6714 "};\n" 6715 "int f() { return 1; }\n" 6716 "int g();\n", 6717 Style); 6718 6719 // All declarations and definitions should have the return type moved to its 6720 // own line. 6721 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6722 Style.TypenameMacros = {"LIST"}; 6723 verifyFormat("SomeType\n" 6724 "funcdecl(LIST(uint64_t));", 6725 Style); 6726 verifyFormat("class E {\n" 6727 " int\n" 6728 " f() {\n" 6729 " return 1;\n" 6730 " }\n" 6731 " int\n" 6732 " g();\n" 6733 "};\n" 6734 "int\n" 6735 "f() {\n" 6736 " return 1;\n" 6737 "}\n" 6738 "int\n" 6739 "g();\n", 6740 Style); 6741 6742 // Top-level definitions, and no kinds of declarations should have the 6743 // return type moved to its own line. 6744 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6745 verifyFormat("class B {\n" 6746 " int f() { return 1; }\n" 6747 " int g();\n" 6748 "};\n" 6749 "int\n" 6750 "f() {\n" 6751 " return 1;\n" 6752 "}\n" 6753 "int g();\n", 6754 Style); 6755 6756 // Top-level definitions and declarations should have the return type moved 6757 // to its own line. 6758 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6759 verifyFormat("class C {\n" 6760 " int f() { return 1; }\n" 6761 " int g();\n" 6762 "};\n" 6763 "int\n" 6764 "f() {\n" 6765 " return 1;\n" 6766 "}\n" 6767 "int\n" 6768 "g();\n", 6769 Style); 6770 6771 // All definitions should have the return type moved to its own line, but no 6772 // kinds of declarations. 6773 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6774 verifyFormat("class D {\n" 6775 " int\n" 6776 " f() {\n" 6777 " return 1;\n" 6778 " }\n" 6779 " int g();\n" 6780 "};\n" 6781 "int\n" 6782 "f() {\n" 6783 " return 1;\n" 6784 "}\n" 6785 "int g();\n", 6786 Style); 6787 verifyFormat("const char *\n" 6788 "f(void) {\n" // Break here. 6789 " return \"\";\n" 6790 "}\n" 6791 "const char *bar(void);\n", // No break here. 6792 Style); 6793 verifyFormat("template <class T>\n" 6794 "T *\n" 6795 "f(T &c) {\n" // Break here. 6796 " return NULL;\n" 6797 "}\n" 6798 "template <class T> T *f(T &c);\n", // No break here. 6799 Style); 6800 verifyFormat("class C {\n" 6801 " int\n" 6802 " operator+() {\n" 6803 " return 1;\n" 6804 " }\n" 6805 " int\n" 6806 " operator()() {\n" 6807 " return 1;\n" 6808 " }\n" 6809 "};\n", 6810 Style); 6811 verifyFormat("void\n" 6812 "A::operator()() {}\n" 6813 "void\n" 6814 "A::operator>>() {}\n" 6815 "void\n" 6816 "A::operator+() {}\n" 6817 "void\n" 6818 "A::operator*() {}\n" 6819 "void\n" 6820 "A::operator->() {}\n" 6821 "void\n" 6822 "A::operator void *() {}\n" 6823 "void\n" 6824 "A::operator void &() {}\n" 6825 "void\n" 6826 "A::operator void &&() {}\n" 6827 "void\n" 6828 "A::operator char *() {}\n" 6829 "void\n" 6830 "A::operator[]() {}\n" 6831 "void\n" 6832 "A::operator!() {}\n" 6833 "void\n" 6834 "A::operator**() {}\n" 6835 "void\n" 6836 "A::operator<Foo> *() {}\n" 6837 "void\n" 6838 "A::operator<Foo> **() {}\n" 6839 "void\n" 6840 "A::operator<Foo> &() {}\n" 6841 "void\n" 6842 "A::operator void **() {}\n", 6843 Style); 6844 verifyFormat("constexpr auto\n" 6845 "operator()() const -> reference {}\n" 6846 "constexpr auto\n" 6847 "operator>>() const -> reference {}\n" 6848 "constexpr auto\n" 6849 "operator+() const -> reference {}\n" 6850 "constexpr auto\n" 6851 "operator*() const -> reference {}\n" 6852 "constexpr auto\n" 6853 "operator->() const -> reference {}\n" 6854 "constexpr auto\n" 6855 "operator++() const -> reference {}\n" 6856 "constexpr auto\n" 6857 "operator void *() const -> reference {}\n" 6858 "constexpr auto\n" 6859 "operator void **() const -> reference {}\n" 6860 "constexpr auto\n" 6861 "operator void *() const -> reference {}\n" 6862 "constexpr auto\n" 6863 "operator void &() const -> reference {}\n" 6864 "constexpr auto\n" 6865 "operator void &&() const -> reference {}\n" 6866 "constexpr auto\n" 6867 "operator char *() const -> reference {}\n" 6868 "constexpr auto\n" 6869 "operator!() const -> reference {}\n" 6870 "constexpr auto\n" 6871 "operator[]() const -> reference {}\n", 6872 Style); 6873 verifyFormat("void *operator new(std::size_t s);", // No break here. 6874 Style); 6875 verifyFormat("void *\n" 6876 "operator new(std::size_t s) {}", 6877 Style); 6878 verifyFormat("void *\n" 6879 "operator delete[](void *ptr) {}", 6880 Style); 6881 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6882 verifyFormat("const char *\n" 6883 "f(void)\n" // Break here. 6884 "{\n" 6885 " return \"\";\n" 6886 "}\n" 6887 "const char *bar(void);\n", // No break here. 6888 Style); 6889 verifyFormat("template <class T>\n" 6890 "T *\n" // Problem here: no line break 6891 "f(T &c)\n" // Break here. 6892 "{\n" 6893 " return NULL;\n" 6894 "}\n" 6895 "template <class T> T *f(T &c);\n", // No break here. 6896 Style); 6897 verifyFormat("int\n" 6898 "foo(A<bool> a)\n" 6899 "{\n" 6900 " return a;\n" 6901 "}\n", 6902 Style); 6903 verifyFormat("int\n" 6904 "foo(A<8> a)\n" 6905 "{\n" 6906 " return a;\n" 6907 "}\n", 6908 Style); 6909 verifyFormat("int\n" 6910 "foo(A<B<bool>, 8> a)\n" 6911 "{\n" 6912 " return a;\n" 6913 "}\n", 6914 Style); 6915 verifyFormat("int\n" 6916 "foo(A<B<8>, bool> a)\n" 6917 "{\n" 6918 " return a;\n" 6919 "}\n", 6920 Style); 6921 verifyFormat("int\n" 6922 "foo(A<B<bool>, bool> a)\n" 6923 "{\n" 6924 " return a;\n" 6925 "}\n", 6926 Style); 6927 verifyFormat("int\n" 6928 "foo(A<B<8>, 8> a)\n" 6929 "{\n" 6930 " return a;\n" 6931 "}\n", 6932 Style); 6933 6934 Style = getGNUStyle(); 6935 6936 // Test for comments at the end of function declarations. 6937 verifyFormat("void\n" 6938 "foo (int a, /*abc*/ int b) // def\n" 6939 "{\n" 6940 "}\n", 6941 Style); 6942 6943 verifyFormat("void\n" 6944 "foo (int a, /* abc */ int b) /* def */\n" 6945 "{\n" 6946 "}\n", 6947 Style); 6948 6949 // Definitions that should not break after return type 6950 verifyFormat("void foo (int a, int b); // def\n", Style); 6951 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6952 verifyFormat("void foo (int a, int b);\n", Style); 6953 } 6954 6955 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6956 FormatStyle NoBreak = getLLVMStyle(); 6957 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6958 FormatStyle Break = getLLVMStyle(); 6959 Break.AlwaysBreakBeforeMultilineStrings = true; 6960 verifyFormat("aaaa = \"bbbb\"\n" 6961 " \"cccc\";", 6962 NoBreak); 6963 verifyFormat("aaaa =\n" 6964 " \"bbbb\"\n" 6965 " \"cccc\";", 6966 Break); 6967 verifyFormat("aaaa(\"bbbb\"\n" 6968 " \"cccc\");", 6969 NoBreak); 6970 verifyFormat("aaaa(\n" 6971 " \"bbbb\"\n" 6972 " \"cccc\");", 6973 Break); 6974 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6975 " \"cccc\");", 6976 NoBreak); 6977 verifyFormat("aaaa(qqq,\n" 6978 " \"bbbb\"\n" 6979 " \"cccc\");", 6980 Break); 6981 verifyFormat("aaaa(qqq,\n" 6982 " L\"bbbb\"\n" 6983 " L\"cccc\");", 6984 Break); 6985 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6986 " \"bbbb\"));", 6987 Break); 6988 verifyFormat("string s = someFunction(\n" 6989 " \"abc\"\n" 6990 " \"abc\");", 6991 Break); 6992 6993 // As we break before unary operators, breaking right after them is bad. 6994 verifyFormat("string foo = abc ? \"x\"\n" 6995 " \"blah blah blah blah blah blah\"\n" 6996 " : \"y\";", 6997 Break); 6998 6999 // Don't break if there is no column gain. 7000 verifyFormat("f(\"aaaa\"\n" 7001 " \"bbbb\");", 7002 Break); 7003 7004 // Treat literals with escaped newlines like multi-line string literals. 7005 EXPECT_EQ("x = \"a\\\n" 7006 "b\\\n" 7007 "c\";", 7008 format("x = \"a\\\n" 7009 "b\\\n" 7010 "c\";", 7011 NoBreak)); 7012 EXPECT_EQ("xxxx =\n" 7013 " \"a\\\n" 7014 "b\\\n" 7015 "c\";", 7016 format("xxxx = \"a\\\n" 7017 "b\\\n" 7018 "c\";", 7019 Break)); 7020 7021 EXPECT_EQ("NSString *const kString =\n" 7022 " @\"aaaa\"\n" 7023 " @\"bbbb\";", 7024 format("NSString *const kString = @\"aaaa\"\n" 7025 "@\"bbbb\";", 7026 Break)); 7027 7028 Break.ColumnLimit = 0; 7029 verifyFormat("const char *hello = \"hello llvm\";", Break); 7030 } 7031 7032 TEST_F(FormatTest, AlignsPipes) { 7033 verifyFormat( 7034 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7035 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7036 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7037 verifyFormat( 7038 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 7039 " << aaaaaaaaaaaaaaaaaaaa;"); 7040 verifyFormat( 7041 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7042 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7043 verifyFormat( 7044 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 7045 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7046 verifyFormat( 7047 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 7048 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 7049 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 7050 verifyFormat( 7051 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7052 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7053 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7054 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7057 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7058 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 7059 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 7060 verifyFormat( 7061 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7063 verifyFormat( 7064 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 7065 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7066 7067 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 7068 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 7069 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7071 " aaaaaaaaaaaaaaaaaaaaa)\n" 7072 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7073 verifyFormat("LOG_IF(aaa == //\n" 7074 " bbb)\n" 7075 " << a << b;"); 7076 7077 // But sometimes, breaking before the first "<<" is desirable. 7078 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7079 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 7080 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 7081 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7082 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7083 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 7084 " << BEF << IsTemplate << Description << E->getType();"); 7085 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7086 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7088 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7089 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7091 " << aaa;"); 7092 7093 verifyFormat( 7094 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7095 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7096 7097 // Incomplete string literal. 7098 EXPECT_EQ("llvm::errs() << \"\n" 7099 " << a;", 7100 format("llvm::errs() << \"\n<<a;")); 7101 7102 verifyFormat("void f() {\n" 7103 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 7104 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 7105 "}"); 7106 7107 // Handle 'endl'. 7108 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 7109 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 7110 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 7111 7112 // Handle '\n'. 7113 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 7114 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 7115 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 7116 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 7117 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 7118 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 7119 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 7120 } 7121 7122 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 7123 verifyFormat("return out << \"somepacket = {\\n\"\n" 7124 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 7125 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 7126 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 7127 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 7128 " << \"}\";"); 7129 7130 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 7131 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 7132 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 7133 verifyFormat( 7134 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 7135 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 7136 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 7137 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 7138 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 7139 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 7140 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7141 verifyFormat( 7142 "void f() {\n" 7143 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 7144 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 7145 "}"); 7146 7147 // Breaking before the first "<<" is generally not desirable. 7148 verifyFormat( 7149 "llvm::errs()\n" 7150 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7151 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7152 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7153 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 7154 getLLVMStyleWithColumns(70)); 7155 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7156 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7157 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7158 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7159 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7160 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 7161 getLLVMStyleWithColumns(70)); 7162 7163 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 7164 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 7165 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 7166 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7167 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7168 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 7169 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 7170 " (aaaa + aaaa);", 7171 getLLVMStyleWithColumns(40)); 7172 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 7173 " (aaaaaaa + aaaaa));", 7174 getLLVMStyleWithColumns(40)); 7175 verifyFormat( 7176 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 7177 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 7178 " bbbbbbbbbbbbbbbbbbbbbbb);"); 7179 } 7180 7181 TEST_F(FormatTest, UnderstandsEquals) { 7182 verifyFormat( 7183 "aaaaaaaaaaaaaaaaa =\n" 7184 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7185 verifyFormat( 7186 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7188 verifyFormat( 7189 "if (a) {\n" 7190 " f();\n" 7191 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7192 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 7193 "}"); 7194 7195 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7196 " 100000000 + 10000000) {\n}"); 7197 } 7198 7199 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 7200 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7201 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 7202 7203 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7204 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 7205 7206 verifyFormat( 7207 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 7208 " Parameter2);"); 7209 7210 verifyFormat( 7211 "ShortObject->shortFunction(\n" 7212 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 7213 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 7214 7215 verifyFormat("loooooooooooooongFunction(\n" 7216 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 7217 7218 verifyFormat( 7219 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 7220 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 7221 7222 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7223 " .WillRepeatedly(Return(SomeValue));"); 7224 verifyFormat("void f() {\n" 7225 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7226 " .Times(2)\n" 7227 " .WillRepeatedly(Return(SomeValue));\n" 7228 "}"); 7229 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 7230 " ccccccccccccccccccccccc);"); 7231 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7232 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7233 " .aaaaa(aaaaa),\n" 7234 " aaaaaaaaaaaaaaaaaaaaa);"); 7235 verifyFormat("void f() {\n" 7236 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7237 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 7238 "}"); 7239 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7240 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7241 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7242 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7243 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7244 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7245 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7246 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7247 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 7248 "}"); 7249 7250 // Here, it is not necessary to wrap at "." or "->". 7251 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 7252 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7253 verifyFormat( 7254 "aaaaaaaaaaa->aaaaaaaaa(\n" 7255 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7256 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 7257 7258 verifyFormat( 7259 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 7261 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 7262 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7263 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 7264 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7265 7266 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7267 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7268 " .a();"); 7269 7270 FormatStyle NoBinPacking = getLLVMStyle(); 7271 NoBinPacking.BinPackParameters = false; 7272 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7273 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7274 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 7275 " aaaaaaaaaaaaaaaaaaa,\n" 7276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 7277 NoBinPacking); 7278 7279 // If there is a subsequent call, change to hanging indentation. 7280 verifyFormat( 7281 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7282 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 7283 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7284 verifyFormat( 7285 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7286 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 7287 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7289 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7290 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7292 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7293 } 7294 7295 TEST_F(FormatTest, WrapsTemplateDeclarations) { 7296 verifyFormat("template <typename T>\n" 7297 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7298 verifyFormat("template <typename T>\n" 7299 "// T should be one of {A, B}.\n" 7300 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7301 verifyFormat( 7302 "template <typename T>\n" 7303 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 7304 verifyFormat("template <typename T>\n" 7305 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 7306 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 7307 verifyFormat( 7308 "template <typename T>\n" 7309 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 7310 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 7311 verifyFormat( 7312 "template <typename T>\n" 7313 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 7314 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 7315 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7316 verifyFormat("template <typename T>\n" 7317 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7318 " int aaaaaaaaaaaaaaaaaaaaaa);"); 7319 verifyFormat( 7320 "template <typename T1, typename T2 = char, typename T3 = char,\n" 7321 " typename T4 = char>\n" 7322 "void f();"); 7323 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 7324 " template <typename> class cccccccccccccccccccccc,\n" 7325 " typename ddddddddddddd>\n" 7326 "class C {};"); 7327 verifyFormat( 7328 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 7329 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7330 7331 verifyFormat("void f() {\n" 7332 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 7333 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 7334 "}"); 7335 7336 verifyFormat("template <typename T> class C {};"); 7337 verifyFormat("template <typename T> void f();"); 7338 verifyFormat("template <typename T> void f() {}"); 7339 verifyFormat( 7340 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 7343 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 7346 " bbbbbbbbbbbbbbbbbbbbbbbb);", 7347 getLLVMStyleWithColumns(72)); 7348 EXPECT_EQ("static_cast<A< //\n" 7349 " B> *>(\n" 7350 "\n" 7351 ");", 7352 format("static_cast<A<//\n" 7353 " B>*>(\n" 7354 "\n" 7355 " );")); 7356 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7357 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 7358 7359 FormatStyle AlwaysBreak = getLLVMStyle(); 7360 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7361 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 7362 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 7363 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 7364 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7365 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7366 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 7367 verifyFormat("template <template <typename> class Fooooooo,\n" 7368 " template <typename> class Baaaaaaar>\n" 7369 "struct C {};", 7370 AlwaysBreak); 7371 verifyFormat("template <typename T> // T can be A, B or C.\n" 7372 "struct C {};", 7373 AlwaysBreak); 7374 verifyFormat("template <enum E> class A {\n" 7375 "public:\n" 7376 " E *f();\n" 7377 "};"); 7378 7379 FormatStyle NeverBreak = getLLVMStyle(); 7380 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 7381 verifyFormat("template <typename T> class C {};", NeverBreak); 7382 verifyFormat("template <typename T> void f();", NeverBreak); 7383 verifyFormat("template <typename T> void f() {}", NeverBreak); 7384 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7385 "bbbbbbbbbbbbbbbbbbbb) {}", 7386 NeverBreak); 7387 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7388 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7389 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 7390 NeverBreak); 7391 verifyFormat("template <template <typename> class Fooooooo,\n" 7392 " template <typename> class Baaaaaaar>\n" 7393 "struct C {};", 7394 NeverBreak); 7395 verifyFormat("template <typename T> // T can be A, B or C.\n" 7396 "struct C {};", 7397 NeverBreak); 7398 verifyFormat("template <enum E> class A {\n" 7399 "public:\n" 7400 " E *f();\n" 7401 "};", 7402 NeverBreak); 7403 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 7404 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7405 "bbbbbbbbbbbbbbbbbbbb) {}", 7406 NeverBreak); 7407 } 7408 7409 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 7410 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7411 Style.ColumnLimit = 60; 7412 EXPECT_EQ("// Baseline - no comments.\n" 7413 "template <\n" 7414 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7415 "void f() {}", 7416 format("// Baseline - no comments.\n" 7417 "template <\n" 7418 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7419 "void f() {}", 7420 Style)); 7421 7422 EXPECT_EQ("template <\n" 7423 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7424 "void f() {}", 7425 format("template <\n" 7426 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7427 "void f() {}", 7428 Style)); 7429 7430 EXPECT_EQ( 7431 "template <\n" 7432 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7433 "void f() {}", 7434 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7435 "void f() {}", 7436 Style)); 7437 7438 EXPECT_EQ( 7439 "template <\n" 7440 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7441 " // multiline\n" 7442 "void f() {}", 7443 format("template <\n" 7444 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7445 " // multiline\n" 7446 "void f() {}", 7447 Style)); 7448 7449 EXPECT_EQ( 7450 "template <typename aaaaaaaaaa<\n" 7451 " bbbbbbbbbbbb>::value> // trailing loooong\n" 7452 "void f() {}", 7453 format( 7454 "template <\n" 7455 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 7456 "void f() {}", 7457 Style)); 7458 } 7459 7460 TEST_F(FormatTest, WrapsTemplateParameters) { 7461 FormatStyle Style = getLLVMStyle(); 7462 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7463 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7464 verifyFormat( 7465 "template <typename... a> struct q {};\n" 7466 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7467 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7468 " y;", 7469 Style); 7470 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7471 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7472 verifyFormat( 7473 "template <typename... a> struct r {};\n" 7474 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7475 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7476 " y;", 7477 Style); 7478 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7479 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7480 verifyFormat("template <typename... a> struct s {};\n" 7481 "extern s<\n" 7482 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7483 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7484 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7485 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7486 " y;", 7487 Style); 7488 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7489 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7490 verifyFormat("template <typename... a> struct t {};\n" 7491 "extern t<\n" 7492 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7493 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7494 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7495 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7496 " y;", 7497 Style); 7498 } 7499 7500 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 7501 verifyFormat( 7502 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7504 verifyFormat( 7505 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7506 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7507 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7508 7509 // FIXME: Should we have the extra indent after the second break? 7510 verifyFormat( 7511 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7514 7515 verifyFormat( 7516 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 7517 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 7518 7519 // Breaking at nested name specifiers is generally not desirable. 7520 verifyFormat( 7521 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7522 " aaaaaaaaaaaaaaaaaaaaaaa);"); 7523 7524 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 7525 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7527 " aaaaaaaaaaaaaaaaaaaaa);", 7528 getLLVMStyleWithColumns(74)); 7529 7530 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7532 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7533 } 7534 7535 TEST_F(FormatTest, UnderstandsTemplateParameters) { 7536 verifyFormat("A<int> a;"); 7537 verifyFormat("A<A<A<int>>> a;"); 7538 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 7539 verifyFormat("bool x = a < 1 || 2 > a;"); 7540 verifyFormat("bool x = 5 < f<int>();"); 7541 verifyFormat("bool x = f<int>() > 5;"); 7542 verifyFormat("bool x = 5 < a<int>::x;"); 7543 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 7544 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 7545 7546 verifyGoogleFormat("A<A<int>> a;"); 7547 verifyGoogleFormat("A<A<A<int>>> a;"); 7548 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 7549 verifyGoogleFormat("A<A<int> > a;"); 7550 verifyGoogleFormat("A<A<A<int> > > a;"); 7551 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 7552 verifyGoogleFormat("A<::A<int>> a;"); 7553 verifyGoogleFormat("A<::A> a;"); 7554 verifyGoogleFormat("A< ::A> a;"); 7555 verifyGoogleFormat("A< ::A<int> > a;"); 7556 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 7557 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 7558 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 7559 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 7560 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 7561 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 7562 7563 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 7564 7565 // template closer followed by a token that starts with > or = 7566 verifyFormat("bool b = a<1> > 1;"); 7567 verifyFormat("bool b = a<1> >= 1;"); 7568 verifyFormat("int i = a<1> >> 1;"); 7569 FormatStyle Style = getLLVMStyle(); 7570 Style.SpaceBeforeAssignmentOperators = false; 7571 verifyFormat("bool b= a<1> == 1;", Style); 7572 verifyFormat("a<int> = 1;", Style); 7573 verifyFormat("a<int> >>= 1;", Style); 7574 7575 verifyFormat("test >> a >> b;"); 7576 verifyFormat("test << a >> b;"); 7577 7578 verifyFormat("f<int>();"); 7579 verifyFormat("template <typename T> void f() {}"); 7580 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 7581 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 7582 "sizeof(char)>::type>;"); 7583 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 7584 verifyFormat("f(a.operator()<A>());"); 7585 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7586 " .template operator()<A>());", 7587 getLLVMStyleWithColumns(35)); 7588 7589 // Not template parameters. 7590 verifyFormat("return a < b && c > d;"); 7591 verifyFormat("void f() {\n" 7592 " while (a < b && c > d) {\n" 7593 " }\n" 7594 "}"); 7595 verifyFormat("template <typename... Types>\n" 7596 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 7597 7598 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7599 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 7600 getLLVMStyleWithColumns(60)); 7601 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 7602 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 7603 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 7604 verifyFormat("some_templated_type<decltype([](int i) { return i; })>"); 7605 } 7606 7607 TEST_F(FormatTest, UnderstandsShiftOperators) { 7608 verifyFormat("if (i < x >> 1)"); 7609 verifyFormat("while (i < x >> 1)"); 7610 verifyFormat("for (unsigned i = 0; i < i; ++i, v = v >> 1)"); 7611 verifyFormat("for (unsigned i = 0; i < x >> 1; ++i, v = v >> 1)"); 7612 verifyFormat( 7613 "for (std::vector<int>::iterator i = 0; i < x >> 1; ++i, v = v >> 1)"); 7614 verifyFormat("Foo.call<Bar<Function>>()"); 7615 verifyFormat("if (Foo.call<Bar<Function>>() == 0)"); 7616 verifyFormat("for (std::vector<std::pair<int>>::iterator i = 0; i < x >> 1; " 7617 "++i, v = v >> 1)"); 7618 verifyFormat("if (w<u<v<x>>, 1>::t)"); 7619 } 7620 7621 TEST_F(FormatTest, BitshiftOperatorWidth) { 7622 EXPECT_EQ("int a = 1 << 2; /* foo\n" 7623 " bar */", 7624 format("int a=1<<2; /* foo\n" 7625 " bar */")); 7626 7627 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 7628 " bar */", 7629 format("int b =256>>1 ; /* foo\n" 7630 " bar */")); 7631 } 7632 7633 TEST_F(FormatTest, UnderstandsBinaryOperators) { 7634 verifyFormat("COMPARE(a, ==, b);"); 7635 verifyFormat("auto s = sizeof...(Ts) - 1;"); 7636 } 7637 7638 TEST_F(FormatTest, UnderstandsPointersToMembers) { 7639 verifyFormat("int A::*x;"); 7640 verifyFormat("int (S::*func)(void *);"); 7641 verifyFormat("void f() { int (S::*func)(void *); }"); 7642 verifyFormat("typedef bool *(Class::*Member)() const;"); 7643 verifyFormat("void f() {\n" 7644 " (a->*f)();\n" 7645 " a->*x;\n" 7646 " (a.*f)();\n" 7647 " ((*a).*f)();\n" 7648 " a.*x;\n" 7649 "}"); 7650 verifyFormat("void f() {\n" 7651 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7652 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 7653 "}"); 7654 verifyFormat( 7655 "(aaaaaaaaaa->*bbbbbbb)(\n" 7656 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7657 FormatStyle Style = getLLVMStyle(); 7658 Style.PointerAlignment = FormatStyle::PAS_Left; 7659 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 7660 } 7661 7662 TEST_F(FormatTest, UnderstandsUnaryOperators) { 7663 verifyFormat("int a = -2;"); 7664 verifyFormat("f(-1, -2, -3);"); 7665 verifyFormat("a[-1] = 5;"); 7666 verifyFormat("int a = 5 + -2;"); 7667 verifyFormat("if (i == -1) {\n}"); 7668 verifyFormat("if (i != -1) {\n}"); 7669 verifyFormat("if (i > -1) {\n}"); 7670 verifyFormat("if (i < -1) {\n}"); 7671 verifyFormat("++(a->f());"); 7672 verifyFormat("--(a->f());"); 7673 verifyFormat("(a->f())++;"); 7674 verifyFormat("a[42]++;"); 7675 verifyFormat("if (!(a->f())) {\n}"); 7676 verifyFormat("if (!+i) {\n}"); 7677 verifyFormat("~&a;"); 7678 7679 verifyFormat("a-- > b;"); 7680 verifyFormat("b ? -a : c;"); 7681 verifyFormat("n * sizeof char16;"); 7682 verifyFormat("n * alignof char16;", getGoogleStyle()); 7683 verifyFormat("sizeof(char);"); 7684 verifyFormat("alignof(char);", getGoogleStyle()); 7685 7686 verifyFormat("return -1;"); 7687 verifyFormat("throw -1;"); 7688 verifyFormat("switch (a) {\n" 7689 "case -1:\n" 7690 " break;\n" 7691 "}"); 7692 verifyFormat("#define X -1"); 7693 verifyFormat("#define X -kConstant"); 7694 7695 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7696 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7697 7698 verifyFormat("int a = /* confusing comment */ -1;"); 7699 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7700 verifyFormat("int a = i /* confusing comment */++;"); 7701 7702 verifyFormat("co_yield -1;"); 7703 verifyFormat("co_return -1;"); 7704 } 7705 7706 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7707 verifyFormat("if (!aaaaaaaaaa( // break\n" 7708 " aaaaa)) {\n" 7709 "}"); 7710 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7711 " aaaaa));"); 7712 verifyFormat("*aaa = aaaaaaa( // break\n" 7713 " bbbbbb);"); 7714 } 7715 7716 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7717 verifyFormat("bool operator<();"); 7718 verifyFormat("bool operator>();"); 7719 verifyFormat("bool operator=();"); 7720 verifyFormat("bool operator==();"); 7721 verifyFormat("bool operator!=();"); 7722 verifyFormat("int operator+();"); 7723 verifyFormat("int operator++();"); 7724 verifyFormat("int operator++(int) volatile noexcept;"); 7725 verifyFormat("bool operator,();"); 7726 verifyFormat("bool operator();"); 7727 verifyFormat("bool operator()();"); 7728 verifyFormat("bool operator[]();"); 7729 verifyFormat("operator bool();"); 7730 verifyFormat("operator int();"); 7731 verifyFormat("operator void *();"); 7732 verifyFormat("operator SomeType<int>();"); 7733 verifyFormat("operator SomeType<int, int>();"); 7734 verifyFormat("operator SomeType<SomeType<int>>();"); 7735 verifyFormat("void *operator new(std::size_t size);"); 7736 verifyFormat("void *operator new[](std::size_t size);"); 7737 verifyFormat("void operator delete(void *ptr);"); 7738 verifyFormat("void operator delete[](void *ptr);"); 7739 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7740 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7741 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7742 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7743 7744 verifyFormat( 7745 "ostream &operator<<(ostream &OutputStream,\n" 7746 " SomeReallyLongType WithSomeReallyLongValue);"); 7747 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7748 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7749 " return left.group < right.group;\n" 7750 "}"); 7751 verifyFormat("SomeType &operator=(const SomeType &S);"); 7752 verifyFormat("f.template operator()<int>();"); 7753 7754 verifyGoogleFormat("operator void*();"); 7755 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7756 verifyGoogleFormat("operator ::A();"); 7757 7758 verifyFormat("using A::operator+;"); 7759 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7760 "int i;"); 7761 } 7762 7763 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7764 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7765 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7766 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7767 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7768 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7769 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7770 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7771 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7772 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7773 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7774 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7775 verifyFormat("void Fn(T const &) const &;"); 7776 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7777 verifyFormat("template <typename T>\n" 7778 "void F(T) && = delete;", 7779 getGoogleStyle()); 7780 7781 FormatStyle AlignLeft = getLLVMStyle(); 7782 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7783 verifyFormat("void A::b() && {}", AlignLeft); 7784 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7785 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7786 AlignLeft); 7787 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7788 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7789 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7790 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7791 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7792 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7793 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7794 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7795 7796 FormatStyle Spaces = getLLVMStyle(); 7797 Spaces.SpacesInCStyleCastParentheses = true; 7798 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7799 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7800 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7801 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7802 7803 Spaces.SpacesInCStyleCastParentheses = false; 7804 Spaces.SpacesInParentheses = true; 7805 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7806 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7807 Spaces); 7808 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7809 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7810 7811 FormatStyle BreakTemplate = getLLVMStyle(); 7812 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7813 7814 verifyFormat("struct f {\n" 7815 " template <class T>\n" 7816 " int &foo(const std::string &str) &noexcept {}\n" 7817 "};", 7818 BreakTemplate); 7819 7820 verifyFormat("struct f {\n" 7821 " template <class T>\n" 7822 " int &foo(const std::string &str) &&noexcept {}\n" 7823 "};", 7824 BreakTemplate); 7825 7826 verifyFormat("struct f {\n" 7827 " template <class T>\n" 7828 " int &foo(const std::string &str) const &noexcept {}\n" 7829 "};", 7830 BreakTemplate); 7831 7832 verifyFormat("struct f {\n" 7833 " template <class T>\n" 7834 " int &foo(const std::string &str) const &noexcept {}\n" 7835 "};", 7836 BreakTemplate); 7837 7838 verifyFormat("struct f {\n" 7839 " template <class T>\n" 7840 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7841 "};", 7842 BreakTemplate); 7843 7844 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7845 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7846 FormatStyle::BTDS_Yes; 7847 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7848 7849 verifyFormat("struct f {\n" 7850 " template <class T>\n" 7851 " int& foo(const std::string& str) & noexcept {}\n" 7852 "};", 7853 AlignLeftBreakTemplate); 7854 7855 verifyFormat("struct f {\n" 7856 " template <class T>\n" 7857 " int& foo(const std::string& str) && noexcept {}\n" 7858 "};", 7859 AlignLeftBreakTemplate); 7860 7861 verifyFormat("struct f {\n" 7862 " template <class T>\n" 7863 " int& foo(const std::string& str) const& noexcept {}\n" 7864 "};", 7865 AlignLeftBreakTemplate); 7866 7867 verifyFormat("struct f {\n" 7868 " template <class T>\n" 7869 " int& foo(const std::string& str) const&& noexcept {}\n" 7870 "};", 7871 AlignLeftBreakTemplate); 7872 7873 verifyFormat("struct f {\n" 7874 " template <class T>\n" 7875 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7876 "};", 7877 AlignLeftBreakTemplate); 7878 7879 // The `&` in `Type&` should not be confused with a trailing `&` of 7880 // DEPRECATED(reason) member function. 7881 verifyFormat("struct f {\n" 7882 " template <class T>\n" 7883 " DEPRECATED(reason)\n" 7884 " Type &foo(arguments) {}\n" 7885 "};", 7886 BreakTemplate); 7887 7888 verifyFormat("struct f {\n" 7889 " template <class T>\n" 7890 " DEPRECATED(reason)\n" 7891 " Type& foo(arguments) {}\n" 7892 "};", 7893 AlignLeftBreakTemplate); 7894 7895 verifyFormat("void (*foopt)(int) = &func;"); 7896 } 7897 7898 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7899 verifyFormat("void f() {\n" 7900 " A *a = new A;\n" 7901 " A *a = new (placement) A;\n" 7902 " delete a;\n" 7903 " delete (A *)a;\n" 7904 "}"); 7905 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7906 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7907 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7908 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7909 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7910 verifyFormat("delete[] h->p;"); 7911 } 7912 7913 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7914 verifyFormat("int *f(int *a) {}"); 7915 verifyFormat("int main(int argc, char **argv) {}"); 7916 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7917 verifyIndependentOfContext("f(a, *a);"); 7918 verifyFormat("void g() { f(*a); }"); 7919 verifyIndependentOfContext("int a = b * 10;"); 7920 verifyIndependentOfContext("int a = 10 * b;"); 7921 verifyIndependentOfContext("int a = b * c;"); 7922 verifyIndependentOfContext("int a += b * c;"); 7923 verifyIndependentOfContext("int a -= b * c;"); 7924 verifyIndependentOfContext("int a *= b * c;"); 7925 verifyIndependentOfContext("int a /= b * c;"); 7926 verifyIndependentOfContext("int a = *b;"); 7927 verifyIndependentOfContext("int a = *b * c;"); 7928 verifyIndependentOfContext("int a = b * *c;"); 7929 verifyIndependentOfContext("int a = b * (10);"); 7930 verifyIndependentOfContext("S << b * (10);"); 7931 verifyIndependentOfContext("return 10 * b;"); 7932 verifyIndependentOfContext("return *b * *c;"); 7933 verifyIndependentOfContext("return a & ~b;"); 7934 verifyIndependentOfContext("f(b ? *c : *d);"); 7935 verifyIndependentOfContext("int a = b ? *c : *d;"); 7936 verifyIndependentOfContext("*b = a;"); 7937 verifyIndependentOfContext("a * ~b;"); 7938 verifyIndependentOfContext("a * !b;"); 7939 verifyIndependentOfContext("a * +b;"); 7940 verifyIndependentOfContext("a * -b;"); 7941 verifyIndependentOfContext("a * ++b;"); 7942 verifyIndependentOfContext("a * --b;"); 7943 verifyIndependentOfContext("a[4] * b;"); 7944 verifyIndependentOfContext("a[a * a] = 1;"); 7945 verifyIndependentOfContext("f() * b;"); 7946 verifyIndependentOfContext("a * [self dostuff];"); 7947 verifyIndependentOfContext("int x = a * (a + b);"); 7948 verifyIndependentOfContext("(a *)(a + b);"); 7949 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7950 verifyIndependentOfContext("int *pa = (int *)&a;"); 7951 verifyIndependentOfContext("return sizeof(int **);"); 7952 verifyIndependentOfContext("return sizeof(int ******);"); 7953 verifyIndependentOfContext("return (int **&)a;"); 7954 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7955 verifyFormat("void f(Type (*parameter)[10]) {}"); 7956 verifyFormat("void f(Type (¶meter)[10]) {}"); 7957 verifyGoogleFormat("return sizeof(int**);"); 7958 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7959 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7960 verifyFormat("auto a = [](int **&, int ***) {};"); 7961 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7962 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7963 verifyFormat("[](const decltype(*a) &value) {}"); 7964 verifyFormat("[](const typeof(*a) &value) {}"); 7965 verifyFormat("[](const _Atomic(a *) &value) {}"); 7966 verifyFormat("[](const __underlying_type(a) &value) {}"); 7967 verifyFormat("decltype(a * b) F();"); 7968 verifyFormat("typeof(a * b) F();"); 7969 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7970 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7971 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7972 verifyIndependentOfContext("int i{a * b};"); 7973 verifyIndependentOfContext("aaa && aaa->f();"); 7974 verifyIndependentOfContext("int x = ~*p;"); 7975 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7976 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7977 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7978 verifyFormat("void f() { f(a, c * d); }"); 7979 verifyFormat("void f() { f(new a(), c * d); }"); 7980 verifyFormat("void f(const MyOverride &override);"); 7981 verifyFormat("void f(const MyFinal &final);"); 7982 verifyIndependentOfContext("bool a = f() && override.f();"); 7983 verifyIndependentOfContext("bool a = f() && final.f();"); 7984 7985 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7986 7987 verifyIndependentOfContext("A<int *> a;"); 7988 verifyIndependentOfContext("A<int **> a;"); 7989 verifyIndependentOfContext("A<int *, int *> a;"); 7990 verifyIndependentOfContext("A<int *[]> a;"); 7991 verifyIndependentOfContext( 7992 "const char *const p = reinterpret_cast<const char *const>(q);"); 7993 verifyIndependentOfContext("A<int **, int **> a;"); 7994 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7995 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7996 verifyFormat("for (; a && b;) {\n}"); 7997 verifyFormat("bool foo = true && [] { return false; }();"); 7998 7999 verifyFormat( 8000 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8002 8003 verifyGoogleFormat("int const* a = &b;"); 8004 verifyGoogleFormat("**outparam = 1;"); 8005 verifyGoogleFormat("*outparam = a * b;"); 8006 verifyGoogleFormat("int main(int argc, char** argv) {}"); 8007 verifyGoogleFormat("A<int*> a;"); 8008 verifyGoogleFormat("A<int**> a;"); 8009 verifyGoogleFormat("A<int*, int*> a;"); 8010 verifyGoogleFormat("A<int**, int**> a;"); 8011 verifyGoogleFormat("f(b ? *c : *d);"); 8012 verifyGoogleFormat("int a = b ? *c : *d;"); 8013 verifyGoogleFormat("Type* t = **x;"); 8014 verifyGoogleFormat("Type* t = *++*x;"); 8015 verifyGoogleFormat("*++*x;"); 8016 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 8017 verifyGoogleFormat("Type* t = x++ * y;"); 8018 verifyGoogleFormat( 8019 "const char* const p = reinterpret_cast<const char* const>(q);"); 8020 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 8021 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 8022 verifyGoogleFormat("template <typename T>\n" 8023 "void f(int i = 0, SomeType** temps = NULL);"); 8024 8025 FormatStyle Left = getLLVMStyle(); 8026 Left.PointerAlignment = FormatStyle::PAS_Left; 8027 verifyFormat("x = *a(x) = *a(y);", Left); 8028 verifyFormat("for (;; *a = b) {\n}", Left); 8029 verifyFormat("return *this += 1;", Left); 8030 verifyFormat("throw *x;", Left); 8031 verifyFormat("delete *x;", Left); 8032 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 8033 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 8034 verifyFormat("[](const typeof(*a)* ptr) {}", Left); 8035 verifyFormat("[](const _Atomic(a*)* ptr) {}", Left); 8036 verifyFormat("[](const __underlying_type(a)* ptr) {}", Left); 8037 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 8038 verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left); 8039 verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left); 8040 verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left); 8041 8042 verifyIndependentOfContext("a = *(x + y);"); 8043 verifyIndependentOfContext("a = &(x + y);"); 8044 verifyIndependentOfContext("*(x + y).call();"); 8045 verifyIndependentOfContext("&(x + y)->call();"); 8046 verifyFormat("void f() { &(*I).first; }"); 8047 8048 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 8049 verifyFormat( 8050 "int *MyValues = {\n" 8051 " *A, // Operator detection might be confused by the '{'\n" 8052 " *BB // Operator detection might be confused by previous comment\n" 8053 "};"); 8054 8055 verifyIndependentOfContext("if (int *a = &b)"); 8056 verifyIndependentOfContext("if (int &a = *b)"); 8057 verifyIndependentOfContext("if (a & b[i])"); 8058 verifyIndependentOfContext("if constexpr (a & b[i])"); 8059 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 8060 verifyIndependentOfContext("if (a * (b * c))"); 8061 verifyIndependentOfContext("if constexpr (a * (b * c))"); 8062 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 8063 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 8064 verifyIndependentOfContext("if (*b[i])"); 8065 verifyIndependentOfContext("if (int *a = (&b))"); 8066 verifyIndependentOfContext("while (int *a = &b)"); 8067 verifyIndependentOfContext("while (a * (b * c))"); 8068 verifyIndependentOfContext("size = sizeof *a;"); 8069 verifyIndependentOfContext("if (a && (b = c))"); 8070 verifyFormat("void f() {\n" 8071 " for (const int &v : Values) {\n" 8072 " }\n" 8073 "}"); 8074 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 8075 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 8076 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 8077 8078 verifyFormat("#define A (!a * b)"); 8079 verifyFormat("#define MACRO \\\n" 8080 " int *i = a * b; \\\n" 8081 " void f(a *b);", 8082 getLLVMStyleWithColumns(19)); 8083 8084 verifyIndependentOfContext("A = new SomeType *[Length];"); 8085 verifyIndependentOfContext("A = new SomeType *[Length]();"); 8086 verifyIndependentOfContext("T **t = new T *;"); 8087 verifyIndependentOfContext("T **t = new T *();"); 8088 verifyGoogleFormat("A = new SomeType*[Length]();"); 8089 verifyGoogleFormat("A = new SomeType*[Length];"); 8090 verifyGoogleFormat("T** t = new T*;"); 8091 verifyGoogleFormat("T** t = new T*();"); 8092 8093 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 8094 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 8095 verifyFormat("template <bool a, bool b> " 8096 "typename t::if<x && y>::type f() {}"); 8097 verifyFormat("template <int *y> f() {}"); 8098 verifyFormat("vector<int *> v;"); 8099 verifyFormat("vector<int *const> v;"); 8100 verifyFormat("vector<int *const **const *> v;"); 8101 verifyFormat("vector<int *volatile> v;"); 8102 verifyFormat("vector<a *_Nonnull> v;"); 8103 verifyFormat("vector<a *_Nullable> v;"); 8104 verifyFormat("vector<a *_Null_unspecified> v;"); 8105 verifyFormat("vector<a *__ptr32> v;"); 8106 verifyFormat("vector<a *__ptr64> v;"); 8107 verifyFormat("vector<a *__capability> v;"); 8108 FormatStyle TypeMacros = getLLVMStyle(); 8109 TypeMacros.TypenameMacros = {"LIST"}; 8110 verifyFormat("vector<LIST(uint64_t)> v;", TypeMacros); 8111 verifyFormat("vector<LIST(uint64_t) *> v;", TypeMacros); 8112 verifyFormat("vector<LIST(uint64_t) **> v;", TypeMacros); 8113 verifyFormat("vector<LIST(uint64_t) *attr> v;", TypeMacros); 8114 verifyFormat("vector<A(uint64_t) * attr> v;", TypeMacros); // multiplication 8115 8116 FormatStyle CustomQualifier = getLLVMStyle(); 8117 // Add indentifers that should not be parsed as a qualifier by default. 8118 CustomQualifier.AttributeMacros.push_back("__my_qualifier"); 8119 CustomQualifier.AttributeMacros.push_back("_My_qualifier"); 8120 CustomQualifier.AttributeMacros.push_back("my_other_qualifier"); 8121 verifyFormat("vector<a * __my_qualifier> parse_as_multiply;"); 8122 verifyFormat("vector<a *__my_qualifier> v;", CustomQualifier); 8123 verifyFormat("vector<a * _My_qualifier> parse_as_multiply;"); 8124 verifyFormat("vector<a *_My_qualifier> v;", CustomQualifier); 8125 verifyFormat("vector<a * my_other_qualifier> parse_as_multiply;"); 8126 verifyFormat("vector<a *my_other_qualifier> v;", CustomQualifier); 8127 verifyFormat("vector<a * _NotAQualifier> v;"); 8128 verifyFormat("vector<a * __not_a_qualifier> v;"); 8129 verifyFormat("vector<a * b> v;"); 8130 verifyFormat("foo<b && false>();"); 8131 verifyFormat("foo<b & 1>();"); 8132 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 8133 verifyFormat("typeof(*::std::declval<const T &>()) void F();"); 8134 verifyFormat("_Atomic(*::std::declval<const T &>()) void F();"); 8135 verifyFormat("__underlying_type(*::std::declval<const T &>()) void F();"); 8136 verifyFormat( 8137 "template <class T, class = typename std::enable_if<\n" 8138 " std::is_integral<T>::value &&\n" 8139 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 8140 "void F();", 8141 getLLVMStyleWithColumns(70)); 8142 verifyFormat("template <class T,\n" 8143 " class = typename std::enable_if<\n" 8144 " std::is_integral<T>::value &&\n" 8145 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 8146 " class U>\n" 8147 "void F();", 8148 getLLVMStyleWithColumns(70)); 8149 verifyFormat( 8150 "template <class T,\n" 8151 " class = typename ::std::enable_if<\n" 8152 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 8153 "void F();", 8154 getGoogleStyleWithColumns(68)); 8155 8156 verifyIndependentOfContext("MACRO(int *i);"); 8157 verifyIndependentOfContext("MACRO(auto *a);"); 8158 verifyIndependentOfContext("MACRO(const A *a);"); 8159 verifyIndependentOfContext("MACRO(_Atomic(A) *a);"); 8160 verifyIndependentOfContext("MACRO(decltype(A) *a);"); 8161 verifyIndependentOfContext("MACRO(typeof(A) *a);"); 8162 verifyIndependentOfContext("MACRO(__underlying_type(A) *a);"); 8163 verifyIndependentOfContext("MACRO(A *const a);"); 8164 verifyIndependentOfContext("MACRO(A *restrict a);"); 8165 verifyIndependentOfContext("MACRO(A *__restrict__ a);"); 8166 verifyIndependentOfContext("MACRO(A *__restrict a);"); 8167 verifyIndependentOfContext("MACRO(A *volatile a);"); 8168 verifyIndependentOfContext("MACRO(A *__volatile a);"); 8169 verifyIndependentOfContext("MACRO(A *__volatile__ a);"); 8170 verifyIndependentOfContext("MACRO(A *_Nonnull a);"); 8171 verifyIndependentOfContext("MACRO(A *_Nullable a);"); 8172 verifyIndependentOfContext("MACRO(A *_Null_unspecified a);"); 8173 verifyIndependentOfContext("MACRO(A *__attribute__((foo)) a);"); 8174 verifyIndependentOfContext("MACRO(A *__attribute((foo)) a);"); 8175 verifyIndependentOfContext("MACRO(A *[[clang::attr]] a);"); 8176 verifyIndependentOfContext("MACRO(A *[[clang::attr(\"foo\")]] a);"); 8177 verifyIndependentOfContext("MACRO(A *__ptr32 a);"); 8178 verifyIndependentOfContext("MACRO(A *__ptr64 a);"); 8179 verifyIndependentOfContext("MACRO(A *__capability);"); 8180 verifyIndependentOfContext("MACRO(A &__capability);"); 8181 verifyFormat("MACRO(A *__my_qualifier);"); // type declaration 8182 verifyFormat("void f() { MACRO(A * __my_qualifier); }"); // multiplication 8183 // If we add __my_qualifier to AttributeMacros it should always be parsed as 8184 // a type declaration: 8185 verifyFormat("MACRO(A *__my_qualifier);", CustomQualifier); 8186 verifyFormat("void f() { MACRO(A *__my_qualifier); }", CustomQualifier); 8187 // Also check that TypenameMacros prevents parsing it as multiplication: 8188 verifyIndependentOfContext("MACRO(LIST(uint64_t) * a);"); // multiplication 8189 verifyIndependentOfContext("MACRO(LIST(uint64_t) *a);", TypeMacros); // type 8190 8191 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 8192 verifyFormat("void f() { f(float{1}, a * a); }"); 8193 // FIXME: Is there a way to make this work? 8194 // verifyIndependentOfContext("MACRO(A *a);"); 8195 verifyFormat("MACRO(A &B);"); 8196 verifyFormat("MACRO(A *B);"); 8197 verifyFormat("void f() { MACRO(A * B); }"); 8198 verifyFormat("void f() { MACRO(A & B); }"); 8199 8200 // This lambda was mis-formatted after D88956 (treating it as a binop): 8201 verifyFormat("auto x = [](const decltype(x) &ptr) {};"); 8202 verifyFormat("auto x = [](const decltype(x) *ptr) {};"); 8203 verifyFormat("#define lambda [](const decltype(x) &ptr) {}"); 8204 verifyFormat("#define lambda [](const decltype(x) *ptr) {}"); 8205 8206 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 8207 verifyFormat("return options != nullptr && operator==(*options);"); 8208 8209 EXPECT_EQ("#define OP(x) \\\n" 8210 " ostream &operator<<(ostream &s, const A &a) { \\\n" 8211 " return s << a.DebugString(); \\\n" 8212 " }", 8213 format("#define OP(x) \\\n" 8214 " ostream &operator<<(ostream &s, const A &a) { \\\n" 8215 " return s << a.DebugString(); \\\n" 8216 " }", 8217 getLLVMStyleWithColumns(50))); 8218 8219 // FIXME: We cannot handle this case yet; we might be able to figure out that 8220 // foo<x> d > v; doesn't make sense. 8221 verifyFormat("foo<a<b && c> d> v;"); 8222 8223 FormatStyle PointerMiddle = getLLVMStyle(); 8224 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 8225 verifyFormat("delete *x;", PointerMiddle); 8226 verifyFormat("int * x;", PointerMiddle); 8227 verifyFormat("int *[] x;", PointerMiddle); 8228 verifyFormat("template <int * y> f() {}", PointerMiddle); 8229 verifyFormat("int * f(int * a) {}", PointerMiddle); 8230 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 8231 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 8232 verifyFormat("A<int *> a;", PointerMiddle); 8233 verifyFormat("A<int **> a;", PointerMiddle); 8234 verifyFormat("A<int *, int *> a;", PointerMiddle); 8235 verifyFormat("A<int *[]> a;", PointerMiddle); 8236 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 8237 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 8238 verifyFormat("T ** t = new T *;", PointerMiddle); 8239 8240 // Member function reference qualifiers aren't binary operators. 8241 verifyFormat("string // break\n" 8242 "operator()() & {}"); 8243 verifyFormat("string // break\n" 8244 "operator()() && {}"); 8245 verifyGoogleFormat("template <typename T>\n" 8246 "auto x() & -> int {}"); 8247 } 8248 8249 TEST_F(FormatTest, UnderstandsAttributes) { 8250 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 8251 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 8252 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8253 FormatStyle AfterType = getLLVMStyle(); 8254 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 8255 verifyFormat("__attribute__((nodebug)) void\n" 8256 "foo() {}\n", 8257 AfterType); 8258 verifyFormat("__unused void\n" 8259 "foo() {}", 8260 AfterType); 8261 8262 FormatStyle CustomAttrs = getLLVMStyle(); 8263 CustomAttrs.AttributeMacros.push_back("__unused"); 8264 CustomAttrs.AttributeMacros.push_back("__attr1"); 8265 CustomAttrs.AttributeMacros.push_back("__attr2"); 8266 CustomAttrs.AttributeMacros.push_back("no_underscore_attr"); 8267 verifyFormat("vector<SomeType *__attribute((foo))> v;"); 8268 verifyFormat("vector<SomeType *__attribute__((foo))> v;"); 8269 verifyFormat("vector<SomeType * __not_attribute__((foo))> v;"); 8270 // Check that it is parsed as a multiplication without AttributeMacros and 8271 // as a pointer qualifier when we add __attr1/__attr2 to AttributeMacros. 8272 verifyFormat("vector<SomeType * __attr1> v;"); 8273 verifyFormat("vector<SomeType __attr1 *> v;"); 8274 verifyFormat("vector<SomeType __attr1 *const> v;"); 8275 verifyFormat("vector<SomeType __attr1 * __attr2> v;"); 8276 verifyFormat("vector<SomeType *__attr1> v;", CustomAttrs); 8277 verifyFormat("vector<SomeType *__attr2> v;", CustomAttrs); 8278 verifyFormat("vector<SomeType *no_underscore_attr> v;", CustomAttrs); 8279 verifyFormat("vector<SomeType __attr1 *> v;", CustomAttrs); 8280 verifyFormat("vector<SomeType __attr1 *const> v;", CustomAttrs); 8281 verifyFormat("vector<SomeType __attr1 *__attr2> v;", CustomAttrs); 8282 verifyFormat("vector<SomeType __attr1 *no_underscore_attr> v;", CustomAttrs); 8283 8284 // Check that these are not parsed as function declarations: 8285 CustomAttrs.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8286 CustomAttrs.BreakBeforeBraces = FormatStyle::BS_Allman; 8287 verifyFormat("SomeType s(InitValue);", CustomAttrs); 8288 verifyFormat("SomeType s{InitValue};", CustomAttrs); 8289 verifyFormat("SomeType *__unused s(InitValue);", CustomAttrs); 8290 verifyFormat("SomeType *__unused s{InitValue};", CustomAttrs); 8291 verifyFormat("SomeType s __unused(InitValue);", CustomAttrs); 8292 verifyFormat("SomeType s __unused{InitValue};", CustomAttrs); 8293 verifyFormat("SomeType *__capability s(InitValue);", CustomAttrs); 8294 verifyFormat("SomeType *__capability s{InitValue};", CustomAttrs); 8295 } 8296 8297 TEST_F(FormatTest, UnderstandsPointerQualifiersInCast) { 8298 // Check that qualifiers on pointers don't break parsing of casts. 8299 verifyFormat("x = (foo *const)*v;"); 8300 verifyFormat("x = (foo *volatile)*v;"); 8301 verifyFormat("x = (foo *restrict)*v;"); 8302 verifyFormat("x = (foo *__attribute__((foo)))*v;"); 8303 verifyFormat("x = (foo *_Nonnull)*v;"); 8304 verifyFormat("x = (foo *_Nullable)*v;"); 8305 verifyFormat("x = (foo *_Null_unspecified)*v;"); 8306 verifyFormat("x = (foo *_Nonnull)*v;"); 8307 verifyFormat("x = (foo *[[clang::attr]])*v;"); 8308 verifyFormat("x = (foo *[[clang::attr(\"foo\")]])*v;"); 8309 verifyFormat("x = (foo *__ptr32)*v;"); 8310 verifyFormat("x = (foo *__ptr64)*v;"); 8311 verifyFormat("x = (foo *__capability)*v;"); 8312 8313 // Check that we handle multiple trailing qualifiers and skip them all to 8314 // determine that the expression is a cast to a pointer type. 8315 FormatStyle LongPointerRight = getLLVMStyleWithColumns(999); 8316 FormatStyle LongPointerLeft = getLLVMStyleWithColumns(999); 8317 LongPointerLeft.PointerAlignment = FormatStyle::PAS_Left; 8318 StringRef AllQualifiers = 8319 "const volatile restrict __attribute__((foo)) _Nonnull _Null_unspecified " 8320 "_Nonnull [[clang::attr]] __ptr32 __ptr64 __capability"; 8321 verifyFormat(("x = (foo *" + AllQualifiers + ")*v;").str(), LongPointerRight); 8322 verifyFormat(("x = (foo* " + AllQualifiers + ")*v;").str(), LongPointerLeft); 8323 8324 // Also check that address-of is not parsed as a binary bitwise-and: 8325 verifyFormat("x = (foo *const)&v;"); 8326 verifyFormat(("x = (foo *" + AllQualifiers + ")&v;").str(), LongPointerRight); 8327 verifyFormat(("x = (foo* " + AllQualifiers + ")&v;").str(), LongPointerLeft); 8328 8329 // Check custom qualifiers: 8330 FormatStyle CustomQualifier = getLLVMStyleWithColumns(999); 8331 CustomQualifier.AttributeMacros.push_back("__my_qualifier"); 8332 verifyFormat("x = (foo * __my_qualifier) * v;"); // not parsed as qualifier. 8333 verifyFormat("x = (foo *__my_qualifier)*v;", CustomQualifier); 8334 verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)*v;").str(), 8335 CustomQualifier); 8336 verifyFormat(("x = (foo *" + AllQualifiers + " __my_qualifier)&v;").str(), 8337 CustomQualifier); 8338 8339 // Check that unknown identifiers result in binary operator parsing: 8340 verifyFormat("x = (foo * __unknown_qualifier) * v;"); 8341 verifyFormat("x = (foo * __unknown_qualifier) & v;"); 8342 } 8343 8344 TEST_F(FormatTest, UnderstandsSquareAttributes) { 8345 verifyFormat("SomeType s [[unused]] (InitValue);"); 8346 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 8347 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 8348 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 8349 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 8350 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8351 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8352 verifyFormat("[[nodiscard]] bool f() { return false; }"); 8353 verifyFormat("class [[nodiscard]] f {\npublic:\n f() {}\n}"); 8354 verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n f() {}\n}"); 8355 verifyFormat("class [[gnu::unused]] f {\npublic:\n f() {}\n}"); 8356 8357 // Make sure we do not mistake attributes for array subscripts. 8358 verifyFormat("int a() {}\n" 8359 "[[unused]] int b() {}\n"); 8360 verifyFormat("NSArray *arr;\n" 8361 "arr[[Foo() bar]];"); 8362 8363 // On the other hand, we still need to correctly find array subscripts. 8364 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 8365 8366 // Make sure that we do not mistake Objective-C method inside array literals 8367 // as attributes, even if those method names are also keywords. 8368 verifyFormat("@[ [foo bar] ];"); 8369 verifyFormat("@[ [NSArray class] ];"); 8370 verifyFormat("@[ [foo enum] ];"); 8371 8372 verifyFormat("template <typename T> [[nodiscard]] int a() { return 1; }"); 8373 8374 // Make sure we do not parse attributes as lambda introducers. 8375 FormatStyle MultiLineFunctions = getLLVMStyle(); 8376 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8377 verifyFormat("[[unused]] int b() {\n" 8378 " return 42;\n" 8379 "}\n", 8380 MultiLineFunctions); 8381 } 8382 8383 TEST_F(FormatTest, AttributeClass) { 8384 FormatStyle Style = getChromiumStyle(FormatStyle::LK_Cpp); 8385 verifyFormat("class S {\n" 8386 " S(S&&) = default;\n" 8387 "};", 8388 Style); 8389 verifyFormat("class [[nodiscard]] S {\n" 8390 " S(S&&) = default;\n" 8391 "};", 8392 Style); 8393 verifyFormat("class __attribute((maybeunused)) S {\n" 8394 " S(S&&) = default;\n" 8395 "};", 8396 Style); 8397 verifyFormat("struct S {\n" 8398 " S(S&&) = default;\n" 8399 "};", 8400 Style); 8401 verifyFormat("struct [[nodiscard]] S {\n" 8402 " S(S&&) = default;\n" 8403 "};", 8404 Style); 8405 } 8406 8407 TEST_F(FormatTest, AttributesAfterMacro) { 8408 FormatStyle Style = getLLVMStyle(); 8409 verifyFormat("MACRO;\n" 8410 "__attribute__((maybe_unused)) int foo() {\n" 8411 " //...\n" 8412 "}"); 8413 8414 verifyFormat("MACRO;\n" 8415 "[[nodiscard]] int foo() {\n" 8416 " //...\n" 8417 "}"); 8418 8419 EXPECT_EQ("MACRO\n\n" 8420 "__attribute__((maybe_unused)) int foo() {\n" 8421 " //...\n" 8422 "}", 8423 format("MACRO\n\n" 8424 "__attribute__((maybe_unused)) int foo() {\n" 8425 " //...\n" 8426 "}")); 8427 8428 EXPECT_EQ("MACRO\n\n" 8429 "[[nodiscard]] int foo() {\n" 8430 " //...\n" 8431 "}", 8432 format("MACRO\n\n" 8433 "[[nodiscard]] int foo() {\n" 8434 " //...\n" 8435 "}")); 8436 } 8437 8438 TEST_F(FormatTest, AttributePenaltyBreaking) { 8439 FormatStyle Style = getLLVMStyle(); 8440 verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n" 8441 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8442 Style); 8443 verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n" 8444 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8445 Style); 8446 verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const " 8447 "shared_ptr<ALongTypeName> &C d) {\n}", 8448 Style); 8449 } 8450 8451 TEST_F(FormatTest, UnderstandsEllipsis) { 8452 FormatStyle Style = getLLVMStyle(); 8453 verifyFormat("int printf(const char *fmt, ...);"); 8454 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 8455 verifyFormat("template <class... Ts> void Foo(Ts *...ts) {}"); 8456 8457 verifyFormat("template <int *...PP> a;", Style); 8458 8459 Style.PointerAlignment = FormatStyle::PAS_Left; 8460 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", Style); 8461 8462 verifyFormat("template <int*... PP> a;", Style); 8463 8464 Style.PointerAlignment = FormatStyle::PAS_Middle; 8465 verifyFormat("template <int *... PP> a;", Style); 8466 } 8467 8468 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 8469 EXPECT_EQ("int *a;\n" 8470 "int *a;\n" 8471 "int *a;", 8472 format("int *a;\n" 8473 "int* a;\n" 8474 "int *a;", 8475 getGoogleStyle())); 8476 EXPECT_EQ("int* a;\n" 8477 "int* a;\n" 8478 "int* a;", 8479 format("int* a;\n" 8480 "int* a;\n" 8481 "int *a;", 8482 getGoogleStyle())); 8483 EXPECT_EQ("int *a;\n" 8484 "int *a;\n" 8485 "int *a;", 8486 format("int *a;\n" 8487 "int * a;\n" 8488 "int * a;", 8489 getGoogleStyle())); 8490 EXPECT_EQ("auto x = [] {\n" 8491 " int *a;\n" 8492 " int *a;\n" 8493 " int *a;\n" 8494 "};", 8495 format("auto x=[]{int *a;\n" 8496 "int * a;\n" 8497 "int * a;};", 8498 getGoogleStyle())); 8499 } 8500 8501 TEST_F(FormatTest, UnderstandsRvalueReferences) { 8502 verifyFormat("int f(int &&a) {}"); 8503 verifyFormat("int f(int a, char &&b) {}"); 8504 verifyFormat("void f() { int &&a = b; }"); 8505 verifyGoogleFormat("int f(int a, char&& b) {}"); 8506 verifyGoogleFormat("void f() { int&& a = b; }"); 8507 8508 verifyIndependentOfContext("A<int &&> a;"); 8509 verifyIndependentOfContext("A<int &&, int &&> a;"); 8510 verifyGoogleFormat("A<int&&> a;"); 8511 verifyGoogleFormat("A<int&&, int&&> a;"); 8512 8513 // Not rvalue references: 8514 verifyFormat("template <bool B, bool C> class A {\n" 8515 " static_assert(B && C, \"Something is wrong\");\n" 8516 "};"); 8517 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 8518 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 8519 verifyFormat("#define A(a, b) (a && b)"); 8520 } 8521 8522 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 8523 verifyFormat("void f() {\n" 8524 " x[aaaaaaaaa -\n" 8525 " b] = 23;\n" 8526 "}", 8527 getLLVMStyleWithColumns(15)); 8528 } 8529 8530 TEST_F(FormatTest, FormatsCasts) { 8531 verifyFormat("Type *A = static_cast<Type *>(P);"); 8532 verifyFormat("Type *A = (Type *)P;"); 8533 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 8534 verifyFormat("int a = (int)(2.0f);"); 8535 verifyFormat("int a = (int)2.0f;"); 8536 verifyFormat("x[(int32)y];"); 8537 verifyFormat("x = (int32)y;"); 8538 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 8539 verifyFormat("int a = (int)*b;"); 8540 verifyFormat("int a = (int)2.0f;"); 8541 verifyFormat("int a = (int)~0;"); 8542 verifyFormat("int a = (int)++a;"); 8543 verifyFormat("int a = (int)sizeof(int);"); 8544 verifyFormat("int a = (int)+2;"); 8545 verifyFormat("my_int a = (my_int)2.0f;"); 8546 verifyFormat("my_int a = (my_int)sizeof(int);"); 8547 verifyFormat("return (my_int)aaa;"); 8548 verifyFormat("#define x ((int)-1)"); 8549 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 8550 verifyFormat("#define p(q) ((int *)&q)"); 8551 verifyFormat("fn(a)(b) + 1;"); 8552 8553 verifyFormat("void f() { my_int a = (my_int)*b; }"); 8554 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 8555 verifyFormat("my_int a = (my_int)~0;"); 8556 verifyFormat("my_int a = (my_int)++a;"); 8557 verifyFormat("my_int a = (my_int)-2;"); 8558 verifyFormat("my_int a = (my_int)1;"); 8559 verifyFormat("my_int a = (my_int *)1;"); 8560 verifyFormat("my_int a = (const my_int)-1;"); 8561 verifyFormat("my_int a = (const my_int *)-1;"); 8562 verifyFormat("my_int a = (my_int)(my_int)-1;"); 8563 verifyFormat("my_int a = (ns::my_int)-2;"); 8564 verifyFormat("case (my_int)ONE:"); 8565 verifyFormat("auto x = (X)this;"); 8566 // Casts in Obj-C style calls used to not be recognized as such. 8567 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 8568 8569 // FIXME: single value wrapped with paren will be treated as cast. 8570 verifyFormat("void f(int i = (kValue)*kMask) {}"); 8571 8572 verifyFormat("{ (void)F; }"); 8573 8574 // Don't break after a cast's 8575 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 8576 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 8577 " bbbbbbbbbbbbbbbbbbbbbb);"); 8578 8579 // These are not casts. 8580 verifyFormat("void f(int *) {}"); 8581 verifyFormat("f(foo)->b;"); 8582 verifyFormat("f(foo).b;"); 8583 verifyFormat("f(foo)(b);"); 8584 verifyFormat("f(foo)[b];"); 8585 verifyFormat("[](foo) { return 4; }(bar);"); 8586 verifyFormat("(*funptr)(foo)[4];"); 8587 verifyFormat("funptrs[4](foo)[4];"); 8588 verifyFormat("void f(int *);"); 8589 verifyFormat("void f(int *) = 0;"); 8590 verifyFormat("void f(SmallVector<int>) {}"); 8591 verifyFormat("void f(SmallVector<int>);"); 8592 verifyFormat("void f(SmallVector<int>) = 0;"); 8593 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 8594 verifyFormat("int a = sizeof(int) * b;"); 8595 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 8596 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 8597 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 8598 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 8599 8600 // These are not casts, but at some point were confused with casts. 8601 verifyFormat("virtual void foo(int *) override;"); 8602 verifyFormat("virtual void foo(char &) const;"); 8603 verifyFormat("virtual void foo(int *a, char *) const;"); 8604 verifyFormat("int a = sizeof(int *) + b;"); 8605 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 8606 verifyFormat("bool b = f(g<int>) && c;"); 8607 verifyFormat("typedef void (*f)(int i) func;"); 8608 verifyFormat("void operator++(int) noexcept;"); 8609 verifyFormat("void operator++(int &) noexcept;"); 8610 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 8611 "&) noexcept;"); 8612 verifyFormat( 8613 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 8614 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 8615 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 8616 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 8617 verifyFormat("void operator delete(foo &) noexcept;"); 8618 verifyFormat("void operator delete(foo) noexcept;"); 8619 verifyFormat("void operator delete(int) noexcept;"); 8620 verifyFormat("void operator delete(int &) noexcept;"); 8621 verifyFormat("void operator delete(int &) volatile noexcept;"); 8622 verifyFormat("void operator delete(int &) const"); 8623 verifyFormat("void operator delete(int &) = default"); 8624 verifyFormat("void operator delete(int &) = delete"); 8625 verifyFormat("void operator delete(int &) [[noreturn]]"); 8626 verifyFormat("void operator delete(int &) throw();"); 8627 verifyFormat("void operator delete(int &) throw(int);"); 8628 verifyFormat("auto operator delete(int &) -> int;"); 8629 verifyFormat("auto operator delete(int &) override"); 8630 verifyFormat("auto operator delete(int &) final"); 8631 8632 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 8633 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 8634 // FIXME: The indentation here is not ideal. 8635 verifyFormat( 8636 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8637 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 8638 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 8639 } 8640 8641 TEST_F(FormatTest, FormatsFunctionTypes) { 8642 verifyFormat("A<bool()> a;"); 8643 verifyFormat("A<SomeType()> a;"); 8644 verifyFormat("A<void (*)(int, std::string)> a;"); 8645 verifyFormat("A<void *(int)>;"); 8646 verifyFormat("void *(*a)(int *, SomeType *);"); 8647 verifyFormat("int (*func)(void *);"); 8648 verifyFormat("void f() { int (*func)(void *); }"); 8649 verifyFormat("template <class CallbackClass>\n" 8650 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 8651 8652 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 8653 verifyGoogleFormat("void* (*a)(int);"); 8654 verifyGoogleFormat( 8655 "template <class CallbackClass>\n" 8656 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 8657 8658 // Other constructs can look somewhat like function types: 8659 verifyFormat("A<sizeof(*x)> a;"); 8660 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 8661 verifyFormat("some_var = function(*some_pointer_var)[0];"); 8662 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 8663 verifyFormat("int x = f(&h)();"); 8664 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 8665 verifyFormat("std::function<\n" 8666 " LooooooooooongTemplatedType<\n" 8667 " SomeType>*(\n" 8668 " LooooooooooooooooongType type)>\n" 8669 " function;", 8670 getGoogleStyleWithColumns(40)); 8671 } 8672 8673 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 8674 verifyFormat("A (*foo_)[6];"); 8675 verifyFormat("vector<int> (*foo_)[6];"); 8676 } 8677 8678 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 8679 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8680 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8681 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 8682 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8683 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8684 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8685 8686 // Different ways of ()-initializiation. 8687 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8688 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 8689 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8690 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 8691 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8692 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 8693 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8694 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 8695 8696 // Lambdas should not confuse the variable declaration heuristic. 8697 verifyFormat("LooooooooooooooooongType\n" 8698 " variable(nullptr, [](A *a) {});", 8699 getLLVMStyleWithColumns(40)); 8700 } 8701 8702 TEST_F(FormatTest, BreaksLongDeclarations) { 8703 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 8704 " AnotherNameForTheLongType;"); 8705 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 8706 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 8707 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8708 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8709 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 8710 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8711 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8712 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8713 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 8714 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8715 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8716 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8717 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8718 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8719 verifyFormat("typeof(LoooooooooooooooooooooooooooooooooooooooooongName)\n" 8720 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8721 verifyFormat("_Atomic(LooooooooooooooooooooooooooooooooooooooooongName)\n" 8722 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8723 verifyFormat("__underlying_type(LooooooooooooooooooooooooooooooongName)\n" 8724 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8725 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8726 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 8727 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8728 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 8729 FormatStyle Indented = getLLVMStyle(); 8730 Indented.IndentWrappedFunctionNames = true; 8731 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8732 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 8733 Indented); 8734 verifyFormat( 8735 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8736 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8737 Indented); 8738 verifyFormat( 8739 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8740 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8741 Indented); 8742 verifyFormat( 8743 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8744 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8745 Indented); 8746 8747 // FIXME: Without the comment, this breaks after "(". 8748 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 8749 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 8750 getGoogleStyle()); 8751 8752 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 8753 " int LoooooooooooooooooooongParam2) {}"); 8754 verifyFormat( 8755 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 8756 " SourceLocation L, IdentifierIn *II,\n" 8757 " Type *T) {}"); 8758 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 8759 "ReallyReaaallyLongFunctionName(\n" 8760 " const std::string &SomeParameter,\n" 8761 " const SomeType<string, SomeOtherTemplateParameter>\n" 8762 " &ReallyReallyLongParameterName,\n" 8763 " const SomeType<string, SomeOtherTemplateParameter>\n" 8764 " &AnotherLongParameterName) {}"); 8765 verifyFormat("template <typename A>\n" 8766 "SomeLoooooooooooooooooooooongType<\n" 8767 " typename some_namespace::SomeOtherType<A>::Type>\n" 8768 "Function() {}"); 8769 8770 verifyGoogleFormat( 8771 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 8772 " aaaaaaaaaaaaaaaaaaaaaaa;"); 8773 verifyGoogleFormat( 8774 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 8775 " SourceLocation L) {}"); 8776 verifyGoogleFormat( 8777 "some_namespace::LongReturnType\n" 8778 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 8779 " int first_long_parameter, int second_parameter) {}"); 8780 8781 verifyGoogleFormat("template <typename T>\n" 8782 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8783 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 8784 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8785 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 8786 8787 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 8788 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8789 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8790 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8791 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8792 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 8793 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8794 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 8795 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 8796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8797 8798 verifyFormat("template <typename T> // Templates on own line.\n" 8799 "static int // Some comment.\n" 8800 "MyFunction(int a);", 8801 getLLVMStyle()); 8802 } 8803 8804 TEST_F(FormatTest, FormatsArrays) { 8805 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8806 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 8807 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 8808 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 8809 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 8810 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 8811 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8812 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8813 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8814 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 8815 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8816 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8817 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8818 verifyFormat( 8819 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 8820 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8821 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 8822 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 8823 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8824 8825 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 8826 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 8827 verifyFormat( 8828 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 8829 " .aaaaaaa[0]\n" 8830 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8831 verifyFormat("a[::b::c];"); 8832 8833 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 8834 8835 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 8836 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 8837 } 8838 8839 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 8840 verifyFormat("(a)->b();"); 8841 verifyFormat("--a;"); 8842 } 8843 8844 TEST_F(FormatTest, HandlesIncludeDirectives) { 8845 verifyFormat("#include <string>\n" 8846 "#include <a/b/c.h>\n" 8847 "#include \"a/b/string\"\n" 8848 "#include \"string.h\"\n" 8849 "#include \"string.h\"\n" 8850 "#include <a-a>\n" 8851 "#include < path with space >\n" 8852 "#include_next <test.h>" 8853 "#include \"abc.h\" // this is included for ABC\n" 8854 "#include \"some long include\" // with a comment\n" 8855 "#include \"some very long include path\"\n" 8856 "#include <some/very/long/include/path>\n", 8857 getLLVMStyleWithColumns(35)); 8858 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 8859 EXPECT_EQ("#include <a>", format("#include<a>")); 8860 8861 verifyFormat("#import <string>"); 8862 verifyFormat("#import <a/b/c.h>"); 8863 verifyFormat("#import \"a/b/string\""); 8864 verifyFormat("#import \"string.h\""); 8865 verifyFormat("#import \"string.h\""); 8866 verifyFormat("#if __has_include(<strstream>)\n" 8867 "#include <strstream>\n" 8868 "#endif"); 8869 8870 verifyFormat("#define MY_IMPORT <a/b>"); 8871 8872 verifyFormat("#if __has_include(<a/b>)"); 8873 verifyFormat("#if __has_include_next(<a/b>)"); 8874 verifyFormat("#define F __has_include(<a/b>)"); 8875 verifyFormat("#define F __has_include_next(<a/b>)"); 8876 8877 // Protocol buffer definition or missing "#". 8878 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 8879 getLLVMStyleWithColumns(30)); 8880 8881 FormatStyle Style = getLLVMStyle(); 8882 Style.AlwaysBreakBeforeMultilineStrings = true; 8883 Style.ColumnLimit = 0; 8884 verifyFormat("#import \"abc.h\"", Style); 8885 8886 // But 'import' might also be a regular C++ namespace. 8887 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8889 } 8890 8891 //===----------------------------------------------------------------------===// 8892 // Error recovery tests. 8893 //===----------------------------------------------------------------------===// 8894 8895 TEST_F(FormatTest, IncompleteParameterLists) { 8896 FormatStyle NoBinPacking = getLLVMStyle(); 8897 NoBinPacking.BinPackParameters = false; 8898 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 8899 " double *min_x,\n" 8900 " double *max_x,\n" 8901 " double *min_y,\n" 8902 " double *max_y,\n" 8903 " double *min_z,\n" 8904 " double *max_z, ) {}", 8905 NoBinPacking); 8906 } 8907 8908 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 8909 verifyFormat("void f() { return; }\n42"); 8910 verifyFormat("void f() {\n" 8911 " if (0)\n" 8912 " return;\n" 8913 "}\n" 8914 "42"); 8915 verifyFormat("void f() { return }\n42"); 8916 verifyFormat("void f() {\n" 8917 " if (0)\n" 8918 " return\n" 8919 "}\n" 8920 "42"); 8921 } 8922 8923 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 8924 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 8925 EXPECT_EQ("void f() {\n" 8926 " if (a)\n" 8927 " return\n" 8928 "}", 8929 format("void f ( ) { if ( a ) return }")); 8930 EXPECT_EQ("namespace N {\n" 8931 "void f()\n" 8932 "}", 8933 format("namespace N { void f() }")); 8934 EXPECT_EQ("namespace N {\n" 8935 "void f() {}\n" 8936 "void g()\n" 8937 "} // namespace N", 8938 format("namespace N { void f( ) { } void g( ) }")); 8939 } 8940 8941 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 8942 verifyFormat("int aaaaaaaa =\n" 8943 " // Overlylongcomment\n" 8944 " b;", 8945 getLLVMStyleWithColumns(20)); 8946 verifyFormat("function(\n" 8947 " ShortArgument,\n" 8948 " LoooooooooooongArgument);\n", 8949 getLLVMStyleWithColumns(20)); 8950 } 8951 8952 TEST_F(FormatTest, IncorrectAccessSpecifier) { 8953 verifyFormat("public:"); 8954 verifyFormat("class A {\n" 8955 "public\n" 8956 " void f() {}\n" 8957 "};"); 8958 verifyFormat("public\n" 8959 "int qwerty;"); 8960 verifyFormat("public\n" 8961 "B {}"); 8962 verifyFormat("public\n" 8963 "{}"); 8964 verifyFormat("public\n" 8965 "B { int x; }"); 8966 } 8967 8968 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 8969 verifyFormat("{"); 8970 verifyFormat("#})"); 8971 verifyNoCrash("(/**/[:!] ?[)."); 8972 } 8973 8974 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 8975 // Found by oss-fuzz: 8976 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 8977 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 8978 Style.ColumnLimit = 60; 8979 verifyNoCrash( 8980 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 8981 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 8982 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 8983 Style); 8984 } 8985 8986 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 8987 verifyFormat("do {\n}"); 8988 verifyFormat("do {\n}\n" 8989 "f();"); 8990 verifyFormat("do {\n}\n" 8991 "wheeee(fun);"); 8992 verifyFormat("do {\n" 8993 " f();\n" 8994 "}"); 8995 } 8996 8997 TEST_F(FormatTest, IncorrectCodeMissingParens) { 8998 verifyFormat("if {\n foo;\n foo();\n}"); 8999 verifyFormat("switch {\n foo;\n foo();\n}"); 9000 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 9001 verifyFormat("while {\n foo;\n foo();\n}"); 9002 verifyFormat("do {\n foo;\n foo();\n} while;"); 9003 } 9004 9005 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 9006 verifyIncompleteFormat("namespace {\n" 9007 "class Foo { Foo (\n" 9008 "};\n" 9009 "} // namespace"); 9010 } 9011 9012 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 9013 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 9014 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 9015 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 9016 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 9017 9018 EXPECT_EQ("{\n" 9019 " {\n" 9020 " breakme(\n" 9021 " qwe);\n" 9022 " }\n", 9023 format("{\n" 9024 " {\n" 9025 " breakme(qwe);\n" 9026 "}\n", 9027 getLLVMStyleWithColumns(10))); 9028 } 9029 9030 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 9031 verifyFormat("int x = {\n" 9032 " avariable,\n" 9033 " b(alongervariable)};", 9034 getLLVMStyleWithColumns(25)); 9035 } 9036 9037 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 9038 verifyFormat("return (a)(b){1, 2, 3};"); 9039 } 9040 9041 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 9042 verifyFormat("vector<int> x{1, 2, 3, 4};"); 9043 verifyFormat("vector<int> x{\n" 9044 " 1,\n" 9045 " 2,\n" 9046 " 3,\n" 9047 " 4,\n" 9048 "};"); 9049 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 9050 verifyFormat("f({1, 2});"); 9051 verifyFormat("auto v = Foo{-1};"); 9052 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 9053 verifyFormat("Class::Class : member{1, 2, 3} {}"); 9054 verifyFormat("new vector<int>{1, 2, 3};"); 9055 verifyFormat("new int[3]{1, 2, 3};"); 9056 verifyFormat("new int{1};"); 9057 verifyFormat("return {arg1, arg2};"); 9058 verifyFormat("return {arg1, SomeType{parameter}};"); 9059 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 9060 verifyFormat("new T{arg1, arg2};"); 9061 verifyFormat("f(MyMap[{composite, key}]);"); 9062 verifyFormat("class Class {\n" 9063 " T member = {arg1, arg2};\n" 9064 "};"); 9065 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 9066 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 9067 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 9068 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 9069 verifyFormat("int a = std::is_integral<int>{} + 0;"); 9070 9071 verifyFormat("int foo(int i) { return fo1{}(i); }"); 9072 verifyFormat("int foo(int i) { return fo1{}(i); }"); 9073 verifyFormat("auto i = decltype(x){};"); 9074 verifyFormat("auto i = typeof(x){};"); 9075 verifyFormat("auto i = _Atomic(x){};"); 9076 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 9077 verifyFormat("Node n{1, Node{1000}, //\n" 9078 " 2};"); 9079 verifyFormat("Aaaa aaaaaaa{\n" 9080 " {\n" 9081 " aaaa,\n" 9082 " },\n" 9083 "};"); 9084 verifyFormat("class C : public D {\n" 9085 " SomeClass SC{2};\n" 9086 "};"); 9087 verifyFormat("class C : public A {\n" 9088 " class D : public B {\n" 9089 " void f() { int i{2}; }\n" 9090 " };\n" 9091 "};"); 9092 verifyFormat("#define A {a, a},"); 9093 9094 // Avoid breaking between equal sign and opening brace 9095 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 9096 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 9097 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 9098 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 9099 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 9100 " {\"ccccccccccccccccccccc\", 2}};", 9101 AvoidBreakingFirstArgument); 9102 9103 // Binpacking only if there is no trailing comma 9104 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 9105 " cccccccccc, dddddddddd};", 9106 getLLVMStyleWithColumns(50)); 9107 verifyFormat("const Aaaaaa aaaaa = {\n" 9108 " aaaaaaaaaaa,\n" 9109 " bbbbbbbbbbb,\n" 9110 " ccccccccccc,\n" 9111 " ddddddddddd,\n" 9112 "};", 9113 getLLVMStyleWithColumns(50)); 9114 9115 // Cases where distinguising braced lists and blocks is hard. 9116 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 9117 verifyFormat("void f() {\n" 9118 " return; // comment\n" 9119 "}\n" 9120 "SomeType t;"); 9121 verifyFormat("void f() {\n" 9122 " if (a) {\n" 9123 " f();\n" 9124 " }\n" 9125 "}\n" 9126 "SomeType t;"); 9127 9128 // In combination with BinPackArguments = false. 9129 FormatStyle NoBinPacking = getLLVMStyle(); 9130 NoBinPacking.BinPackArguments = false; 9131 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 9132 " bbbbb,\n" 9133 " ccccc,\n" 9134 " ddddd,\n" 9135 " eeeee,\n" 9136 " ffffff,\n" 9137 " ggggg,\n" 9138 " hhhhhh,\n" 9139 " iiiiii,\n" 9140 " jjjjjj,\n" 9141 " kkkkkk};", 9142 NoBinPacking); 9143 verifyFormat("const Aaaaaa aaaaa = {\n" 9144 " aaaaa,\n" 9145 " bbbbb,\n" 9146 " ccccc,\n" 9147 " ddddd,\n" 9148 " eeeee,\n" 9149 " ffffff,\n" 9150 " ggggg,\n" 9151 " hhhhhh,\n" 9152 " iiiiii,\n" 9153 " jjjjjj,\n" 9154 " kkkkkk,\n" 9155 "};", 9156 NoBinPacking); 9157 verifyFormat( 9158 "const Aaaaaa aaaaa = {\n" 9159 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 9160 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 9161 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 9162 "};", 9163 NoBinPacking); 9164 9165 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9166 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 9167 " CDDDP83848_BMCR_REGISTER,\n" 9168 " CDDDP83848_BMSR_REGISTER,\n" 9169 " CDDDP83848_RBR_REGISTER};", 9170 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 9171 " CDDDP83848_BMSR_REGISTER,\n" 9172 " CDDDP83848_RBR_REGISTER};", 9173 NoBinPacking)); 9174 9175 // FIXME: The alignment of these trailing comments might be bad. Then again, 9176 // this might be utterly useless in real code. 9177 verifyFormat("Constructor::Constructor()\n" 9178 " : some_value{ //\n" 9179 " aaaaaaa, //\n" 9180 " bbbbbbb} {}"); 9181 9182 // In braced lists, the first comment is always assumed to belong to the 9183 // first element. Thus, it can be moved to the next or previous line as 9184 // appropriate. 9185 EXPECT_EQ("function({// First element:\n" 9186 " 1,\n" 9187 " // Second element:\n" 9188 " 2});", 9189 format("function({\n" 9190 " // First element:\n" 9191 " 1,\n" 9192 " // Second element:\n" 9193 " 2});")); 9194 EXPECT_EQ("std::vector<int> MyNumbers{\n" 9195 " // First element:\n" 9196 " 1,\n" 9197 " // Second element:\n" 9198 " 2};", 9199 format("std::vector<int> MyNumbers{// First element:\n" 9200 " 1,\n" 9201 " // Second element:\n" 9202 " 2};", 9203 getLLVMStyleWithColumns(30))); 9204 // A trailing comma should still lead to an enforced line break and no 9205 // binpacking. 9206 EXPECT_EQ("vector<int> SomeVector = {\n" 9207 " // aaa\n" 9208 " 1,\n" 9209 " 2,\n" 9210 "};", 9211 format("vector<int> SomeVector = { // aaa\n" 9212 " 1, 2, };")); 9213 9214 // C++11 brace initializer list l-braces should not be treated any differently 9215 // when breaking before lambda bodies is enabled 9216 FormatStyle BreakBeforeLambdaBody = getLLVMStyle(); 9217 BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 9218 BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 9219 BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true; 9220 verifyFormat( 9221 "std::runtime_error{\n" 9222 " \"Long string which will force a break onto the next line...\"};", 9223 BreakBeforeLambdaBody); 9224 9225 FormatStyle ExtraSpaces = getLLVMStyle(); 9226 ExtraSpaces.Cpp11BracedListStyle = false; 9227 ExtraSpaces.ColumnLimit = 75; 9228 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 9229 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 9230 verifyFormat("f({ 1, 2 });", ExtraSpaces); 9231 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 9232 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 9233 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 9234 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 9235 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 9236 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 9237 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 9238 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 9239 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 9240 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 9241 verifyFormat("class Class {\n" 9242 " T member = { arg1, arg2 };\n" 9243 "};", 9244 ExtraSpaces); 9245 verifyFormat( 9246 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9247 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 9248 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 9249 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 9250 ExtraSpaces); 9251 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 9252 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 9253 ExtraSpaces); 9254 verifyFormat( 9255 "someFunction(OtherParam,\n" 9256 " BracedList{ // comment 1 (Forcing interesting break)\n" 9257 " param1, param2,\n" 9258 " // comment 2\n" 9259 " param3, param4 });", 9260 ExtraSpaces); 9261 verifyFormat( 9262 "std::this_thread::sleep_for(\n" 9263 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 9264 ExtraSpaces); 9265 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 9266 " aaaaaaa,\n" 9267 " aaaaaaaaaa,\n" 9268 " aaaaa,\n" 9269 " aaaaaaaaaaaaaaa,\n" 9270 " aaa,\n" 9271 " aaaaaaaaaa,\n" 9272 " a,\n" 9273 " aaaaaaaaaaaaaaaaaaaaa,\n" 9274 " aaaaaaaaaaaa,\n" 9275 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 9276 " aaaaaaa,\n" 9277 " a};"); 9278 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 9279 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 9280 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 9281 9282 // Avoid breaking between initializer/equal sign and opening brace 9283 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 9284 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 9285 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 9286 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 9287 " { \"ccccccccccccccccccccc\", 2 }\n" 9288 "};", 9289 ExtraSpaces); 9290 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 9291 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 9292 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 9293 " { \"ccccccccccccccccccccc\", 2 }\n" 9294 "};", 9295 ExtraSpaces); 9296 9297 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 9298 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 9299 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 9300 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 9301 9302 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 9303 SpaceBetweenBraces.SpacesInAngles = true; 9304 SpaceBetweenBraces.SpacesInParentheses = true; 9305 SpaceBetweenBraces.SpacesInSquareBrackets = true; 9306 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 9307 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 9308 verifyFormat("vector< int > x{ // comment 1\n" 9309 " 1, 2, 3, 4 };", 9310 SpaceBetweenBraces); 9311 SpaceBetweenBraces.ColumnLimit = 20; 9312 EXPECT_EQ("vector< int > x{\n" 9313 " 1, 2, 3, 4 };", 9314 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 9315 SpaceBetweenBraces.ColumnLimit = 24; 9316 EXPECT_EQ("vector< int > x{ 1, 2,\n" 9317 " 3, 4 };", 9318 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 9319 EXPECT_EQ("vector< int > x{\n" 9320 " 1,\n" 9321 " 2,\n" 9322 " 3,\n" 9323 " 4,\n" 9324 "};", 9325 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 9326 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 9327 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 9328 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 9329 } 9330 9331 TEST_F(FormatTest, FormatSpacesInAngles) { 9332 FormatStyle SpaceInAngles = getLLVMStyle(); 9333 SpaceInAngles.SpacesInAngles = true; 9334 verifyFormat("vector< ::std::string > x1;", SpaceInAngles); 9335 verifyFormat("Foo< int, Bar > x2;", SpaceInAngles); 9336 verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles); 9337 9338 SpaceInAngles.SpacesInAngles = false; 9339 verifyFormat("vector<::std::string> x4;", SpaceInAngles); 9340 verifyFormat("vector<int> x5;", SpaceInAngles); 9341 verifyFormat("Foo<int, Bar> x6;", SpaceInAngles); 9342 verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles); 9343 } 9344 9345 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 9346 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9347 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9348 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9349 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9350 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9351 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 9352 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 9353 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9354 " 1, 22, 333, 4444, 55555, //\n" 9355 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9356 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 9357 verifyFormat( 9358 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9359 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9360 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 9361 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9362 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9363 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9364 " 7777777};"); 9365 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9366 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9367 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9368 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9369 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9370 " // Separating comment.\n" 9371 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9372 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9373 " // Leading comment\n" 9374 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9375 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9376 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9377 " 1, 1, 1, 1};", 9378 getLLVMStyleWithColumns(39)); 9379 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9380 " 1, 1, 1, 1};", 9381 getLLVMStyleWithColumns(38)); 9382 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 9383 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 9384 getLLVMStyleWithColumns(43)); 9385 verifyFormat( 9386 "static unsigned SomeValues[10][3] = {\n" 9387 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 9388 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 9389 verifyFormat("static auto fields = new vector<string>{\n" 9390 " \"aaaaaaaaaaaaa\",\n" 9391 " \"aaaaaaaaaaaaa\",\n" 9392 " \"aaaaaaaaaaaa\",\n" 9393 " \"aaaaaaaaaaaaaa\",\n" 9394 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9395 " \"aaaaaaaaaaaa\",\n" 9396 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9397 "};"); 9398 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 9399 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 9400 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 9401 " 3, cccccccccccccccccccccc};", 9402 getLLVMStyleWithColumns(60)); 9403 9404 // Trailing commas. 9405 verifyFormat("vector<int> x = {\n" 9406 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 9407 "};", 9408 getLLVMStyleWithColumns(39)); 9409 verifyFormat("vector<int> x = {\n" 9410 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 9411 "};", 9412 getLLVMStyleWithColumns(39)); 9413 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9414 " 1, 1, 1, 1,\n" 9415 " /**/ /**/};", 9416 getLLVMStyleWithColumns(39)); 9417 9418 // Trailing comment in the first line. 9419 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 9420 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 9421 " 111111111, 222222222, 3333333333, 444444444, //\n" 9422 " 11111111, 22222222, 333333333, 44444444};"); 9423 // Trailing comment in the last line. 9424 verifyFormat("int aaaaa[] = {\n" 9425 " 1, 2, 3, // comment\n" 9426 " 4, 5, 6 // comment\n" 9427 "};"); 9428 9429 // With nested lists, we should either format one item per line or all nested 9430 // lists one on line. 9431 // FIXME: For some nested lists, we can do better. 9432 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 9433 " {aaaaaaaaaaaaaaaaaaa},\n" 9434 " {aaaaaaaaaaaaaaaaaaaaa},\n" 9435 " {aaaaaaaaaaaaaaaaa}};", 9436 getLLVMStyleWithColumns(60)); 9437 verifyFormat( 9438 "SomeStruct my_struct_array = {\n" 9439 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 9440 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 9441 " {aaa, aaa},\n" 9442 " {aaa, aaa},\n" 9443 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 9444 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 9445 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 9446 9447 // No column layout should be used here. 9448 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 9449 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 9450 9451 verifyNoCrash("a<,"); 9452 9453 // No braced initializer here. 9454 verifyFormat("void f() {\n" 9455 " struct Dummy {};\n" 9456 " f(v);\n" 9457 "}"); 9458 9459 // Long lists should be formatted in columns even if they are nested. 9460 verifyFormat( 9461 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9462 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9463 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9464 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9465 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9466 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 9467 9468 // Allow "single-column" layout even if that violates the column limit. There 9469 // isn't going to be a better way. 9470 verifyFormat("std::vector<int> a = {\n" 9471 " aaaaaaaa,\n" 9472 " aaaaaaaa,\n" 9473 " aaaaaaaa,\n" 9474 " aaaaaaaa,\n" 9475 " aaaaaaaaaa,\n" 9476 " aaaaaaaa,\n" 9477 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 9478 getLLVMStyleWithColumns(30)); 9479 verifyFormat("vector<int> aaaa = {\n" 9480 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9481 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9482 " aaaaaa.aaaaaaa,\n" 9483 " aaaaaa.aaaaaaa,\n" 9484 " aaaaaa.aaaaaaa,\n" 9485 " aaaaaa.aaaaaaa,\n" 9486 "};"); 9487 9488 // Don't create hanging lists. 9489 verifyFormat("someFunction(Param, {List1, List2,\n" 9490 " List3});", 9491 getLLVMStyleWithColumns(35)); 9492 verifyFormat("someFunction(Param, Param,\n" 9493 " {List1, List2,\n" 9494 " List3});", 9495 getLLVMStyleWithColumns(35)); 9496 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 9497 " aaaaaaaaaaaaaaaaaaaaaaa);"); 9498 } 9499 9500 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 9501 FormatStyle DoNotMerge = getLLVMStyle(); 9502 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9503 9504 verifyFormat("void f() { return 42; }"); 9505 verifyFormat("void f() {\n" 9506 " return 42;\n" 9507 "}", 9508 DoNotMerge); 9509 verifyFormat("void f() {\n" 9510 " // Comment\n" 9511 "}"); 9512 verifyFormat("{\n" 9513 "#error {\n" 9514 " int a;\n" 9515 "}"); 9516 verifyFormat("{\n" 9517 " int a;\n" 9518 "#error {\n" 9519 "}"); 9520 verifyFormat("void f() {} // comment"); 9521 verifyFormat("void f() { int a; } // comment"); 9522 verifyFormat("void f() {\n" 9523 "} // comment", 9524 DoNotMerge); 9525 verifyFormat("void f() {\n" 9526 " int a;\n" 9527 "} // comment", 9528 DoNotMerge); 9529 verifyFormat("void f() {\n" 9530 "} // comment", 9531 getLLVMStyleWithColumns(15)); 9532 9533 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 9534 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 9535 9536 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 9537 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 9538 verifyFormat("class C {\n" 9539 " C()\n" 9540 " : iiiiiiii(nullptr),\n" 9541 " kkkkkkk(nullptr),\n" 9542 " mmmmmmm(nullptr),\n" 9543 " nnnnnnn(nullptr) {}\n" 9544 "};", 9545 getGoogleStyle()); 9546 9547 FormatStyle NoColumnLimit = getLLVMStyle(); 9548 NoColumnLimit.ColumnLimit = 0; 9549 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 9550 EXPECT_EQ("class C {\n" 9551 " A() : b(0) {}\n" 9552 "};", 9553 format("class C{A():b(0){}};", NoColumnLimit)); 9554 EXPECT_EQ("A()\n" 9555 " : b(0) {\n" 9556 "}", 9557 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 9558 9559 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 9560 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 9561 FormatStyle::SFS_None; 9562 EXPECT_EQ("A()\n" 9563 " : b(0) {\n" 9564 "}", 9565 format("A():b(0){}", DoNotMergeNoColumnLimit)); 9566 EXPECT_EQ("A()\n" 9567 " : b(0) {\n" 9568 "}", 9569 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 9570 9571 verifyFormat("#define A \\\n" 9572 " void f() { \\\n" 9573 " int i; \\\n" 9574 " }", 9575 getLLVMStyleWithColumns(20)); 9576 verifyFormat("#define A \\\n" 9577 " void f() { int i; }", 9578 getLLVMStyleWithColumns(21)); 9579 verifyFormat("#define A \\\n" 9580 " void f() { \\\n" 9581 " int i; \\\n" 9582 " } \\\n" 9583 " int j;", 9584 getLLVMStyleWithColumns(22)); 9585 verifyFormat("#define A \\\n" 9586 " void f() { int i; } \\\n" 9587 " int j;", 9588 getLLVMStyleWithColumns(23)); 9589 } 9590 9591 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 9592 FormatStyle MergeEmptyOnly = getLLVMStyle(); 9593 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9594 verifyFormat("class C {\n" 9595 " int f() {}\n" 9596 "};", 9597 MergeEmptyOnly); 9598 verifyFormat("class C {\n" 9599 " int f() {\n" 9600 " return 42;\n" 9601 " }\n" 9602 "};", 9603 MergeEmptyOnly); 9604 verifyFormat("int f() {}", MergeEmptyOnly); 9605 verifyFormat("int f() {\n" 9606 " return 42;\n" 9607 "}", 9608 MergeEmptyOnly); 9609 9610 // Also verify behavior when BraceWrapping.AfterFunction = true 9611 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9612 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 9613 verifyFormat("int f() {}", MergeEmptyOnly); 9614 verifyFormat("class C {\n" 9615 " int f() {}\n" 9616 "};", 9617 MergeEmptyOnly); 9618 } 9619 9620 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 9621 FormatStyle MergeInlineOnly = getLLVMStyle(); 9622 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9623 verifyFormat("class C {\n" 9624 " int f() { return 42; }\n" 9625 "};", 9626 MergeInlineOnly); 9627 verifyFormat("int f() {\n" 9628 " return 42;\n" 9629 "}", 9630 MergeInlineOnly); 9631 9632 // SFS_Inline implies SFS_Empty 9633 verifyFormat("class C {\n" 9634 " int f() {}\n" 9635 "};", 9636 MergeInlineOnly); 9637 verifyFormat("int f() {}", MergeInlineOnly); 9638 9639 // Also verify behavior when BraceWrapping.AfterFunction = true 9640 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9641 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9642 verifyFormat("class C {\n" 9643 " int f() { return 42; }\n" 9644 "};", 9645 MergeInlineOnly); 9646 verifyFormat("int f()\n" 9647 "{\n" 9648 " return 42;\n" 9649 "}", 9650 MergeInlineOnly); 9651 9652 // SFS_Inline implies SFS_Empty 9653 verifyFormat("int f() {}", MergeInlineOnly); 9654 verifyFormat("class C {\n" 9655 " int f() {}\n" 9656 "};", 9657 MergeInlineOnly); 9658 } 9659 9660 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 9661 FormatStyle MergeInlineOnly = getLLVMStyle(); 9662 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 9663 FormatStyle::SFS_InlineOnly; 9664 verifyFormat("class C {\n" 9665 " int f() { return 42; }\n" 9666 "};", 9667 MergeInlineOnly); 9668 verifyFormat("int f() {\n" 9669 " return 42;\n" 9670 "}", 9671 MergeInlineOnly); 9672 9673 // SFS_InlineOnly does not imply SFS_Empty 9674 verifyFormat("class C {\n" 9675 " int f() {}\n" 9676 "};", 9677 MergeInlineOnly); 9678 verifyFormat("int f() {\n" 9679 "}", 9680 MergeInlineOnly); 9681 9682 // Also verify behavior when BraceWrapping.AfterFunction = true 9683 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9684 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9685 verifyFormat("class C {\n" 9686 " int f() { return 42; }\n" 9687 "};", 9688 MergeInlineOnly); 9689 verifyFormat("int f()\n" 9690 "{\n" 9691 " return 42;\n" 9692 "}", 9693 MergeInlineOnly); 9694 9695 // SFS_InlineOnly does not imply SFS_Empty 9696 verifyFormat("int f()\n" 9697 "{\n" 9698 "}", 9699 MergeInlineOnly); 9700 verifyFormat("class C {\n" 9701 " int f() {}\n" 9702 "};", 9703 MergeInlineOnly); 9704 } 9705 9706 TEST_F(FormatTest, SplitEmptyFunction) { 9707 FormatStyle Style = getLLVMStyle(); 9708 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9709 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9710 Style.BraceWrapping.AfterFunction = true; 9711 Style.BraceWrapping.SplitEmptyFunction = false; 9712 Style.ColumnLimit = 40; 9713 9714 verifyFormat("int f()\n" 9715 "{}", 9716 Style); 9717 verifyFormat("int f()\n" 9718 "{\n" 9719 " return 42;\n" 9720 "}", 9721 Style); 9722 verifyFormat("int f()\n" 9723 "{\n" 9724 " // some comment\n" 9725 "}", 9726 Style); 9727 9728 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9729 verifyFormat("int f() {}", Style); 9730 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9731 "{}", 9732 Style); 9733 verifyFormat("int f()\n" 9734 "{\n" 9735 " return 0;\n" 9736 "}", 9737 Style); 9738 9739 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9740 verifyFormat("class Foo {\n" 9741 " int f() {}\n" 9742 "};\n", 9743 Style); 9744 verifyFormat("class Foo {\n" 9745 " int f() { return 0; }\n" 9746 "};\n", 9747 Style); 9748 verifyFormat("class Foo {\n" 9749 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9750 " {}\n" 9751 "};\n", 9752 Style); 9753 verifyFormat("class Foo {\n" 9754 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9755 " {\n" 9756 " return 0;\n" 9757 " }\n" 9758 "};\n", 9759 Style); 9760 9761 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9762 verifyFormat("int f() {}", Style); 9763 verifyFormat("int f() { return 0; }", Style); 9764 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9765 "{}", 9766 Style); 9767 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9768 "{\n" 9769 " return 0;\n" 9770 "}", 9771 Style); 9772 } 9773 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 9774 FormatStyle Style = getLLVMStyle(); 9775 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9776 verifyFormat("#ifdef A\n" 9777 "int f() {}\n" 9778 "#else\n" 9779 "int g() {}\n" 9780 "#endif", 9781 Style); 9782 } 9783 9784 TEST_F(FormatTest, SplitEmptyClass) { 9785 FormatStyle Style = getLLVMStyle(); 9786 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9787 Style.BraceWrapping.AfterClass = true; 9788 Style.BraceWrapping.SplitEmptyRecord = false; 9789 9790 verifyFormat("class Foo\n" 9791 "{};", 9792 Style); 9793 verifyFormat("/* something */ class Foo\n" 9794 "{};", 9795 Style); 9796 verifyFormat("template <typename X> class Foo\n" 9797 "{};", 9798 Style); 9799 verifyFormat("class Foo\n" 9800 "{\n" 9801 " Foo();\n" 9802 "};", 9803 Style); 9804 verifyFormat("typedef class Foo\n" 9805 "{\n" 9806 "} Foo_t;", 9807 Style); 9808 } 9809 9810 TEST_F(FormatTest, SplitEmptyStruct) { 9811 FormatStyle Style = getLLVMStyle(); 9812 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9813 Style.BraceWrapping.AfterStruct = true; 9814 Style.BraceWrapping.SplitEmptyRecord = false; 9815 9816 verifyFormat("struct Foo\n" 9817 "{};", 9818 Style); 9819 verifyFormat("/* something */ struct Foo\n" 9820 "{};", 9821 Style); 9822 verifyFormat("template <typename X> struct Foo\n" 9823 "{};", 9824 Style); 9825 verifyFormat("struct Foo\n" 9826 "{\n" 9827 " Foo();\n" 9828 "};", 9829 Style); 9830 verifyFormat("typedef struct Foo\n" 9831 "{\n" 9832 "} Foo_t;", 9833 Style); 9834 // typedef struct Bar {} Bar_t; 9835 } 9836 9837 TEST_F(FormatTest, SplitEmptyUnion) { 9838 FormatStyle Style = getLLVMStyle(); 9839 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9840 Style.BraceWrapping.AfterUnion = true; 9841 Style.BraceWrapping.SplitEmptyRecord = false; 9842 9843 verifyFormat("union Foo\n" 9844 "{};", 9845 Style); 9846 verifyFormat("/* something */ union Foo\n" 9847 "{};", 9848 Style); 9849 verifyFormat("union Foo\n" 9850 "{\n" 9851 " A,\n" 9852 "};", 9853 Style); 9854 verifyFormat("typedef union Foo\n" 9855 "{\n" 9856 "} Foo_t;", 9857 Style); 9858 } 9859 9860 TEST_F(FormatTest, SplitEmptyNamespace) { 9861 FormatStyle Style = getLLVMStyle(); 9862 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9863 Style.BraceWrapping.AfterNamespace = true; 9864 Style.BraceWrapping.SplitEmptyNamespace = false; 9865 9866 verifyFormat("namespace Foo\n" 9867 "{};", 9868 Style); 9869 verifyFormat("/* something */ namespace Foo\n" 9870 "{};", 9871 Style); 9872 verifyFormat("inline namespace Foo\n" 9873 "{};", 9874 Style); 9875 verifyFormat("/* something */ inline namespace Foo\n" 9876 "{};", 9877 Style); 9878 verifyFormat("export namespace Foo\n" 9879 "{};", 9880 Style); 9881 verifyFormat("namespace Foo\n" 9882 "{\n" 9883 "void Bar();\n" 9884 "};", 9885 Style); 9886 } 9887 9888 TEST_F(FormatTest, NeverMergeShortRecords) { 9889 FormatStyle Style = getLLVMStyle(); 9890 9891 verifyFormat("class Foo {\n" 9892 " Foo();\n" 9893 "};", 9894 Style); 9895 verifyFormat("typedef class Foo {\n" 9896 " Foo();\n" 9897 "} Foo_t;", 9898 Style); 9899 verifyFormat("struct Foo {\n" 9900 " Foo();\n" 9901 "};", 9902 Style); 9903 verifyFormat("typedef struct Foo {\n" 9904 " Foo();\n" 9905 "} Foo_t;", 9906 Style); 9907 verifyFormat("union Foo {\n" 9908 " A,\n" 9909 "};", 9910 Style); 9911 verifyFormat("typedef union Foo {\n" 9912 " A,\n" 9913 "} Foo_t;", 9914 Style); 9915 verifyFormat("namespace Foo {\n" 9916 "void Bar();\n" 9917 "};", 9918 Style); 9919 9920 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9921 Style.BraceWrapping.AfterClass = true; 9922 Style.BraceWrapping.AfterStruct = true; 9923 Style.BraceWrapping.AfterUnion = true; 9924 Style.BraceWrapping.AfterNamespace = true; 9925 verifyFormat("class Foo\n" 9926 "{\n" 9927 " Foo();\n" 9928 "};", 9929 Style); 9930 verifyFormat("typedef class Foo\n" 9931 "{\n" 9932 " Foo();\n" 9933 "} Foo_t;", 9934 Style); 9935 verifyFormat("struct Foo\n" 9936 "{\n" 9937 " Foo();\n" 9938 "};", 9939 Style); 9940 verifyFormat("typedef struct Foo\n" 9941 "{\n" 9942 " Foo();\n" 9943 "} Foo_t;", 9944 Style); 9945 verifyFormat("union Foo\n" 9946 "{\n" 9947 " A,\n" 9948 "};", 9949 Style); 9950 verifyFormat("typedef union Foo\n" 9951 "{\n" 9952 " A,\n" 9953 "} Foo_t;", 9954 Style); 9955 verifyFormat("namespace Foo\n" 9956 "{\n" 9957 "void Bar();\n" 9958 "};", 9959 Style); 9960 } 9961 9962 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 9963 // Elaborate type variable declarations. 9964 verifyFormat("struct foo a = {bar};\nint n;"); 9965 verifyFormat("class foo a = {bar};\nint n;"); 9966 verifyFormat("union foo a = {bar};\nint n;"); 9967 9968 // Elaborate types inside function definitions. 9969 verifyFormat("struct foo f() {}\nint n;"); 9970 verifyFormat("class foo f() {}\nint n;"); 9971 verifyFormat("union foo f() {}\nint n;"); 9972 9973 // Templates. 9974 verifyFormat("template <class X> void f() {}\nint n;"); 9975 verifyFormat("template <struct X> void f() {}\nint n;"); 9976 verifyFormat("template <union X> void f() {}\nint n;"); 9977 9978 // Actual definitions... 9979 verifyFormat("struct {\n} n;"); 9980 verifyFormat( 9981 "template <template <class T, class Y>, class Z> class X {\n} n;"); 9982 verifyFormat("union Z {\n int n;\n} x;"); 9983 verifyFormat("class MACRO Z {\n} n;"); 9984 verifyFormat("class MACRO(X) Z {\n} n;"); 9985 verifyFormat("class __attribute__(X) Z {\n} n;"); 9986 verifyFormat("class __declspec(X) Z {\n} n;"); 9987 verifyFormat("class A##B##C {\n} n;"); 9988 verifyFormat("class alignas(16) Z {\n} n;"); 9989 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 9990 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 9991 9992 // Redefinition from nested context: 9993 verifyFormat("class A::B::C {\n} n;"); 9994 9995 // Template definitions. 9996 verifyFormat( 9997 "template <typename F>\n" 9998 "Matcher(const Matcher<F> &Other,\n" 9999 " typename enable_if_c<is_base_of<F, T>::value &&\n" 10000 " !is_same<F, T>::value>::type * = 0)\n" 10001 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 10002 10003 // FIXME: This is still incorrectly handled at the formatter side. 10004 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 10005 verifyFormat("int i = SomeFunction(a<b, a> b);"); 10006 10007 // FIXME: 10008 // This now gets parsed incorrectly as class definition. 10009 // verifyFormat("class A<int> f() {\n}\nint n;"); 10010 10011 // Elaborate types where incorrectly parsing the structural element would 10012 // break the indent. 10013 verifyFormat("if (true)\n" 10014 " class X x;\n" 10015 "else\n" 10016 " f();\n"); 10017 10018 // This is simply incomplete. Formatting is not important, but must not crash. 10019 verifyFormat("class A:"); 10020 } 10021 10022 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 10023 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 10024 format("#error Leave all white!!!!! space* alone!\n")); 10025 EXPECT_EQ( 10026 "#warning Leave all white!!!!! space* alone!\n", 10027 format("#warning Leave all white!!!!! space* alone!\n")); 10028 EXPECT_EQ("#error 1", format(" # error 1")); 10029 EXPECT_EQ("#warning 1", format(" # warning 1")); 10030 } 10031 10032 TEST_F(FormatTest, FormatHashIfExpressions) { 10033 verifyFormat("#if AAAA && BBBB"); 10034 verifyFormat("#if (AAAA && BBBB)"); 10035 verifyFormat("#elif (AAAA && BBBB)"); 10036 // FIXME: Come up with a better indentation for #elif. 10037 verifyFormat( 10038 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 10039 " defined(BBBBBBBB)\n" 10040 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 10041 " defined(BBBBBBBB)\n" 10042 "#endif", 10043 getLLVMStyleWithColumns(65)); 10044 } 10045 10046 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 10047 FormatStyle AllowsMergedIf = getGoogleStyle(); 10048 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 10049 FormatStyle::SIS_WithoutElse; 10050 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 10051 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 10052 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 10053 EXPECT_EQ("if (true) return 42;", 10054 format("if (true)\nreturn 42;", AllowsMergedIf)); 10055 FormatStyle ShortMergedIf = AllowsMergedIf; 10056 ShortMergedIf.ColumnLimit = 25; 10057 verifyFormat("#define A \\\n" 10058 " if (true) return 42;", 10059 ShortMergedIf); 10060 verifyFormat("#define A \\\n" 10061 " f(); \\\n" 10062 " if (true)\n" 10063 "#define B", 10064 ShortMergedIf); 10065 verifyFormat("#define A \\\n" 10066 " f(); \\\n" 10067 " if (true)\n" 10068 "g();", 10069 ShortMergedIf); 10070 verifyFormat("{\n" 10071 "#ifdef A\n" 10072 " // Comment\n" 10073 " if (true) continue;\n" 10074 "#endif\n" 10075 " // Comment\n" 10076 " if (true) continue;\n" 10077 "}", 10078 ShortMergedIf); 10079 ShortMergedIf.ColumnLimit = 33; 10080 verifyFormat("#define A \\\n" 10081 " if constexpr (true) return 42;", 10082 ShortMergedIf); 10083 verifyFormat("#define A \\\n" 10084 " if CONSTEXPR (true) return 42;", 10085 ShortMergedIf); 10086 ShortMergedIf.ColumnLimit = 29; 10087 verifyFormat("#define A \\\n" 10088 " if (aaaaaaaaaa) return 1; \\\n" 10089 " return 2;", 10090 ShortMergedIf); 10091 ShortMergedIf.ColumnLimit = 28; 10092 verifyFormat("#define A \\\n" 10093 " if (aaaaaaaaaa) \\\n" 10094 " return 1; \\\n" 10095 " return 2;", 10096 ShortMergedIf); 10097 verifyFormat("#define A \\\n" 10098 " if constexpr (aaaaaaa) \\\n" 10099 " return 1; \\\n" 10100 " return 2;", 10101 ShortMergedIf); 10102 verifyFormat("#define A \\\n" 10103 " if CONSTEXPR (aaaaaaa) \\\n" 10104 " return 1; \\\n" 10105 " return 2;", 10106 ShortMergedIf); 10107 } 10108 10109 TEST_F(FormatTest, FormatStarDependingOnContext) { 10110 verifyFormat("void f(int *a);"); 10111 verifyFormat("void f() { f(fint * b); }"); 10112 verifyFormat("class A {\n void f(int *a);\n};"); 10113 verifyFormat("class A {\n int *a;\n};"); 10114 verifyFormat("namespace a {\n" 10115 "namespace b {\n" 10116 "class A {\n" 10117 " void f() {}\n" 10118 " int *a;\n" 10119 "};\n" 10120 "} // namespace b\n" 10121 "} // namespace a"); 10122 } 10123 10124 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 10125 verifyFormat("while"); 10126 verifyFormat("operator"); 10127 } 10128 10129 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 10130 // This code would be painfully slow to format if we didn't skip it. 10131 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 10132 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10133 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10134 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10135 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 10136 "A(1, 1)\n" 10137 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 10138 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10139 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10140 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10141 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10142 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10143 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10144 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10145 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 10146 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 10147 // Deeply nested part is untouched, rest is formatted. 10148 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 10149 format(std::string("int i;\n") + Code + "int j;\n", 10150 getLLVMStyle(), SC_ExpectIncomplete)); 10151 } 10152 10153 //===----------------------------------------------------------------------===// 10154 // Objective-C tests. 10155 //===----------------------------------------------------------------------===// 10156 10157 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 10158 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 10159 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 10160 format("-(NSUInteger)indexOfObject:(id)anObject;")); 10161 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 10162 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 10163 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 10164 format("-(NSInteger)Method3:(id)anObject;")); 10165 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 10166 format("-(NSInteger)Method4:(id)anObject;")); 10167 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 10168 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 10169 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 10170 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 10171 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 10172 "forAllCells:(BOOL)flag;", 10173 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 10174 "forAllCells:(BOOL)flag;")); 10175 10176 // Very long objectiveC method declaration. 10177 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 10178 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 10179 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 10180 " inRange:(NSRange)range\n" 10181 " outRange:(NSRange)out_range\n" 10182 " outRange1:(NSRange)out_range1\n" 10183 " outRange2:(NSRange)out_range2\n" 10184 " outRange3:(NSRange)out_range3\n" 10185 " outRange4:(NSRange)out_range4\n" 10186 " outRange5:(NSRange)out_range5\n" 10187 " outRange6:(NSRange)out_range6\n" 10188 " outRange7:(NSRange)out_range7\n" 10189 " outRange8:(NSRange)out_range8\n" 10190 " outRange9:(NSRange)out_range9;"); 10191 10192 // When the function name has to be wrapped. 10193 FormatStyle Style = getLLVMStyle(); 10194 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 10195 // and always indents instead. 10196 Style.IndentWrappedFunctionNames = false; 10197 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 10198 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 10199 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 10200 "}", 10201 Style); 10202 Style.IndentWrappedFunctionNames = true; 10203 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 10204 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 10205 " anotherName:(NSString)dddddddddddddd {\n" 10206 "}", 10207 Style); 10208 10209 verifyFormat("- (int)sum:(vector<int>)numbers;"); 10210 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 10211 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 10212 // protocol lists (but not for template classes): 10213 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 10214 10215 verifyFormat("- (int (*)())foo:(int (*)())f;"); 10216 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 10217 10218 // If there's no return type (very rare in practice!), LLVM and Google style 10219 // agree. 10220 verifyFormat("- foo;"); 10221 verifyFormat("- foo:(int)f;"); 10222 verifyGoogleFormat("- foo:(int)foo;"); 10223 } 10224 10225 TEST_F(FormatTest, BreaksStringLiterals) { 10226 EXPECT_EQ("\"some text \"\n" 10227 "\"other\";", 10228 format("\"some text other\";", getLLVMStyleWithColumns(12))); 10229 EXPECT_EQ("\"some text \"\n" 10230 "\"other\";", 10231 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 10232 EXPECT_EQ( 10233 "#define A \\\n" 10234 " \"some \" \\\n" 10235 " \"text \" \\\n" 10236 " \"other\";", 10237 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 10238 EXPECT_EQ( 10239 "#define A \\\n" 10240 " \"so \" \\\n" 10241 " \"text \" \\\n" 10242 " \"other\";", 10243 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 10244 10245 EXPECT_EQ("\"some text\"", 10246 format("\"some text\"", getLLVMStyleWithColumns(1))); 10247 EXPECT_EQ("\"some text\"", 10248 format("\"some text\"", getLLVMStyleWithColumns(11))); 10249 EXPECT_EQ("\"some \"\n" 10250 "\"text\"", 10251 format("\"some text\"", getLLVMStyleWithColumns(10))); 10252 EXPECT_EQ("\"some \"\n" 10253 "\"text\"", 10254 format("\"some text\"", getLLVMStyleWithColumns(7))); 10255 EXPECT_EQ("\"some\"\n" 10256 "\" tex\"\n" 10257 "\"t\"", 10258 format("\"some text\"", getLLVMStyleWithColumns(6))); 10259 EXPECT_EQ("\"some\"\n" 10260 "\" tex\"\n" 10261 "\" and\"", 10262 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 10263 EXPECT_EQ("\"some\"\n" 10264 "\"/tex\"\n" 10265 "\"/and\"", 10266 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 10267 10268 EXPECT_EQ("variable =\n" 10269 " \"long string \"\n" 10270 " \"literal\";", 10271 format("variable = \"long string literal\";", 10272 getLLVMStyleWithColumns(20))); 10273 10274 EXPECT_EQ("variable = f(\n" 10275 " \"long string \"\n" 10276 " \"literal\",\n" 10277 " short,\n" 10278 " loooooooooooooooooooong);", 10279 format("variable = f(\"long string literal\", short, " 10280 "loooooooooooooooooooong);", 10281 getLLVMStyleWithColumns(20))); 10282 10283 EXPECT_EQ( 10284 "f(g(\"long string \"\n" 10285 " \"literal\"),\n" 10286 " b);", 10287 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 10288 EXPECT_EQ("f(g(\"long string \"\n" 10289 " \"literal\",\n" 10290 " a),\n" 10291 " b);", 10292 format("f(g(\"long string literal\", a), b);", 10293 getLLVMStyleWithColumns(20))); 10294 EXPECT_EQ( 10295 "f(\"one two\".split(\n" 10296 " variable));", 10297 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 10298 EXPECT_EQ("f(\"one two three four five six \"\n" 10299 " \"seven\".split(\n" 10300 " really_looooong_variable));", 10301 format("f(\"one two three four five six seven\"." 10302 "split(really_looooong_variable));", 10303 getLLVMStyleWithColumns(33))); 10304 10305 EXPECT_EQ("f(\"some \"\n" 10306 " \"text\",\n" 10307 " other);", 10308 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 10309 10310 // Only break as a last resort. 10311 verifyFormat( 10312 "aaaaaaaaaaaaaaaaaaaa(\n" 10313 " aaaaaaaaaaaaaaaaaaaa,\n" 10314 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 10315 10316 EXPECT_EQ("\"splitmea\"\n" 10317 "\"trandomp\"\n" 10318 "\"oint\"", 10319 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 10320 10321 EXPECT_EQ("\"split/\"\n" 10322 "\"pathat/\"\n" 10323 "\"slashes\"", 10324 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 10325 10326 EXPECT_EQ("\"split/\"\n" 10327 "\"pathat/\"\n" 10328 "\"slashes\"", 10329 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 10330 EXPECT_EQ("\"split at \"\n" 10331 "\"spaces/at/\"\n" 10332 "\"slashes.at.any$\"\n" 10333 "\"non-alphanumeric%\"\n" 10334 "\"1111111111characte\"\n" 10335 "\"rs\"", 10336 format("\"split at " 10337 "spaces/at/" 10338 "slashes.at." 10339 "any$non-" 10340 "alphanumeric%" 10341 "1111111111characte" 10342 "rs\"", 10343 getLLVMStyleWithColumns(20))); 10344 10345 // Verify that splitting the strings understands 10346 // Style::AlwaysBreakBeforeMultilineStrings. 10347 EXPECT_EQ("aaaaaaaaaaaa(\n" 10348 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 10349 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 10350 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 10351 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 10352 "aaaaaaaaaaaaaaaaaaaaaa\");", 10353 getGoogleStyle())); 10354 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10355 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 10356 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 10357 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 10358 "aaaaaaaaaaaaaaaaaaaaaa\";", 10359 getGoogleStyle())); 10360 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10361 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10362 format("llvm::outs() << " 10363 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 10364 "aaaaaaaaaaaaaaaaaaa\";")); 10365 EXPECT_EQ("ffff(\n" 10366 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10367 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10368 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 10369 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10370 getGoogleStyle())); 10371 10372 FormatStyle Style = getLLVMStyleWithColumns(12); 10373 Style.BreakStringLiterals = false; 10374 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 10375 10376 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 10377 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10378 EXPECT_EQ("#define A \\\n" 10379 " \"some \" \\\n" 10380 " \"text \" \\\n" 10381 " \"other\";", 10382 format("#define A \"some text other\";", AlignLeft)); 10383 } 10384 10385 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 10386 EXPECT_EQ("C a = \"some more \"\n" 10387 " \"text\";", 10388 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 10389 } 10390 10391 TEST_F(FormatTest, FullyRemoveEmptyLines) { 10392 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 10393 NoEmptyLines.MaxEmptyLinesToKeep = 0; 10394 EXPECT_EQ("int i = a(b());", 10395 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 10396 } 10397 10398 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 10399 EXPECT_EQ( 10400 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10401 "(\n" 10402 " \"x\t\");", 10403 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10404 "aaaaaaa(" 10405 "\"x\t\");")); 10406 } 10407 10408 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 10409 EXPECT_EQ( 10410 "u8\"utf8 string \"\n" 10411 "u8\"literal\";", 10412 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 10413 EXPECT_EQ( 10414 "u\"utf16 string \"\n" 10415 "u\"literal\";", 10416 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 10417 EXPECT_EQ( 10418 "U\"utf32 string \"\n" 10419 "U\"literal\";", 10420 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 10421 EXPECT_EQ("L\"wide string \"\n" 10422 "L\"literal\";", 10423 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 10424 EXPECT_EQ("@\"NSString \"\n" 10425 "@\"literal\";", 10426 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 10427 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 10428 10429 // This input makes clang-format try to split the incomplete unicode escape 10430 // sequence, which used to lead to a crasher. 10431 verifyNoCrash( 10432 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 10433 getLLVMStyleWithColumns(60)); 10434 } 10435 10436 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 10437 FormatStyle Style = getGoogleStyleWithColumns(15); 10438 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 10439 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 10440 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 10441 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 10442 EXPECT_EQ("u8R\"x(raw literal)x\";", 10443 format("u8R\"x(raw literal)x\";", Style)); 10444 } 10445 10446 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 10447 FormatStyle Style = getLLVMStyleWithColumns(20); 10448 EXPECT_EQ( 10449 "_T(\"aaaaaaaaaaaaaa\")\n" 10450 "_T(\"aaaaaaaaaaaaaa\")\n" 10451 "_T(\"aaaaaaaaaaaa\")", 10452 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 10453 EXPECT_EQ("f(x,\n" 10454 " _T(\"aaaaaaaaaaaa\")\n" 10455 " _T(\"aaa\"),\n" 10456 " z);", 10457 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 10458 10459 // FIXME: Handle embedded spaces in one iteration. 10460 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 10461 // "_T(\"aaaaaaaaaaaaa\")\n" 10462 // "_T(\"aaaaaaaaaaaaa\")\n" 10463 // "_T(\"a\")", 10464 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10465 // getLLVMStyleWithColumns(20))); 10466 EXPECT_EQ( 10467 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10468 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 10469 EXPECT_EQ("f(\n" 10470 "#if !TEST\n" 10471 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10472 "#endif\n" 10473 ");", 10474 format("f(\n" 10475 "#if !TEST\n" 10476 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10477 "#endif\n" 10478 ");")); 10479 EXPECT_EQ("f(\n" 10480 "\n" 10481 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 10482 format("f(\n" 10483 "\n" 10484 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 10485 } 10486 10487 TEST_F(FormatTest, BreaksStringLiteralOperands) { 10488 // In a function call with two operands, the second can be broken with no line 10489 // break before it. 10490 EXPECT_EQ( 10491 "func(a, \"long long \"\n" 10492 " \"long long\");", 10493 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 10494 // In a function call with three operands, the second must be broken with a 10495 // line break before it. 10496 EXPECT_EQ("func(a,\n" 10497 " \"long long long \"\n" 10498 " \"long\",\n" 10499 " c);", 10500 format("func(a, \"long long long long\", c);", 10501 getLLVMStyleWithColumns(24))); 10502 // In a function call with three operands, the third must be broken with a 10503 // line break before it. 10504 EXPECT_EQ("func(a, b,\n" 10505 " \"long long long \"\n" 10506 " \"long\");", 10507 format("func(a, b, \"long long long long\");", 10508 getLLVMStyleWithColumns(24))); 10509 // In a function call with three operands, both the second and the third must 10510 // be broken with a line break before them. 10511 EXPECT_EQ("func(a,\n" 10512 " \"long long long \"\n" 10513 " \"long\",\n" 10514 " \"long long long \"\n" 10515 " \"long\");", 10516 format("func(a, \"long long long long\", \"long long long long\");", 10517 getLLVMStyleWithColumns(24))); 10518 // In a chain of << with two operands, the second can be broken with no line 10519 // break before it. 10520 EXPECT_EQ("a << \"line line \"\n" 10521 " \"line\";", 10522 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 10523 // In a chain of << with three operands, the second can be broken with no line 10524 // break before it. 10525 EXPECT_EQ( 10526 "abcde << \"line \"\n" 10527 " \"line line\"\n" 10528 " << c;", 10529 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 10530 // In a chain of << with three operands, the third must be broken with a line 10531 // break before it. 10532 EXPECT_EQ( 10533 "a << b\n" 10534 " << \"line line \"\n" 10535 " \"line\";", 10536 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 10537 // In a chain of << with three operands, the second can be broken with no line 10538 // break before it and the third must be broken with a line break before it. 10539 EXPECT_EQ("abcd << \"line line \"\n" 10540 " \"line\"\n" 10541 " << \"line line \"\n" 10542 " \"line\";", 10543 format("abcd << \"line line line\" << \"line line line\";", 10544 getLLVMStyleWithColumns(20))); 10545 // In a chain of binary operators with two operands, the second can be broken 10546 // with no line break before it. 10547 EXPECT_EQ( 10548 "abcd + \"line line \"\n" 10549 " \"line line\";", 10550 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 10551 // In a chain of binary operators with three operands, the second must be 10552 // broken with a line break before it. 10553 EXPECT_EQ("abcd +\n" 10554 " \"line line \"\n" 10555 " \"line line\" +\n" 10556 " e;", 10557 format("abcd + \"line line line line\" + e;", 10558 getLLVMStyleWithColumns(20))); 10559 // In a function call with two operands, with AlignAfterOpenBracket enabled, 10560 // the first must be broken with a line break before it. 10561 FormatStyle Style = getLLVMStyleWithColumns(25); 10562 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 10563 EXPECT_EQ("someFunction(\n" 10564 " \"long long long \"\n" 10565 " \"long\",\n" 10566 " a);", 10567 format("someFunction(\"long long long long\", a);", Style)); 10568 } 10569 10570 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 10571 EXPECT_EQ( 10572 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10573 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10575 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 10578 } 10579 10580 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 10581 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 10582 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 10583 EXPECT_EQ("fffffffffff(g(R\"x(\n" 10584 "multiline raw string literal xxxxxxxxxxxxxx\n" 10585 ")x\",\n" 10586 " a),\n" 10587 " b);", 10588 format("fffffffffff(g(R\"x(\n" 10589 "multiline raw string literal xxxxxxxxxxxxxx\n" 10590 ")x\", a), b);", 10591 getGoogleStyleWithColumns(20))); 10592 EXPECT_EQ("fffffffffff(\n" 10593 " g(R\"x(qqq\n" 10594 "multiline raw string literal xxxxxxxxxxxxxx\n" 10595 ")x\",\n" 10596 " a),\n" 10597 " b);", 10598 format("fffffffffff(g(R\"x(qqq\n" 10599 "multiline raw string literal xxxxxxxxxxxxxx\n" 10600 ")x\", a), b);", 10601 getGoogleStyleWithColumns(20))); 10602 10603 EXPECT_EQ("fffffffffff(R\"x(\n" 10604 "multiline raw string literal xxxxxxxxxxxxxx\n" 10605 ")x\");", 10606 format("fffffffffff(R\"x(\n" 10607 "multiline raw string literal xxxxxxxxxxxxxx\n" 10608 ")x\");", 10609 getGoogleStyleWithColumns(20))); 10610 EXPECT_EQ("fffffffffff(R\"x(\n" 10611 "multiline raw string literal xxxxxxxxxxxxxx\n" 10612 ")x\" + bbbbbb);", 10613 format("fffffffffff(R\"x(\n" 10614 "multiline raw string literal xxxxxxxxxxxxxx\n" 10615 ")x\" + bbbbbb);", 10616 getGoogleStyleWithColumns(20))); 10617 EXPECT_EQ("fffffffffff(\n" 10618 " R\"x(\n" 10619 "multiline raw string literal xxxxxxxxxxxxxx\n" 10620 ")x\" +\n" 10621 " bbbbbb);", 10622 format("fffffffffff(\n" 10623 " R\"x(\n" 10624 "multiline raw string literal xxxxxxxxxxxxxx\n" 10625 ")x\" + bbbbbb);", 10626 getGoogleStyleWithColumns(20))); 10627 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 10628 format("fffffffffff(\n" 10629 " R\"(single line raw string)\" + bbbbbb);")); 10630 } 10631 10632 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 10633 verifyFormat("string a = \"unterminated;"); 10634 EXPECT_EQ("function(\"unterminated,\n" 10635 " OtherParameter);", 10636 format("function( \"unterminated,\n" 10637 " OtherParameter);")); 10638 } 10639 10640 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 10641 FormatStyle Style = getLLVMStyle(); 10642 Style.Standard = FormatStyle::LS_Cpp03; 10643 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 10644 format("#define x(_a) printf(\"foo\"_a);", Style)); 10645 } 10646 10647 TEST_F(FormatTest, CppLexVersion) { 10648 FormatStyle Style = getLLVMStyle(); 10649 // Formatting of x * y differs if x is a type. 10650 verifyFormat("void foo() { MACRO(a * b); }", Style); 10651 verifyFormat("void foo() { MACRO(int *b); }", Style); 10652 10653 // LLVM style uses latest lexer. 10654 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 10655 Style.Standard = FormatStyle::LS_Cpp17; 10656 // But in c++17, char8_t isn't a keyword. 10657 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 10658 } 10659 10660 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 10661 10662 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 10663 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 10664 " \"ddeeefff\");", 10665 format("someFunction(\"aaabbbcccdddeeefff\");", 10666 getLLVMStyleWithColumns(25))); 10667 EXPECT_EQ("someFunction1234567890(\n" 10668 " \"aaabbbcccdddeeefff\");", 10669 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10670 getLLVMStyleWithColumns(26))); 10671 EXPECT_EQ("someFunction1234567890(\n" 10672 " \"aaabbbcccdddeeeff\"\n" 10673 " \"f\");", 10674 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10675 getLLVMStyleWithColumns(25))); 10676 EXPECT_EQ("someFunction1234567890(\n" 10677 " \"aaabbbcccdddeeeff\"\n" 10678 " \"f\");", 10679 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10680 getLLVMStyleWithColumns(24))); 10681 EXPECT_EQ("someFunction(\n" 10682 " \"aaabbbcc ddde \"\n" 10683 " \"efff\");", 10684 format("someFunction(\"aaabbbcc ddde efff\");", 10685 getLLVMStyleWithColumns(25))); 10686 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 10687 " \"ddeeefff\");", 10688 format("someFunction(\"aaabbbccc ddeeefff\");", 10689 getLLVMStyleWithColumns(25))); 10690 EXPECT_EQ("someFunction1234567890(\n" 10691 " \"aaabb \"\n" 10692 " \"cccdddeeefff\");", 10693 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 10694 getLLVMStyleWithColumns(25))); 10695 EXPECT_EQ("#define A \\\n" 10696 " string s = \\\n" 10697 " \"123456789\" \\\n" 10698 " \"0\"; \\\n" 10699 " int i;", 10700 format("#define A string s = \"1234567890\"; int i;", 10701 getLLVMStyleWithColumns(20))); 10702 EXPECT_EQ("someFunction(\n" 10703 " \"aaabbbcc \"\n" 10704 " \"dddeeefff\");", 10705 format("someFunction(\"aaabbbcc dddeeefff\");", 10706 getLLVMStyleWithColumns(25))); 10707 } 10708 10709 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 10710 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 10711 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 10712 EXPECT_EQ("\"test\"\n" 10713 "\"\\n\"", 10714 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 10715 EXPECT_EQ("\"tes\\\\\"\n" 10716 "\"n\"", 10717 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 10718 EXPECT_EQ("\"\\\\\\\\\"\n" 10719 "\"\\n\"", 10720 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 10721 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 10722 EXPECT_EQ("\"\\uff01\"\n" 10723 "\"test\"", 10724 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 10725 EXPECT_EQ("\"\\Uff01ff02\"", 10726 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 10727 EXPECT_EQ("\"\\x000000000001\"\n" 10728 "\"next\"", 10729 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 10730 EXPECT_EQ("\"\\x000000000001next\"", 10731 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 10732 EXPECT_EQ("\"\\x000000000001\"", 10733 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 10734 EXPECT_EQ("\"test\"\n" 10735 "\"\\000000\"\n" 10736 "\"000001\"", 10737 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 10738 EXPECT_EQ("\"test\\000\"\n" 10739 "\"00000000\"\n" 10740 "\"1\"", 10741 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 10742 } 10743 10744 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 10745 verifyFormat("void f() {\n" 10746 " return g() {}\n" 10747 " void h() {}"); 10748 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 10749 "g();\n" 10750 "}"); 10751 } 10752 10753 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 10754 verifyFormat( 10755 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 10756 } 10757 10758 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 10759 verifyFormat("class X {\n" 10760 " void f() {\n" 10761 " }\n" 10762 "};", 10763 getLLVMStyleWithColumns(12)); 10764 } 10765 10766 TEST_F(FormatTest, ConfigurableIndentWidth) { 10767 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 10768 EightIndent.IndentWidth = 8; 10769 EightIndent.ContinuationIndentWidth = 8; 10770 verifyFormat("void f() {\n" 10771 " someFunction();\n" 10772 " if (true) {\n" 10773 " f();\n" 10774 " }\n" 10775 "}", 10776 EightIndent); 10777 verifyFormat("class X {\n" 10778 " void f() {\n" 10779 " }\n" 10780 "};", 10781 EightIndent); 10782 verifyFormat("int x[] = {\n" 10783 " call(),\n" 10784 " call()};", 10785 EightIndent); 10786 } 10787 10788 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 10789 verifyFormat("double\n" 10790 "f();", 10791 getLLVMStyleWithColumns(8)); 10792 } 10793 10794 TEST_F(FormatTest, ConfigurableUseOfTab) { 10795 FormatStyle Tab = getLLVMStyleWithColumns(42); 10796 Tab.IndentWidth = 8; 10797 Tab.UseTab = FormatStyle::UT_Always; 10798 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10799 10800 EXPECT_EQ("if (aaaaaaaa && // q\n" 10801 " bb)\t\t// w\n" 10802 "\t;", 10803 format("if (aaaaaaaa &&// q\n" 10804 "bb)// w\n" 10805 ";", 10806 Tab)); 10807 EXPECT_EQ("if (aaa && bbb) // w\n" 10808 "\t;", 10809 format("if(aaa&&bbb)// w\n" 10810 ";", 10811 Tab)); 10812 10813 verifyFormat("class X {\n" 10814 "\tvoid f() {\n" 10815 "\t\tsomeFunction(parameter1,\n" 10816 "\t\t\t parameter2);\n" 10817 "\t}\n" 10818 "};", 10819 Tab); 10820 verifyFormat("#define A \\\n" 10821 "\tvoid f() { \\\n" 10822 "\t\tsomeFunction( \\\n" 10823 "\t\t parameter1, \\\n" 10824 "\t\t parameter2); \\\n" 10825 "\t}", 10826 Tab); 10827 verifyFormat("int a;\t // x\n" 10828 "int bbbbbbbb; // x\n", 10829 Tab); 10830 10831 Tab.TabWidth = 4; 10832 Tab.IndentWidth = 8; 10833 verifyFormat("class TabWidth4Indent8 {\n" 10834 "\t\tvoid f() {\n" 10835 "\t\t\t\tsomeFunction(parameter1,\n" 10836 "\t\t\t\t\t\t\t parameter2);\n" 10837 "\t\t}\n" 10838 "};", 10839 Tab); 10840 10841 Tab.TabWidth = 4; 10842 Tab.IndentWidth = 4; 10843 verifyFormat("class TabWidth4Indent4 {\n" 10844 "\tvoid f() {\n" 10845 "\t\tsomeFunction(parameter1,\n" 10846 "\t\t\t\t\t parameter2);\n" 10847 "\t}\n" 10848 "};", 10849 Tab); 10850 10851 Tab.TabWidth = 8; 10852 Tab.IndentWidth = 4; 10853 verifyFormat("class TabWidth8Indent4 {\n" 10854 " void f() {\n" 10855 "\tsomeFunction(parameter1,\n" 10856 "\t\t parameter2);\n" 10857 " }\n" 10858 "};", 10859 Tab); 10860 10861 Tab.TabWidth = 8; 10862 Tab.IndentWidth = 8; 10863 EXPECT_EQ("/*\n" 10864 "\t a\t\tcomment\n" 10865 "\t in multiple lines\n" 10866 " */", 10867 format(" /*\t \t \n" 10868 " \t \t a\t\tcomment\t \t\n" 10869 " \t \t in multiple lines\t\n" 10870 " \t */", 10871 Tab)); 10872 10873 Tab.UseTab = FormatStyle::UT_ForIndentation; 10874 verifyFormat("{\n" 10875 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10876 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10877 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10878 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10879 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10880 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10881 "};", 10882 Tab); 10883 verifyFormat("enum AA {\n" 10884 "\ta1, // Force multiple lines\n" 10885 "\ta2,\n" 10886 "\ta3\n" 10887 "};", 10888 Tab); 10889 EXPECT_EQ("if (aaaaaaaa && // q\n" 10890 " bb) // w\n" 10891 "\t;", 10892 format("if (aaaaaaaa &&// q\n" 10893 "bb)// w\n" 10894 ";", 10895 Tab)); 10896 verifyFormat("class X {\n" 10897 "\tvoid f() {\n" 10898 "\t\tsomeFunction(parameter1,\n" 10899 "\t\t parameter2);\n" 10900 "\t}\n" 10901 "};", 10902 Tab); 10903 verifyFormat("{\n" 10904 "\tQ(\n" 10905 "\t {\n" 10906 "\t\t int a;\n" 10907 "\t\t someFunction(aaaaaaaa,\n" 10908 "\t\t bbbbbbb);\n" 10909 "\t },\n" 10910 "\t p);\n" 10911 "}", 10912 Tab); 10913 EXPECT_EQ("{\n" 10914 "\t/* aaaa\n" 10915 "\t bbbb */\n" 10916 "}", 10917 format("{\n" 10918 "/* aaaa\n" 10919 " bbbb */\n" 10920 "}", 10921 Tab)); 10922 EXPECT_EQ("{\n" 10923 "\t/*\n" 10924 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10925 "\t bbbbbbbbbbbbb\n" 10926 "\t*/\n" 10927 "}", 10928 format("{\n" 10929 "/*\n" 10930 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10931 "*/\n" 10932 "}", 10933 Tab)); 10934 EXPECT_EQ("{\n" 10935 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10936 "\t// bbbbbbbbbbbbb\n" 10937 "}", 10938 format("{\n" 10939 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10940 "}", 10941 Tab)); 10942 EXPECT_EQ("{\n" 10943 "\t/*\n" 10944 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10945 "\t bbbbbbbbbbbbb\n" 10946 "\t*/\n" 10947 "}", 10948 format("{\n" 10949 "\t/*\n" 10950 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10951 "\t*/\n" 10952 "}", 10953 Tab)); 10954 EXPECT_EQ("{\n" 10955 "\t/*\n" 10956 "\n" 10957 "\t*/\n" 10958 "}", 10959 format("{\n" 10960 "\t/*\n" 10961 "\n" 10962 "\t*/\n" 10963 "}", 10964 Tab)); 10965 EXPECT_EQ("{\n" 10966 "\t/*\n" 10967 " asdf\n" 10968 "\t*/\n" 10969 "}", 10970 format("{\n" 10971 "\t/*\n" 10972 " asdf\n" 10973 "\t*/\n" 10974 "}", 10975 Tab)); 10976 10977 Tab.UseTab = FormatStyle::UT_Never; 10978 EXPECT_EQ("/*\n" 10979 " a\t\tcomment\n" 10980 " in multiple lines\n" 10981 " */", 10982 format(" /*\t \t \n" 10983 " \t \t a\t\tcomment\t \t\n" 10984 " \t \t in multiple lines\t\n" 10985 " \t */", 10986 Tab)); 10987 EXPECT_EQ("/* some\n" 10988 " comment */", 10989 format(" \t \t /* some\n" 10990 " \t \t comment */", 10991 Tab)); 10992 EXPECT_EQ("int a; /* some\n" 10993 " comment */", 10994 format(" \t \t int a; /* some\n" 10995 " \t \t comment */", 10996 Tab)); 10997 10998 EXPECT_EQ("int a; /* some\n" 10999 "comment */", 11000 format(" \t \t int\ta; /* some\n" 11001 " \t \t comment */", 11002 Tab)); 11003 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11004 " comment */", 11005 format(" \t \t f(\"\t\t\"); /* some\n" 11006 " \t \t comment */", 11007 Tab)); 11008 EXPECT_EQ("{\n" 11009 " /*\n" 11010 " * Comment\n" 11011 " */\n" 11012 " int i;\n" 11013 "}", 11014 format("{\n" 11015 "\t/*\n" 11016 "\t * Comment\n" 11017 "\t */\n" 11018 "\t int i;\n" 11019 "}", 11020 Tab)); 11021 11022 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 11023 Tab.TabWidth = 8; 11024 Tab.IndentWidth = 8; 11025 EXPECT_EQ("if (aaaaaaaa && // q\n" 11026 " bb) // w\n" 11027 "\t;", 11028 format("if (aaaaaaaa &&// q\n" 11029 "bb)// w\n" 11030 ";", 11031 Tab)); 11032 EXPECT_EQ("if (aaa && bbb) // w\n" 11033 "\t;", 11034 format("if(aaa&&bbb)// w\n" 11035 ";", 11036 Tab)); 11037 verifyFormat("class X {\n" 11038 "\tvoid f() {\n" 11039 "\t\tsomeFunction(parameter1,\n" 11040 "\t\t\t parameter2);\n" 11041 "\t}\n" 11042 "};", 11043 Tab); 11044 verifyFormat("#define A \\\n" 11045 "\tvoid f() { \\\n" 11046 "\t\tsomeFunction( \\\n" 11047 "\t\t parameter1, \\\n" 11048 "\t\t parameter2); \\\n" 11049 "\t}", 11050 Tab); 11051 Tab.TabWidth = 4; 11052 Tab.IndentWidth = 8; 11053 verifyFormat("class TabWidth4Indent8 {\n" 11054 "\t\tvoid f() {\n" 11055 "\t\t\t\tsomeFunction(parameter1,\n" 11056 "\t\t\t\t\t\t\t parameter2);\n" 11057 "\t\t}\n" 11058 "};", 11059 Tab); 11060 Tab.TabWidth = 4; 11061 Tab.IndentWidth = 4; 11062 verifyFormat("class TabWidth4Indent4 {\n" 11063 "\tvoid f() {\n" 11064 "\t\tsomeFunction(parameter1,\n" 11065 "\t\t\t\t\t parameter2);\n" 11066 "\t}\n" 11067 "};", 11068 Tab); 11069 Tab.TabWidth = 8; 11070 Tab.IndentWidth = 4; 11071 verifyFormat("class TabWidth8Indent4 {\n" 11072 " void f() {\n" 11073 "\tsomeFunction(parameter1,\n" 11074 "\t\t parameter2);\n" 11075 " }\n" 11076 "};", 11077 Tab); 11078 Tab.TabWidth = 8; 11079 Tab.IndentWidth = 8; 11080 EXPECT_EQ("/*\n" 11081 "\t a\t\tcomment\n" 11082 "\t in multiple lines\n" 11083 " */", 11084 format(" /*\t \t \n" 11085 " \t \t a\t\tcomment\t \t\n" 11086 " \t \t in multiple lines\t\n" 11087 " \t */", 11088 Tab)); 11089 verifyFormat("{\n" 11090 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11091 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11092 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11093 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11094 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11095 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11096 "};", 11097 Tab); 11098 verifyFormat("enum AA {\n" 11099 "\ta1, // Force multiple lines\n" 11100 "\ta2,\n" 11101 "\ta3\n" 11102 "};", 11103 Tab); 11104 EXPECT_EQ("if (aaaaaaaa && // q\n" 11105 " bb) // w\n" 11106 "\t;", 11107 format("if (aaaaaaaa &&// q\n" 11108 "bb)// w\n" 11109 ";", 11110 Tab)); 11111 verifyFormat("class X {\n" 11112 "\tvoid f() {\n" 11113 "\t\tsomeFunction(parameter1,\n" 11114 "\t\t\t parameter2);\n" 11115 "\t}\n" 11116 "};", 11117 Tab); 11118 verifyFormat("{\n" 11119 "\tQ(\n" 11120 "\t {\n" 11121 "\t\t int a;\n" 11122 "\t\t someFunction(aaaaaaaa,\n" 11123 "\t\t\t\t bbbbbbb);\n" 11124 "\t },\n" 11125 "\t p);\n" 11126 "}", 11127 Tab); 11128 EXPECT_EQ("{\n" 11129 "\t/* aaaa\n" 11130 "\t bbbb */\n" 11131 "}", 11132 format("{\n" 11133 "/* aaaa\n" 11134 " bbbb */\n" 11135 "}", 11136 Tab)); 11137 EXPECT_EQ("{\n" 11138 "\t/*\n" 11139 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11140 "\t bbbbbbbbbbbbb\n" 11141 "\t*/\n" 11142 "}", 11143 format("{\n" 11144 "/*\n" 11145 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11146 "*/\n" 11147 "}", 11148 Tab)); 11149 EXPECT_EQ("{\n" 11150 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11151 "\t// bbbbbbbbbbbbb\n" 11152 "}", 11153 format("{\n" 11154 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11155 "}", 11156 Tab)); 11157 EXPECT_EQ("{\n" 11158 "\t/*\n" 11159 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11160 "\t bbbbbbbbbbbbb\n" 11161 "\t*/\n" 11162 "}", 11163 format("{\n" 11164 "\t/*\n" 11165 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11166 "\t*/\n" 11167 "}", 11168 Tab)); 11169 EXPECT_EQ("{\n" 11170 "\t/*\n" 11171 "\n" 11172 "\t*/\n" 11173 "}", 11174 format("{\n" 11175 "\t/*\n" 11176 "\n" 11177 "\t*/\n" 11178 "}", 11179 Tab)); 11180 EXPECT_EQ("{\n" 11181 "\t/*\n" 11182 " asdf\n" 11183 "\t*/\n" 11184 "}", 11185 format("{\n" 11186 "\t/*\n" 11187 " asdf\n" 11188 "\t*/\n" 11189 "}", 11190 Tab)); 11191 EXPECT_EQ("/* some\n" 11192 " comment */", 11193 format(" \t \t /* some\n" 11194 " \t \t comment */", 11195 Tab)); 11196 EXPECT_EQ("int a; /* some\n" 11197 " comment */", 11198 format(" \t \t int a; /* some\n" 11199 " \t \t comment */", 11200 Tab)); 11201 EXPECT_EQ("int a; /* some\n" 11202 "comment */", 11203 format(" \t \t int\ta; /* some\n" 11204 " \t \t comment */", 11205 Tab)); 11206 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11207 " comment */", 11208 format(" \t \t f(\"\t\t\"); /* some\n" 11209 " \t \t comment */", 11210 Tab)); 11211 EXPECT_EQ("{\n" 11212 "\t/*\n" 11213 "\t * Comment\n" 11214 "\t */\n" 11215 "\tint i;\n" 11216 "}", 11217 format("{\n" 11218 "\t/*\n" 11219 "\t * Comment\n" 11220 "\t */\n" 11221 "\t int i;\n" 11222 "}", 11223 Tab)); 11224 Tab.TabWidth = 2; 11225 Tab.IndentWidth = 2; 11226 EXPECT_EQ("{\n" 11227 "\t/* aaaa\n" 11228 "\t\t bbbb */\n" 11229 "}", 11230 format("{\n" 11231 "/* aaaa\n" 11232 "\t bbbb */\n" 11233 "}", 11234 Tab)); 11235 EXPECT_EQ("{\n" 11236 "\t/*\n" 11237 "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11238 "\t\tbbbbbbbbbbbbb\n" 11239 "\t*/\n" 11240 "}", 11241 format("{\n" 11242 "/*\n" 11243 "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11244 "*/\n" 11245 "}", 11246 Tab)); 11247 Tab.AlignConsecutiveAssignments = true; 11248 Tab.AlignConsecutiveDeclarations = true; 11249 Tab.TabWidth = 4; 11250 Tab.IndentWidth = 4; 11251 verifyFormat("class Assign {\n" 11252 "\tvoid f() {\n" 11253 "\t\tint x = 123;\n" 11254 "\t\tint random = 4;\n" 11255 "\t\tstd::string alphabet =\n" 11256 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11257 "\t}\n" 11258 "};", 11259 Tab); 11260 11261 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11262 Tab.TabWidth = 8; 11263 Tab.IndentWidth = 8; 11264 EXPECT_EQ("if (aaaaaaaa && // q\n" 11265 " bb) // w\n" 11266 "\t;", 11267 format("if (aaaaaaaa &&// q\n" 11268 "bb)// w\n" 11269 ";", 11270 Tab)); 11271 EXPECT_EQ("if (aaa && bbb) // w\n" 11272 "\t;", 11273 format("if(aaa&&bbb)// w\n" 11274 ";", 11275 Tab)); 11276 verifyFormat("class X {\n" 11277 "\tvoid f() {\n" 11278 "\t\tsomeFunction(parameter1,\n" 11279 "\t\t parameter2);\n" 11280 "\t}\n" 11281 "};", 11282 Tab); 11283 verifyFormat("#define A \\\n" 11284 "\tvoid f() { \\\n" 11285 "\t\tsomeFunction( \\\n" 11286 "\t\t parameter1, \\\n" 11287 "\t\t parameter2); \\\n" 11288 "\t}", 11289 Tab); 11290 Tab.TabWidth = 4; 11291 Tab.IndentWidth = 8; 11292 verifyFormat("class TabWidth4Indent8 {\n" 11293 "\t\tvoid f() {\n" 11294 "\t\t\t\tsomeFunction(parameter1,\n" 11295 "\t\t\t\t parameter2);\n" 11296 "\t\t}\n" 11297 "};", 11298 Tab); 11299 Tab.TabWidth = 4; 11300 Tab.IndentWidth = 4; 11301 verifyFormat("class TabWidth4Indent4 {\n" 11302 "\tvoid f() {\n" 11303 "\t\tsomeFunction(parameter1,\n" 11304 "\t\t parameter2);\n" 11305 "\t}\n" 11306 "};", 11307 Tab); 11308 Tab.TabWidth = 8; 11309 Tab.IndentWidth = 4; 11310 verifyFormat("class TabWidth8Indent4 {\n" 11311 " void f() {\n" 11312 "\tsomeFunction(parameter1,\n" 11313 "\t parameter2);\n" 11314 " }\n" 11315 "};", 11316 Tab); 11317 Tab.TabWidth = 8; 11318 Tab.IndentWidth = 8; 11319 EXPECT_EQ("/*\n" 11320 " a\t\tcomment\n" 11321 " in multiple lines\n" 11322 " */", 11323 format(" /*\t \t \n" 11324 " \t \t a\t\tcomment\t \t\n" 11325 " \t \t in multiple lines\t\n" 11326 " \t */", 11327 Tab)); 11328 verifyFormat("{\n" 11329 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11330 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11331 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11332 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11333 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11334 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11335 "};", 11336 Tab); 11337 verifyFormat("enum AA {\n" 11338 "\ta1, // Force multiple lines\n" 11339 "\ta2,\n" 11340 "\ta3\n" 11341 "};", 11342 Tab); 11343 EXPECT_EQ("if (aaaaaaaa && // q\n" 11344 " bb) // w\n" 11345 "\t;", 11346 format("if (aaaaaaaa &&// q\n" 11347 "bb)// w\n" 11348 ";", 11349 Tab)); 11350 verifyFormat("class X {\n" 11351 "\tvoid f() {\n" 11352 "\t\tsomeFunction(parameter1,\n" 11353 "\t\t parameter2);\n" 11354 "\t}\n" 11355 "};", 11356 Tab); 11357 verifyFormat("{\n" 11358 "\tQ(\n" 11359 "\t {\n" 11360 "\t\t int a;\n" 11361 "\t\t someFunction(aaaaaaaa,\n" 11362 "\t\t bbbbbbb);\n" 11363 "\t },\n" 11364 "\t p);\n" 11365 "}", 11366 Tab); 11367 EXPECT_EQ("{\n" 11368 "\t/* aaaa\n" 11369 "\t bbbb */\n" 11370 "}", 11371 format("{\n" 11372 "/* aaaa\n" 11373 " bbbb */\n" 11374 "}", 11375 Tab)); 11376 EXPECT_EQ("{\n" 11377 "\t/*\n" 11378 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11379 "\t bbbbbbbbbbbbb\n" 11380 "\t*/\n" 11381 "}", 11382 format("{\n" 11383 "/*\n" 11384 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11385 "*/\n" 11386 "}", 11387 Tab)); 11388 EXPECT_EQ("{\n" 11389 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11390 "\t// bbbbbbbbbbbbb\n" 11391 "}", 11392 format("{\n" 11393 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11394 "}", 11395 Tab)); 11396 EXPECT_EQ("{\n" 11397 "\t/*\n" 11398 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11399 "\t bbbbbbbbbbbbb\n" 11400 "\t*/\n" 11401 "}", 11402 format("{\n" 11403 "\t/*\n" 11404 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11405 "\t*/\n" 11406 "}", 11407 Tab)); 11408 EXPECT_EQ("{\n" 11409 "\t/*\n" 11410 "\n" 11411 "\t*/\n" 11412 "}", 11413 format("{\n" 11414 "\t/*\n" 11415 "\n" 11416 "\t*/\n" 11417 "}", 11418 Tab)); 11419 EXPECT_EQ("{\n" 11420 "\t/*\n" 11421 " asdf\n" 11422 "\t*/\n" 11423 "}", 11424 format("{\n" 11425 "\t/*\n" 11426 " asdf\n" 11427 "\t*/\n" 11428 "}", 11429 Tab)); 11430 EXPECT_EQ("/* some\n" 11431 " comment */", 11432 format(" \t \t /* some\n" 11433 " \t \t comment */", 11434 Tab)); 11435 EXPECT_EQ("int a; /* some\n" 11436 " comment */", 11437 format(" \t \t int a; /* some\n" 11438 " \t \t comment */", 11439 Tab)); 11440 EXPECT_EQ("int a; /* some\n" 11441 "comment */", 11442 format(" \t \t int\ta; /* some\n" 11443 " \t \t comment */", 11444 Tab)); 11445 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11446 " comment */", 11447 format(" \t \t f(\"\t\t\"); /* some\n" 11448 " \t \t comment */", 11449 Tab)); 11450 EXPECT_EQ("{\n" 11451 "\t/*\n" 11452 "\t * Comment\n" 11453 "\t */\n" 11454 "\tint i;\n" 11455 "}", 11456 format("{\n" 11457 "\t/*\n" 11458 "\t * Comment\n" 11459 "\t */\n" 11460 "\t int i;\n" 11461 "}", 11462 Tab)); 11463 Tab.TabWidth = 2; 11464 Tab.IndentWidth = 2; 11465 EXPECT_EQ("{\n" 11466 "\t/* aaaa\n" 11467 "\t bbbb */\n" 11468 "}", 11469 format("{\n" 11470 "/* aaaa\n" 11471 " bbbb */\n" 11472 "}", 11473 Tab)); 11474 EXPECT_EQ("{\n" 11475 "\t/*\n" 11476 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11477 "\t bbbbbbbbbbbbb\n" 11478 "\t*/\n" 11479 "}", 11480 format("{\n" 11481 "/*\n" 11482 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11483 "*/\n" 11484 "}", 11485 Tab)); 11486 Tab.AlignConsecutiveAssignments = true; 11487 Tab.AlignConsecutiveDeclarations = true; 11488 Tab.TabWidth = 4; 11489 Tab.IndentWidth = 4; 11490 verifyFormat("class Assign {\n" 11491 "\tvoid f() {\n" 11492 "\t\tint x = 123;\n" 11493 "\t\tint random = 4;\n" 11494 "\t\tstd::string alphabet =\n" 11495 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11496 "\t}\n" 11497 "};", 11498 Tab); 11499 Tab.AlignOperands = FormatStyle::OAS_Align; 11500 verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb +\n" 11501 " cccccccccccccccccccc;", 11502 Tab); 11503 // no alignment 11504 verifyFormat("int aaaaaaaaaa =\n" 11505 "\tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 11506 Tab); 11507 verifyFormat("return aaaaaaaaaaaaaaaa ? 111111111111111\n" 11508 " : bbbbbbbbbbbbbb ? 222222222222222\n" 11509 " : 333333333333333;", 11510 Tab); 11511 Tab.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11512 Tab.AlignOperands = FormatStyle::OAS_AlignAfterOperator; 11513 verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb\n" 11514 " + cccccccccccccccccccc;", 11515 Tab); 11516 } 11517 11518 TEST_F(FormatTest, ZeroTabWidth) { 11519 FormatStyle Tab = getLLVMStyleWithColumns(42); 11520 Tab.IndentWidth = 8; 11521 Tab.UseTab = FormatStyle::UT_Never; 11522 Tab.TabWidth = 0; 11523 EXPECT_EQ("void a(){\n" 11524 " // line starts with '\t'\n" 11525 "};", 11526 format("void a(){\n" 11527 "\t// line starts with '\t'\n" 11528 "};", 11529 Tab)); 11530 11531 EXPECT_EQ("void a(){\n" 11532 " // line starts with '\t'\n" 11533 "};", 11534 format("void a(){\n" 11535 "\t\t// line starts with '\t'\n" 11536 "};", 11537 Tab)); 11538 11539 Tab.UseTab = FormatStyle::UT_ForIndentation; 11540 EXPECT_EQ("void a(){\n" 11541 " // line starts with '\t'\n" 11542 "};", 11543 format("void a(){\n" 11544 "\t// line starts with '\t'\n" 11545 "};", 11546 Tab)); 11547 11548 EXPECT_EQ("void a(){\n" 11549 " // line starts with '\t'\n" 11550 "};", 11551 format("void a(){\n" 11552 "\t\t// line starts with '\t'\n" 11553 "};", 11554 Tab)); 11555 11556 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 11557 EXPECT_EQ("void a(){\n" 11558 " // line starts with '\t'\n" 11559 "};", 11560 format("void a(){\n" 11561 "\t// line starts with '\t'\n" 11562 "};", 11563 Tab)); 11564 11565 EXPECT_EQ("void a(){\n" 11566 " // line starts with '\t'\n" 11567 "};", 11568 format("void a(){\n" 11569 "\t\t// line starts with '\t'\n" 11570 "};", 11571 Tab)); 11572 11573 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11574 EXPECT_EQ("void a(){\n" 11575 " // line starts with '\t'\n" 11576 "};", 11577 format("void a(){\n" 11578 "\t// line starts with '\t'\n" 11579 "};", 11580 Tab)); 11581 11582 EXPECT_EQ("void a(){\n" 11583 " // line starts with '\t'\n" 11584 "};", 11585 format("void a(){\n" 11586 "\t\t// line starts with '\t'\n" 11587 "};", 11588 Tab)); 11589 11590 Tab.UseTab = FormatStyle::UT_Always; 11591 EXPECT_EQ("void a(){\n" 11592 "// line starts with '\t'\n" 11593 "};", 11594 format("void a(){\n" 11595 "\t// line starts with '\t'\n" 11596 "};", 11597 Tab)); 11598 11599 EXPECT_EQ("void a(){\n" 11600 "// line starts with '\t'\n" 11601 "};", 11602 format("void a(){\n" 11603 "\t\t// line starts with '\t'\n" 11604 "};", 11605 Tab)); 11606 } 11607 11608 TEST_F(FormatTest, CalculatesOriginalColumn) { 11609 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11610 "q\"; /* some\n" 11611 " comment */", 11612 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11613 "q\"; /* some\n" 11614 " comment */", 11615 getLLVMStyle())); 11616 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11617 "/* some\n" 11618 " comment */", 11619 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11620 " /* some\n" 11621 " comment */", 11622 getLLVMStyle())); 11623 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11624 "qqq\n" 11625 "/* some\n" 11626 " comment */", 11627 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11628 "qqq\n" 11629 " /* some\n" 11630 " comment */", 11631 getLLVMStyle())); 11632 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11633 "wwww; /* some\n" 11634 " comment */", 11635 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11636 "wwww; /* some\n" 11637 " comment */", 11638 getLLVMStyle())); 11639 } 11640 11641 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 11642 FormatStyle NoSpace = getLLVMStyle(); 11643 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 11644 11645 verifyFormat("while(true)\n" 11646 " continue;", 11647 NoSpace); 11648 verifyFormat("for(;;)\n" 11649 " continue;", 11650 NoSpace); 11651 verifyFormat("if(true)\n" 11652 " f();\n" 11653 "else if(true)\n" 11654 " f();", 11655 NoSpace); 11656 verifyFormat("do {\n" 11657 " do_something();\n" 11658 "} while(something());", 11659 NoSpace); 11660 verifyFormat("switch(x) {\n" 11661 "default:\n" 11662 " break;\n" 11663 "}", 11664 NoSpace); 11665 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 11666 verifyFormat("size_t x = sizeof(x);", NoSpace); 11667 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 11668 verifyFormat("auto f(int x) -> typeof(x);", NoSpace); 11669 verifyFormat("auto f(int x) -> _Atomic(x);", NoSpace); 11670 verifyFormat("auto f(int x) -> __underlying_type(x);", NoSpace); 11671 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 11672 verifyFormat("alignas(128) char a[128];", NoSpace); 11673 verifyFormat("size_t x = alignof(MyType);", NoSpace); 11674 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 11675 verifyFormat("int f() throw(Deprecated);", NoSpace); 11676 verifyFormat("typedef void (*cb)(int);", NoSpace); 11677 verifyFormat("T A::operator()();", NoSpace); 11678 verifyFormat("X A::operator++(T);", NoSpace); 11679 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 11680 11681 FormatStyle Space = getLLVMStyle(); 11682 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 11683 11684 verifyFormat("int f ();", Space); 11685 verifyFormat("void f (int a, T b) {\n" 11686 " while (true)\n" 11687 " continue;\n" 11688 "}", 11689 Space); 11690 verifyFormat("if (true)\n" 11691 " f ();\n" 11692 "else if (true)\n" 11693 " f ();", 11694 Space); 11695 verifyFormat("do {\n" 11696 " do_something ();\n" 11697 "} while (something ());", 11698 Space); 11699 verifyFormat("switch (x) {\n" 11700 "default:\n" 11701 " break;\n" 11702 "}", 11703 Space); 11704 verifyFormat("A::A () : a (1) {}", Space); 11705 verifyFormat("void f () __attribute__ ((asdf));", Space); 11706 verifyFormat("*(&a + 1);\n" 11707 "&((&a)[1]);\n" 11708 "a[(b + c) * d];\n" 11709 "(((a + 1) * 2) + 3) * 4;", 11710 Space); 11711 verifyFormat("#define A(x) x", Space); 11712 verifyFormat("#define A (x) x", Space); 11713 verifyFormat("#if defined(x)\n" 11714 "#endif", 11715 Space); 11716 verifyFormat("auto i = std::make_unique<int> (5);", Space); 11717 verifyFormat("size_t x = sizeof (x);", Space); 11718 verifyFormat("auto f (int x) -> decltype (x);", Space); 11719 verifyFormat("auto f (int x) -> typeof (x);", Space); 11720 verifyFormat("auto f (int x) -> _Atomic (x);", Space); 11721 verifyFormat("auto f (int x) -> __underlying_type (x);", Space); 11722 verifyFormat("int f (T x) noexcept (x.create ());", Space); 11723 verifyFormat("alignas (128) char a[128];", Space); 11724 verifyFormat("size_t x = alignof (MyType);", Space); 11725 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 11726 verifyFormat("int f () throw (Deprecated);", Space); 11727 verifyFormat("typedef void (*cb) (int);", Space); 11728 verifyFormat("T A::operator() ();", Space); 11729 verifyFormat("X A::operator++ (T);", Space); 11730 verifyFormat("auto lambda = [] () { return 0; };", Space); 11731 verifyFormat("int x = int (y);", Space); 11732 11733 FormatStyle SomeSpace = getLLVMStyle(); 11734 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 11735 11736 verifyFormat("[]() -> float {}", SomeSpace); 11737 verifyFormat("[] (auto foo) {}", SomeSpace); 11738 verifyFormat("[foo]() -> int {}", SomeSpace); 11739 verifyFormat("int f();", SomeSpace); 11740 verifyFormat("void f (int a, T b) {\n" 11741 " while (true)\n" 11742 " continue;\n" 11743 "}", 11744 SomeSpace); 11745 verifyFormat("if (true)\n" 11746 " f();\n" 11747 "else if (true)\n" 11748 " f();", 11749 SomeSpace); 11750 verifyFormat("do {\n" 11751 " do_something();\n" 11752 "} while (something());", 11753 SomeSpace); 11754 verifyFormat("switch (x) {\n" 11755 "default:\n" 11756 " break;\n" 11757 "}", 11758 SomeSpace); 11759 verifyFormat("A::A() : a (1) {}", SomeSpace); 11760 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 11761 verifyFormat("*(&a + 1);\n" 11762 "&((&a)[1]);\n" 11763 "a[(b + c) * d];\n" 11764 "(((a + 1) * 2) + 3) * 4;", 11765 SomeSpace); 11766 verifyFormat("#define A(x) x", SomeSpace); 11767 verifyFormat("#define A (x) x", SomeSpace); 11768 verifyFormat("#if defined(x)\n" 11769 "#endif", 11770 SomeSpace); 11771 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 11772 verifyFormat("size_t x = sizeof (x);", SomeSpace); 11773 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 11774 verifyFormat("auto f (int x) -> typeof (x);", SomeSpace); 11775 verifyFormat("auto f (int x) -> _Atomic (x);", SomeSpace); 11776 verifyFormat("auto f (int x) -> __underlying_type (x);", SomeSpace); 11777 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 11778 verifyFormat("alignas (128) char a[128];", SomeSpace); 11779 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 11780 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 11781 SomeSpace); 11782 verifyFormat("int f() throw (Deprecated);", SomeSpace); 11783 verifyFormat("typedef void (*cb) (int);", SomeSpace); 11784 verifyFormat("T A::operator()();", SomeSpace); 11785 verifyFormat("X A::operator++ (T);", SomeSpace); 11786 verifyFormat("int x = int (y);", SomeSpace); 11787 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 11788 } 11789 11790 TEST_F(FormatTest, SpaceAfterLogicalNot) { 11791 FormatStyle Spaces = getLLVMStyle(); 11792 Spaces.SpaceAfterLogicalNot = true; 11793 11794 verifyFormat("bool x = ! y", Spaces); 11795 verifyFormat("if (! isFailure())", Spaces); 11796 verifyFormat("if (! (a && b))", Spaces); 11797 verifyFormat("\"Error!\"", Spaces); 11798 verifyFormat("! ! x", Spaces); 11799 } 11800 11801 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 11802 FormatStyle Spaces = getLLVMStyle(); 11803 11804 Spaces.SpacesInParentheses = true; 11805 verifyFormat("do_something( ::globalVar );", Spaces); 11806 verifyFormat("call( x, y, z );", Spaces); 11807 verifyFormat("call();", Spaces); 11808 verifyFormat("std::function<void( int, int )> callback;", Spaces); 11809 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 11810 Spaces); 11811 verifyFormat("while ( (bool)1 )\n" 11812 " continue;", 11813 Spaces); 11814 verifyFormat("for ( ;; )\n" 11815 " continue;", 11816 Spaces); 11817 verifyFormat("if ( true )\n" 11818 " f();\n" 11819 "else if ( true )\n" 11820 " f();", 11821 Spaces); 11822 verifyFormat("do {\n" 11823 " do_something( (int)i );\n" 11824 "} while ( something() );", 11825 Spaces); 11826 verifyFormat("switch ( x ) {\n" 11827 "default:\n" 11828 " break;\n" 11829 "}", 11830 Spaces); 11831 11832 Spaces.SpacesInParentheses = false; 11833 Spaces.SpacesInCStyleCastParentheses = true; 11834 verifyFormat("Type *A = ( Type * )P;", Spaces); 11835 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 11836 verifyFormat("x = ( int32 )y;", Spaces); 11837 verifyFormat("int a = ( int )(2.0f);", Spaces); 11838 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 11839 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 11840 verifyFormat("#define x (( int )-1)", Spaces); 11841 11842 // Run the first set of tests again with: 11843 Spaces.SpacesInParentheses = false; 11844 Spaces.SpaceInEmptyParentheses = true; 11845 Spaces.SpacesInCStyleCastParentheses = true; 11846 verifyFormat("call(x, y, z);", Spaces); 11847 verifyFormat("call( );", Spaces); 11848 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11849 verifyFormat("while (( bool )1)\n" 11850 " continue;", 11851 Spaces); 11852 verifyFormat("for (;;)\n" 11853 " continue;", 11854 Spaces); 11855 verifyFormat("if (true)\n" 11856 " f( );\n" 11857 "else if (true)\n" 11858 " f( );", 11859 Spaces); 11860 verifyFormat("do {\n" 11861 " do_something(( int )i);\n" 11862 "} while (something( ));", 11863 Spaces); 11864 verifyFormat("switch (x) {\n" 11865 "default:\n" 11866 " break;\n" 11867 "}", 11868 Spaces); 11869 11870 // Run the first set of tests again with: 11871 Spaces.SpaceAfterCStyleCast = true; 11872 verifyFormat("call(x, y, z);", Spaces); 11873 verifyFormat("call( );", Spaces); 11874 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11875 verifyFormat("while (( bool ) 1)\n" 11876 " continue;", 11877 Spaces); 11878 verifyFormat("for (;;)\n" 11879 " continue;", 11880 Spaces); 11881 verifyFormat("if (true)\n" 11882 " f( );\n" 11883 "else if (true)\n" 11884 " f( );", 11885 Spaces); 11886 verifyFormat("do {\n" 11887 " do_something(( int ) i);\n" 11888 "} while (something( ));", 11889 Spaces); 11890 verifyFormat("switch (x) {\n" 11891 "default:\n" 11892 " break;\n" 11893 "}", 11894 Spaces); 11895 11896 // Run subset of tests again with: 11897 Spaces.SpacesInCStyleCastParentheses = false; 11898 Spaces.SpaceAfterCStyleCast = true; 11899 verifyFormat("while ((bool) 1)\n" 11900 " continue;", 11901 Spaces); 11902 verifyFormat("do {\n" 11903 " do_something((int) i);\n" 11904 "} while (something( ));", 11905 Spaces); 11906 } 11907 11908 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 11909 verifyFormat("int a[5];"); 11910 verifyFormat("a[3] += 42;"); 11911 11912 FormatStyle Spaces = getLLVMStyle(); 11913 Spaces.SpacesInSquareBrackets = true; 11914 // Not lambdas. 11915 verifyFormat("int a[ 5 ];", Spaces); 11916 verifyFormat("a[ 3 ] += 42;", Spaces); 11917 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 11918 verifyFormat("double &operator[](int i) { return 0; }\n" 11919 "int i;", 11920 Spaces); 11921 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 11922 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 11923 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 11924 // Lambdas. 11925 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 11926 verifyFormat("return [ i, args... ] {};", Spaces); 11927 verifyFormat("int foo = [ &bar ]() {};", Spaces); 11928 verifyFormat("int foo = [ = ]() {};", Spaces); 11929 verifyFormat("int foo = [ & ]() {};", Spaces); 11930 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 11931 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 11932 } 11933 11934 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 11935 FormatStyle NoSpaceStyle = getLLVMStyle(); 11936 verifyFormat("int a[5];", NoSpaceStyle); 11937 verifyFormat("a[3] += 42;", NoSpaceStyle); 11938 11939 verifyFormat("int a[1];", NoSpaceStyle); 11940 verifyFormat("int 1 [a];", NoSpaceStyle); 11941 verifyFormat("int a[1][2];", NoSpaceStyle); 11942 verifyFormat("a[7] = 5;", NoSpaceStyle); 11943 verifyFormat("int a = (f())[23];", NoSpaceStyle); 11944 verifyFormat("f([] {})", NoSpaceStyle); 11945 11946 FormatStyle Space = getLLVMStyle(); 11947 Space.SpaceBeforeSquareBrackets = true; 11948 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 11949 verifyFormat("return [i, args...] {};", Space); 11950 11951 verifyFormat("int a [5];", Space); 11952 verifyFormat("a [3] += 42;", Space); 11953 verifyFormat("constexpr char hello []{\"hello\"};", Space); 11954 verifyFormat("double &operator[](int i) { return 0; }\n" 11955 "int i;", 11956 Space); 11957 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 11958 verifyFormat("int i = a [a][a]->f();", Space); 11959 verifyFormat("int i = (*b) [a]->f();", Space); 11960 11961 verifyFormat("int a [1];", Space); 11962 verifyFormat("int 1 [a];", Space); 11963 verifyFormat("int a [1][2];", Space); 11964 verifyFormat("a [7] = 5;", Space); 11965 verifyFormat("int a = (f()) [23];", Space); 11966 verifyFormat("f([] {})", Space); 11967 } 11968 11969 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 11970 verifyFormat("int a = 5;"); 11971 verifyFormat("a += 42;"); 11972 verifyFormat("a or_eq 8;"); 11973 11974 FormatStyle Spaces = getLLVMStyle(); 11975 Spaces.SpaceBeforeAssignmentOperators = false; 11976 verifyFormat("int a= 5;", Spaces); 11977 verifyFormat("a+= 42;", Spaces); 11978 verifyFormat("a or_eq 8;", Spaces); 11979 } 11980 11981 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 11982 verifyFormat("class Foo : public Bar {};"); 11983 verifyFormat("Foo::Foo() : foo(1) {}"); 11984 verifyFormat("for (auto a : b) {\n}"); 11985 verifyFormat("int x = a ? b : c;"); 11986 verifyFormat("{\n" 11987 "label0:\n" 11988 " int x = 0;\n" 11989 "}"); 11990 verifyFormat("switch (x) {\n" 11991 "case 1:\n" 11992 "default:\n" 11993 "}"); 11994 11995 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 11996 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 11997 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 11998 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 11999 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 12000 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 12001 verifyFormat("{\n" 12002 "label1:\n" 12003 " int x = 0;\n" 12004 "}", 12005 CtorInitializerStyle); 12006 verifyFormat("switch (x) {\n" 12007 "case 1:\n" 12008 "default:\n" 12009 "}", 12010 CtorInitializerStyle); 12011 CtorInitializerStyle.BreakConstructorInitializers = 12012 FormatStyle::BCIS_AfterColon; 12013 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 12014 " aaaaaaaaaaaaaaaa(1),\n" 12015 " bbbbbbbbbbbbbbbb(2) {}", 12016 CtorInitializerStyle); 12017 CtorInitializerStyle.BreakConstructorInitializers = 12018 FormatStyle::BCIS_BeforeComma; 12019 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12020 " : aaaaaaaaaaaaaaaa(1)\n" 12021 " , bbbbbbbbbbbbbbbb(2) {}", 12022 CtorInitializerStyle); 12023 CtorInitializerStyle.BreakConstructorInitializers = 12024 FormatStyle::BCIS_BeforeColon; 12025 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12026 " : aaaaaaaaaaaaaaaa(1),\n" 12027 " bbbbbbbbbbbbbbbb(2) {}", 12028 CtorInitializerStyle); 12029 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 12030 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 12031 ": aaaaaaaaaaaaaaaa(1),\n" 12032 " bbbbbbbbbbbbbbbb(2) {}", 12033 CtorInitializerStyle); 12034 12035 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 12036 InheritanceStyle.SpaceBeforeInheritanceColon = false; 12037 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 12038 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 12039 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 12040 verifyFormat("int x = a ? b : c;", InheritanceStyle); 12041 verifyFormat("{\n" 12042 "label2:\n" 12043 " int x = 0;\n" 12044 "}", 12045 InheritanceStyle); 12046 verifyFormat("switch (x) {\n" 12047 "case 1:\n" 12048 "default:\n" 12049 "}", 12050 InheritanceStyle); 12051 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 12052 verifyFormat("class Foooooooooooooooooooooo:\n" 12053 " public aaaaaaaaaaaaaaaaaa,\n" 12054 " public bbbbbbbbbbbbbbbbbb {\n" 12055 "}", 12056 InheritanceStyle); 12057 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 12058 verifyFormat("class Foooooooooooooooooooooo\n" 12059 " : public aaaaaaaaaaaaaaaaaa\n" 12060 " , public bbbbbbbbbbbbbbbbbb {\n" 12061 "}", 12062 InheritanceStyle); 12063 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12064 verifyFormat("class Foooooooooooooooooooooo\n" 12065 " : public aaaaaaaaaaaaaaaaaa,\n" 12066 " public bbbbbbbbbbbbbbbbbb {\n" 12067 "}", 12068 InheritanceStyle); 12069 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 12070 verifyFormat("class Foooooooooooooooooooooo\n" 12071 ": public aaaaaaaaaaaaaaaaaa,\n" 12072 " public bbbbbbbbbbbbbbbbbb {}", 12073 InheritanceStyle); 12074 12075 FormatStyle ForLoopStyle = getLLVMStyle(); 12076 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 12077 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 12078 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 12079 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 12080 verifyFormat("int x = a ? b : c;", ForLoopStyle); 12081 verifyFormat("{\n" 12082 "label2:\n" 12083 " int x = 0;\n" 12084 "}", 12085 ForLoopStyle); 12086 verifyFormat("switch (x) {\n" 12087 "case 1:\n" 12088 "default:\n" 12089 "}", 12090 ForLoopStyle); 12091 12092 FormatStyle NoSpaceStyle = getLLVMStyle(); 12093 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 12094 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 12095 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 12096 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 12097 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 12098 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 12099 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 12100 verifyFormat("{\n" 12101 "label3:\n" 12102 " int x = 0;\n" 12103 "}", 12104 NoSpaceStyle); 12105 verifyFormat("switch (x) {\n" 12106 "case 1:\n" 12107 "default:\n" 12108 "}", 12109 NoSpaceStyle); 12110 } 12111 12112 TEST_F(FormatTest, ConfigurableSpaceAroundPointerQualifiers) { 12113 FormatStyle Style = getLLVMStyle(); 12114 12115 Style.PointerAlignment = FormatStyle::PAS_Left; 12116 Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default; 12117 verifyFormat("void* const* x = NULL;", Style); 12118 12119 #define verifyQualifierSpaces(Code, Pointers, Qualifiers) \ 12120 do { \ 12121 Style.PointerAlignment = FormatStyle::Pointers; \ 12122 Style.SpaceAroundPointerQualifiers = FormatStyle::Qualifiers; \ 12123 verifyFormat(Code, Style); \ 12124 } while (false) 12125 12126 verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Default); 12127 verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_Default); 12128 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Default); 12129 12130 verifyQualifierSpaces("void* const* x = NULL;", PAS_Left, SAPQ_Before); 12131 verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Before); 12132 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Before); 12133 12134 verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_After); 12135 verifyQualifierSpaces("void *const *x = NULL;", PAS_Right, SAPQ_After); 12136 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_After); 12137 12138 verifyQualifierSpaces("void* const * x = NULL;", PAS_Left, SAPQ_Both); 12139 verifyQualifierSpaces("void * const *x = NULL;", PAS_Right, SAPQ_Both); 12140 verifyQualifierSpaces("void * const * x = NULL;", PAS_Middle, SAPQ_Both); 12141 12142 #undef verifyQualifierSpaces 12143 12144 FormatStyle Spaces = getLLVMStyle(); 12145 Spaces.AttributeMacros.push_back("qualified"); 12146 Spaces.PointerAlignment = FormatStyle::PAS_Right; 12147 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Default; 12148 verifyFormat("SomeType *volatile *a = NULL;", Spaces); 12149 verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces); 12150 verifyFormat("std::vector<SomeType *const *> x;", Spaces); 12151 verifyFormat("std::vector<SomeType *qualified *> x;", Spaces); 12152 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12153 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before; 12154 verifyFormat("SomeType * volatile *a = NULL;", Spaces); 12155 verifyFormat("SomeType * __attribute__((attr)) *a = NULL;", Spaces); 12156 verifyFormat("std::vector<SomeType * const *> x;", Spaces); 12157 verifyFormat("std::vector<SomeType * qualified *> x;", Spaces); 12158 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12159 12160 // Check that SAPQ_Before doesn't result in extra spaces for PAS_Left. 12161 Spaces.PointerAlignment = FormatStyle::PAS_Left; 12162 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Before; 12163 verifyFormat("SomeType* volatile* a = NULL;", Spaces); 12164 verifyFormat("SomeType* __attribute__((attr))* a = NULL;", Spaces); 12165 verifyFormat("std::vector<SomeType* const*> x;", Spaces); 12166 verifyFormat("std::vector<SomeType* qualified*> x;", Spaces); 12167 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12168 // However, setting it to SAPQ_After should add spaces after __attribute, etc. 12169 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After; 12170 verifyFormat("SomeType* volatile * a = NULL;", Spaces); 12171 verifyFormat("SomeType* __attribute__((attr)) * a = NULL;", Spaces); 12172 verifyFormat("std::vector<SomeType* const *> x;", Spaces); 12173 verifyFormat("std::vector<SomeType* qualified *> x;", Spaces); 12174 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12175 12176 // PAS_Middle should not have any noticeable changes even for SAPQ_Both 12177 Spaces.PointerAlignment = FormatStyle::PAS_Middle; 12178 Spaces.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_After; 12179 verifyFormat("SomeType * volatile * a = NULL;", Spaces); 12180 verifyFormat("SomeType * __attribute__((attr)) * a = NULL;", Spaces); 12181 verifyFormat("std::vector<SomeType * const *> x;", Spaces); 12182 verifyFormat("std::vector<SomeType * qualified *> x;", Spaces); 12183 verifyFormat("std::vector<SomeVar * NotAQualifier> x;", Spaces); 12184 } 12185 12186 TEST_F(FormatTest, AlignConsecutiveMacros) { 12187 FormatStyle Style = getLLVMStyle(); 12188 Style.AlignConsecutiveAssignments = true; 12189 Style.AlignConsecutiveDeclarations = true; 12190 Style.AlignConsecutiveMacros = false; 12191 12192 verifyFormat("#define a 3\n" 12193 "#define bbbb 4\n" 12194 "#define ccc (5)", 12195 Style); 12196 12197 verifyFormat("#define f(x) (x * x)\n" 12198 "#define fff(x, y, z) (x * y + z)\n" 12199 "#define ffff(x, y) (x - y)", 12200 Style); 12201 12202 verifyFormat("#define foo(x, y) (x + y)\n" 12203 "#define bar (5, 6)(2 + 2)", 12204 Style); 12205 12206 verifyFormat("#define a 3\n" 12207 "#define bbbb 4\n" 12208 "#define ccc (5)\n" 12209 "#define f(x) (x * x)\n" 12210 "#define fff(x, y, z) (x * y + z)\n" 12211 "#define ffff(x, y) (x - y)", 12212 Style); 12213 12214 Style.AlignConsecutiveMacros = true; 12215 verifyFormat("#define a 3\n" 12216 "#define bbbb 4\n" 12217 "#define ccc (5)", 12218 Style); 12219 12220 verifyFormat("#define f(x) (x * x)\n" 12221 "#define fff(x, y, z) (x * y + z)\n" 12222 "#define ffff(x, y) (x - y)", 12223 Style); 12224 12225 verifyFormat("#define foo(x, y) (x + y)\n" 12226 "#define bar (5, 6)(2 + 2)", 12227 Style); 12228 12229 verifyFormat("#define a 3\n" 12230 "#define bbbb 4\n" 12231 "#define ccc (5)\n" 12232 "#define f(x) (x * x)\n" 12233 "#define fff(x, y, z) (x * y + z)\n" 12234 "#define ffff(x, y) (x - y)", 12235 Style); 12236 12237 verifyFormat("#define a 5\n" 12238 "#define foo(x, y) (x + y)\n" 12239 "#define CCC (6)\n" 12240 "auto lambda = []() {\n" 12241 " auto ii = 0;\n" 12242 " float j = 0;\n" 12243 " return 0;\n" 12244 "};\n" 12245 "int i = 0;\n" 12246 "float i2 = 0;\n" 12247 "auto v = type{\n" 12248 " i = 1, //\n" 12249 " (i = 2), //\n" 12250 " i = 3 //\n" 12251 "};", 12252 Style); 12253 12254 Style.AlignConsecutiveMacros = false; 12255 Style.ColumnLimit = 20; 12256 12257 verifyFormat("#define a \\\n" 12258 " \"aabbbbbbbbbbbb\"\n" 12259 "#define D \\\n" 12260 " \"aabbbbbbbbbbbb\" \\\n" 12261 " \"ccddeeeeeeeee\"\n" 12262 "#define B \\\n" 12263 " \"QQQQQQQQQQQQQ\" \\\n" 12264 " \"FFFFFFFFFFFFF\" \\\n" 12265 " \"LLLLLLLL\"\n", 12266 Style); 12267 12268 Style.AlignConsecutiveMacros = true; 12269 verifyFormat("#define a \\\n" 12270 " \"aabbbbbbbbbbbb\"\n" 12271 "#define D \\\n" 12272 " \"aabbbbbbbbbbbb\" \\\n" 12273 " \"ccddeeeeeeeee\"\n" 12274 "#define B \\\n" 12275 " \"QQQQQQQQQQQQQ\" \\\n" 12276 " \"FFFFFFFFFFFFF\" \\\n" 12277 " \"LLLLLLLL\"\n", 12278 Style); 12279 } 12280 12281 TEST_F(FormatTest, AlignConsecutiveAssignments) { 12282 FormatStyle Alignment = getLLVMStyle(); 12283 Alignment.AlignConsecutiveMacros = true; 12284 Alignment.AlignConsecutiveAssignments = false; 12285 verifyFormat("int a = 5;\n" 12286 "int oneTwoThree = 123;", 12287 Alignment); 12288 verifyFormat("int a = 5;\n" 12289 "int oneTwoThree = 123;", 12290 Alignment); 12291 12292 Alignment.AlignConsecutiveAssignments = true; 12293 verifyFormat("int a = 5;\n" 12294 "int oneTwoThree = 123;", 12295 Alignment); 12296 verifyFormat("int a = method();\n" 12297 "int oneTwoThree = 133;", 12298 Alignment); 12299 verifyFormat("a &= 5;\n" 12300 "bcd *= 5;\n" 12301 "ghtyf += 5;\n" 12302 "dvfvdb -= 5;\n" 12303 "a /= 5;\n" 12304 "vdsvsv %= 5;\n" 12305 "sfdbddfbdfbb ^= 5;\n" 12306 "dvsdsv |= 5;\n" 12307 "int dsvvdvsdvvv = 123;", 12308 Alignment); 12309 verifyFormat("int i = 1, j = 10;\n" 12310 "something = 2000;", 12311 Alignment); 12312 verifyFormat("something = 2000;\n" 12313 "int i = 1, j = 10;\n", 12314 Alignment); 12315 verifyFormat("something = 2000;\n" 12316 "another = 911;\n" 12317 "int i = 1, j = 10;\n" 12318 "oneMore = 1;\n" 12319 "i = 2;", 12320 Alignment); 12321 verifyFormat("int a = 5;\n" 12322 "int one = 1;\n" 12323 "method();\n" 12324 "int oneTwoThree = 123;\n" 12325 "int oneTwo = 12;", 12326 Alignment); 12327 verifyFormat("int oneTwoThree = 123;\n" 12328 "int oneTwo = 12;\n" 12329 "method();\n", 12330 Alignment); 12331 verifyFormat("int oneTwoThree = 123; // comment\n" 12332 "int oneTwo = 12; // comment", 12333 Alignment); 12334 12335 // Bug 25167 12336 /* Uncomment when fixed 12337 verifyFormat("#if A\n" 12338 "#else\n" 12339 "int aaaaaaaa = 12;\n" 12340 "#endif\n" 12341 "#if B\n" 12342 "#else\n" 12343 "int a = 12;\n" 12344 "#endif\n", 12345 Alignment); 12346 verifyFormat("enum foo {\n" 12347 "#if A\n" 12348 "#else\n" 12349 " aaaaaaaa = 12;\n" 12350 "#endif\n" 12351 "#if B\n" 12352 "#else\n" 12353 " a = 12;\n" 12354 "#endif\n" 12355 "};\n", 12356 Alignment); 12357 */ 12358 12359 EXPECT_EQ("int a = 5;\n" 12360 "\n" 12361 "int oneTwoThree = 123;", 12362 format("int a = 5;\n" 12363 "\n" 12364 "int oneTwoThree= 123;", 12365 Alignment)); 12366 EXPECT_EQ("int a = 5;\n" 12367 "int one = 1;\n" 12368 "\n" 12369 "int oneTwoThree = 123;", 12370 format("int a = 5;\n" 12371 "int one = 1;\n" 12372 "\n" 12373 "int oneTwoThree = 123;", 12374 Alignment)); 12375 EXPECT_EQ("int a = 5;\n" 12376 "int one = 1;\n" 12377 "\n" 12378 "int oneTwoThree = 123;\n" 12379 "int oneTwo = 12;", 12380 format("int a = 5;\n" 12381 "int one = 1;\n" 12382 "\n" 12383 "int oneTwoThree = 123;\n" 12384 "int oneTwo = 12;", 12385 Alignment)); 12386 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12387 verifyFormat("#define A \\\n" 12388 " int aaaa = 12; \\\n" 12389 " int b = 23; \\\n" 12390 " int ccc = 234; \\\n" 12391 " int dddddddddd = 2345;", 12392 Alignment); 12393 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12394 verifyFormat("#define A \\\n" 12395 " int aaaa = 12; \\\n" 12396 " int b = 23; \\\n" 12397 " int ccc = 234; \\\n" 12398 " int dddddddddd = 2345;", 12399 Alignment); 12400 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12401 verifyFormat("#define A " 12402 " \\\n" 12403 " int aaaa = 12; " 12404 " \\\n" 12405 " int b = 23; " 12406 " \\\n" 12407 " int ccc = 234; " 12408 " \\\n" 12409 " int dddddddddd = 2345;", 12410 Alignment); 12411 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12412 "k = 4, int l = 5,\n" 12413 " int m = 6) {\n" 12414 " int j = 10;\n" 12415 " otherThing = 1;\n" 12416 "}", 12417 Alignment); 12418 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12419 " int i = 1;\n" 12420 " int j = 2;\n" 12421 " int big = 10000;\n" 12422 "}", 12423 Alignment); 12424 verifyFormat("class C {\n" 12425 "public:\n" 12426 " int i = 1;\n" 12427 " virtual void f() = 0;\n" 12428 "};", 12429 Alignment); 12430 verifyFormat("int i = 1;\n" 12431 "if (SomeType t = getSomething()) {\n" 12432 "}\n" 12433 "int j = 2;\n" 12434 "int big = 10000;", 12435 Alignment); 12436 verifyFormat("int j = 7;\n" 12437 "for (int k = 0; k < N; ++k) {\n" 12438 "}\n" 12439 "int j = 2;\n" 12440 "int big = 10000;\n" 12441 "}", 12442 Alignment); 12443 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12444 verifyFormat("int i = 1;\n" 12445 "LooooooooooongType loooooooooooooooooooooongVariable\n" 12446 " = someLooooooooooooooooongFunction();\n" 12447 "int j = 2;", 12448 Alignment); 12449 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 12450 verifyFormat("int i = 1;\n" 12451 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 12452 " someLooooooooooooooooongFunction();\n" 12453 "int j = 2;", 12454 Alignment); 12455 12456 verifyFormat("auto lambda = []() {\n" 12457 " auto i = 0;\n" 12458 " return 0;\n" 12459 "};\n" 12460 "int i = 0;\n" 12461 "auto v = type{\n" 12462 " i = 1, //\n" 12463 " (i = 2), //\n" 12464 " i = 3 //\n" 12465 "};", 12466 Alignment); 12467 12468 verifyFormat( 12469 "int i = 1;\n" 12470 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12471 " loooooooooooooooooooooongParameterB);\n" 12472 "int j = 2;", 12473 Alignment); 12474 12475 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 12476 " typename B = very_long_type_name_1,\n" 12477 " typename T_2 = very_long_type_name_2>\n" 12478 "auto foo() {}\n", 12479 Alignment); 12480 verifyFormat("int a, b = 1;\n" 12481 "int c = 2;\n" 12482 "int dd = 3;\n", 12483 Alignment); 12484 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12485 "float b[1][] = {{3.f}};\n", 12486 Alignment); 12487 verifyFormat("for (int i = 0; i < 1; i++)\n" 12488 " int x = 1;\n", 12489 Alignment); 12490 verifyFormat("for (i = 0; i < 1; i++)\n" 12491 " x = 1;\n" 12492 "y = 1;\n", 12493 Alignment); 12494 12495 Alignment.ReflowComments = true; 12496 Alignment.ColumnLimit = 50; 12497 EXPECT_EQ("int x = 0;\n" 12498 "int yy = 1; /// specificlennospace\n" 12499 "int zzz = 2;\n", 12500 format("int x = 0;\n" 12501 "int yy = 1; ///specificlennospace\n" 12502 "int zzz = 2;\n", 12503 Alignment)); 12504 } 12505 12506 TEST_F(FormatTest, AlignConsecutiveBitFields) { 12507 FormatStyle Alignment = getLLVMStyle(); 12508 Alignment.AlignConsecutiveBitFields = true; 12509 verifyFormat("int const a : 5;\n" 12510 "int oneTwoThree : 23;", 12511 Alignment); 12512 12513 // Initializers are allowed starting with c++2a 12514 verifyFormat("int const a : 5 = 1;\n" 12515 "int oneTwoThree : 23 = 0;", 12516 Alignment); 12517 12518 Alignment.AlignConsecutiveDeclarations = true; 12519 verifyFormat("int const a : 5;\n" 12520 "int oneTwoThree : 23;", 12521 Alignment); 12522 12523 verifyFormat("int const a : 5; // comment\n" 12524 "int oneTwoThree : 23; // comment", 12525 Alignment); 12526 12527 verifyFormat("int const a : 5 = 1;\n" 12528 "int oneTwoThree : 23 = 0;", 12529 Alignment); 12530 12531 Alignment.AlignConsecutiveAssignments = true; 12532 verifyFormat("int const a : 5 = 1;\n" 12533 "int oneTwoThree : 23 = 0;", 12534 Alignment); 12535 verifyFormat("int const a : 5 = {1};\n" 12536 "int oneTwoThree : 23 = 0;", 12537 Alignment); 12538 12539 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_None; 12540 verifyFormat("int const a :5;\n" 12541 "int oneTwoThree:23;", 12542 Alignment); 12543 12544 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_Before; 12545 verifyFormat("int const a :5;\n" 12546 "int oneTwoThree :23;", 12547 Alignment); 12548 12549 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_After; 12550 verifyFormat("int const a : 5;\n" 12551 "int oneTwoThree: 23;", 12552 Alignment); 12553 12554 // Known limitations: ':' is only recognized as a bitfield colon when 12555 // followed by a number. 12556 /* 12557 verifyFormat("int oneTwoThree : SOME_CONSTANT;\n" 12558 "int a : 5;", 12559 Alignment); 12560 */ 12561 } 12562 12563 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 12564 FormatStyle Alignment = getLLVMStyle(); 12565 Alignment.AlignConsecutiveMacros = true; 12566 Alignment.AlignConsecutiveDeclarations = false; 12567 verifyFormat("float const a = 5;\n" 12568 "int oneTwoThree = 123;", 12569 Alignment); 12570 verifyFormat("int a = 5;\n" 12571 "float const oneTwoThree = 123;", 12572 Alignment); 12573 12574 Alignment.AlignConsecutiveDeclarations = true; 12575 verifyFormat("float const a = 5;\n" 12576 "int oneTwoThree = 123;", 12577 Alignment); 12578 verifyFormat("int a = method();\n" 12579 "float const oneTwoThree = 133;", 12580 Alignment); 12581 verifyFormat("int i = 1, j = 10;\n" 12582 "something = 2000;", 12583 Alignment); 12584 verifyFormat("something = 2000;\n" 12585 "int i = 1, j = 10;\n", 12586 Alignment); 12587 verifyFormat("float something = 2000;\n" 12588 "double another = 911;\n" 12589 "int i = 1, j = 10;\n" 12590 "const int *oneMore = 1;\n" 12591 "unsigned i = 2;", 12592 Alignment); 12593 verifyFormat("float a = 5;\n" 12594 "int one = 1;\n" 12595 "method();\n" 12596 "const double oneTwoThree = 123;\n" 12597 "const unsigned int oneTwo = 12;", 12598 Alignment); 12599 verifyFormat("int oneTwoThree{0}; // comment\n" 12600 "unsigned oneTwo; // comment", 12601 Alignment); 12602 EXPECT_EQ("float const a = 5;\n" 12603 "\n" 12604 "int oneTwoThree = 123;", 12605 format("float const a = 5;\n" 12606 "\n" 12607 "int oneTwoThree= 123;", 12608 Alignment)); 12609 EXPECT_EQ("float a = 5;\n" 12610 "int one = 1;\n" 12611 "\n" 12612 "unsigned oneTwoThree = 123;", 12613 format("float a = 5;\n" 12614 "int one = 1;\n" 12615 "\n" 12616 "unsigned oneTwoThree = 123;", 12617 Alignment)); 12618 EXPECT_EQ("float a = 5;\n" 12619 "int one = 1;\n" 12620 "\n" 12621 "unsigned oneTwoThree = 123;\n" 12622 "int oneTwo = 12;", 12623 format("float a = 5;\n" 12624 "int one = 1;\n" 12625 "\n" 12626 "unsigned oneTwoThree = 123;\n" 12627 "int oneTwo = 12;", 12628 Alignment)); 12629 // Function prototype alignment 12630 verifyFormat("int a();\n" 12631 "double b();", 12632 Alignment); 12633 verifyFormat("int a(int x);\n" 12634 "double b();", 12635 Alignment); 12636 unsigned OldColumnLimit = Alignment.ColumnLimit; 12637 // We need to set ColumnLimit to zero, in order to stress nested alignments, 12638 // otherwise the function parameters will be re-flowed onto a single line. 12639 Alignment.ColumnLimit = 0; 12640 EXPECT_EQ("int a(int x,\n" 12641 " float y);\n" 12642 "double b(int x,\n" 12643 " double y);", 12644 format("int a(int x,\n" 12645 " float y);\n" 12646 "double b(int x,\n" 12647 " double y);", 12648 Alignment)); 12649 // This ensures that function parameters of function declarations are 12650 // correctly indented when their owning functions are indented. 12651 // The failure case here is for 'double y' to not be indented enough. 12652 EXPECT_EQ("double a(int x);\n" 12653 "int b(int y,\n" 12654 " double z);", 12655 format("double a(int x);\n" 12656 "int b(int y,\n" 12657 " double z);", 12658 Alignment)); 12659 // Set ColumnLimit low so that we induce wrapping immediately after 12660 // the function name and opening paren. 12661 Alignment.ColumnLimit = 13; 12662 verifyFormat("int function(\n" 12663 " int x,\n" 12664 " bool y);", 12665 Alignment); 12666 Alignment.ColumnLimit = OldColumnLimit; 12667 // Ensure function pointers don't screw up recursive alignment 12668 verifyFormat("int a(int x, void (*fp)(int y));\n" 12669 "double b();", 12670 Alignment); 12671 Alignment.AlignConsecutiveAssignments = true; 12672 // Ensure recursive alignment is broken by function braces, so that the 12673 // "a = 1" does not align with subsequent assignments inside the function 12674 // body. 12675 verifyFormat("int func(int a = 1) {\n" 12676 " int b = 2;\n" 12677 " int cc = 3;\n" 12678 "}", 12679 Alignment); 12680 verifyFormat("float something = 2000;\n" 12681 "double another = 911;\n" 12682 "int i = 1, j = 10;\n" 12683 "const int *oneMore = 1;\n" 12684 "unsigned i = 2;", 12685 Alignment); 12686 verifyFormat("int oneTwoThree = {0}; // comment\n" 12687 "unsigned oneTwo = 0; // comment", 12688 Alignment); 12689 // Make sure that scope is correctly tracked, in the absence of braces 12690 verifyFormat("for (int i = 0; i < n; i++)\n" 12691 " j = i;\n" 12692 "double x = 1;\n", 12693 Alignment); 12694 verifyFormat("if (int i = 0)\n" 12695 " j = i;\n" 12696 "double x = 1;\n", 12697 Alignment); 12698 // Ensure operator[] and operator() are comprehended 12699 verifyFormat("struct test {\n" 12700 " long long int foo();\n" 12701 " int operator[](int a);\n" 12702 " double bar();\n" 12703 "};\n", 12704 Alignment); 12705 verifyFormat("struct test {\n" 12706 " long long int foo();\n" 12707 " int operator()(int a);\n" 12708 " double bar();\n" 12709 "};\n", 12710 Alignment); 12711 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 12712 " int const i = 1;\n" 12713 " int * j = 2;\n" 12714 " int big = 10000;\n" 12715 "\n" 12716 " unsigned oneTwoThree = 123;\n" 12717 " int oneTwo = 12;\n" 12718 " method();\n" 12719 " float k = 2;\n" 12720 " int ll = 10000;\n" 12721 "}", 12722 format("void SomeFunction(int parameter= 0) {\n" 12723 " int const i= 1;\n" 12724 " int *j=2;\n" 12725 " int big = 10000;\n" 12726 "\n" 12727 "unsigned oneTwoThree =123;\n" 12728 "int oneTwo = 12;\n" 12729 " method();\n" 12730 "float k= 2;\n" 12731 "int ll=10000;\n" 12732 "}", 12733 Alignment)); 12734 Alignment.AlignConsecutiveAssignments = false; 12735 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12736 verifyFormat("#define A \\\n" 12737 " int aaaa = 12; \\\n" 12738 " float b = 23; \\\n" 12739 " const int ccc = 234; \\\n" 12740 " unsigned dddddddddd = 2345;", 12741 Alignment); 12742 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12743 verifyFormat("#define A \\\n" 12744 " int aaaa = 12; \\\n" 12745 " float b = 23; \\\n" 12746 " const int ccc = 234; \\\n" 12747 " unsigned dddddddddd = 2345;", 12748 Alignment); 12749 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12750 Alignment.ColumnLimit = 30; 12751 verifyFormat("#define A \\\n" 12752 " int aaaa = 12; \\\n" 12753 " float b = 23; \\\n" 12754 " const int ccc = 234; \\\n" 12755 " int dddddddddd = 2345;", 12756 Alignment); 12757 Alignment.ColumnLimit = 80; 12758 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12759 "k = 4, int l = 5,\n" 12760 " int m = 6) {\n" 12761 " const int j = 10;\n" 12762 " otherThing = 1;\n" 12763 "}", 12764 Alignment); 12765 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12766 " int const i = 1;\n" 12767 " int * j = 2;\n" 12768 " int big = 10000;\n" 12769 "}", 12770 Alignment); 12771 verifyFormat("class C {\n" 12772 "public:\n" 12773 " int i = 1;\n" 12774 " virtual void f() = 0;\n" 12775 "};", 12776 Alignment); 12777 verifyFormat("float i = 1;\n" 12778 "if (SomeType t = getSomething()) {\n" 12779 "}\n" 12780 "const unsigned j = 2;\n" 12781 "int big = 10000;", 12782 Alignment); 12783 verifyFormat("float j = 7;\n" 12784 "for (int k = 0; k < N; ++k) {\n" 12785 "}\n" 12786 "unsigned j = 2;\n" 12787 "int big = 10000;\n" 12788 "}", 12789 Alignment); 12790 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12791 verifyFormat("float i = 1;\n" 12792 "LooooooooooongType loooooooooooooooooooooongVariable\n" 12793 " = someLooooooooooooooooongFunction();\n" 12794 "int j = 2;", 12795 Alignment); 12796 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 12797 verifyFormat("int i = 1;\n" 12798 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 12799 " someLooooooooooooooooongFunction();\n" 12800 "int j = 2;", 12801 Alignment); 12802 12803 Alignment.AlignConsecutiveAssignments = true; 12804 verifyFormat("auto lambda = []() {\n" 12805 " auto ii = 0;\n" 12806 " float j = 0;\n" 12807 " return 0;\n" 12808 "};\n" 12809 "int i = 0;\n" 12810 "float i2 = 0;\n" 12811 "auto v = type{\n" 12812 " i = 1, //\n" 12813 " (i = 2), //\n" 12814 " i = 3 //\n" 12815 "};", 12816 Alignment); 12817 Alignment.AlignConsecutiveAssignments = false; 12818 12819 verifyFormat( 12820 "int i = 1;\n" 12821 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12822 " loooooooooooooooooooooongParameterB);\n" 12823 "int j = 2;", 12824 Alignment); 12825 12826 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 12827 // We expect declarations and assignments to align, as long as it doesn't 12828 // exceed the column limit, starting a new alignment sequence whenever it 12829 // happens. 12830 Alignment.AlignConsecutiveAssignments = true; 12831 Alignment.ColumnLimit = 30; 12832 verifyFormat("float ii = 1;\n" 12833 "unsigned j = 2;\n" 12834 "int someVerylongVariable = 1;\n" 12835 "AnotherLongType ll = 123456;\n" 12836 "VeryVeryLongType k = 2;\n" 12837 "int myvar = 1;", 12838 Alignment); 12839 Alignment.ColumnLimit = 80; 12840 Alignment.AlignConsecutiveAssignments = false; 12841 12842 verifyFormat( 12843 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 12844 " typename LongType, typename B>\n" 12845 "auto foo() {}\n", 12846 Alignment); 12847 verifyFormat("float a, b = 1;\n" 12848 "int c = 2;\n" 12849 "int dd = 3;\n", 12850 Alignment); 12851 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12852 "float b[1][] = {{3.f}};\n", 12853 Alignment); 12854 Alignment.AlignConsecutiveAssignments = true; 12855 verifyFormat("float a, b = 1;\n" 12856 "int c = 2;\n" 12857 "int dd = 3;\n", 12858 Alignment); 12859 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12860 "float b[1][] = {{3.f}};\n", 12861 Alignment); 12862 Alignment.AlignConsecutiveAssignments = false; 12863 12864 Alignment.ColumnLimit = 30; 12865 Alignment.BinPackParameters = false; 12866 verifyFormat("void foo(float a,\n" 12867 " float b,\n" 12868 " int c,\n" 12869 " uint32_t *d) {\n" 12870 " int * e = 0;\n" 12871 " float f = 0;\n" 12872 " double g = 0;\n" 12873 "}\n" 12874 "void bar(ino_t a,\n" 12875 " int b,\n" 12876 " uint32_t *c,\n" 12877 " bool d) {}\n", 12878 Alignment); 12879 Alignment.BinPackParameters = true; 12880 Alignment.ColumnLimit = 80; 12881 12882 // Bug 33507 12883 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 12884 verifyFormat( 12885 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 12886 " static const Version verVs2017;\n" 12887 " return true;\n" 12888 "});\n", 12889 Alignment); 12890 Alignment.PointerAlignment = FormatStyle::PAS_Right; 12891 12892 // See llvm.org/PR35641 12893 Alignment.AlignConsecutiveDeclarations = true; 12894 verifyFormat("int func() { //\n" 12895 " int b;\n" 12896 " unsigned c;\n" 12897 "}", 12898 Alignment); 12899 12900 // See PR37175 12901 FormatStyle Style = getMozillaStyle(); 12902 Style.AlignConsecutiveDeclarations = true; 12903 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 12904 "foo(int a);", 12905 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 12906 } 12907 12908 TEST_F(FormatTest, LinuxBraceBreaking) { 12909 FormatStyle LinuxBraceStyle = getLLVMStyle(); 12910 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 12911 verifyFormat("namespace a\n" 12912 "{\n" 12913 "class A\n" 12914 "{\n" 12915 " void f()\n" 12916 " {\n" 12917 " if (true) {\n" 12918 " a();\n" 12919 " b();\n" 12920 " } else {\n" 12921 " a();\n" 12922 " }\n" 12923 " }\n" 12924 " void g() { return; }\n" 12925 "};\n" 12926 "struct B {\n" 12927 " int x;\n" 12928 "};\n" 12929 "} // namespace a\n", 12930 LinuxBraceStyle); 12931 verifyFormat("enum X {\n" 12932 " Y = 0,\n" 12933 "}\n", 12934 LinuxBraceStyle); 12935 verifyFormat("struct S {\n" 12936 " int Type;\n" 12937 " union {\n" 12938 " int x;\n" 12939 " double y;\n" 12940 " } Value;\n" 12941 " class C\n" 12942 " {\n" 12943 " MyFavoriteType Value;\n" 12944 " } Class;\n" 12945 "}\n", 12946 LinuxBraceStyle); 12947 } 12948 12949 TEST_F(FormatTest, MozillaBraceBreaking) { 12950 FormatStyle MozillaBraceStyle = getLLVMStyle(); 12951 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 12952 MozillaBraceStyle.FixNamespaceComments = false; 12953 verifyFormat("namespace a {\n" 12954 "class A\n" 12955 "{\n" 12956 " void f()\n" 12957 " {\n" 12958 " if (true) {\n" 12959 " a();\n" 12960 " b();\n" 12961 " }\n" 12962 " }\n" 12963 " void g() { return; }\n" 12964 "};\n" 12965 "enum E\n" 12966 "{\n" 12967 " A,\n" 12968 " // foo\n" 12969 " B,\n" 12970 " C\n" 12971 "};\n" 12972 "struct B\n" 12973 "{\n" 12974 " int x;\n" 12975 "};\n" 12976 "}\n", 12977 MozillaBraceStyle); 12978 verifyFormat("struct S\n" 12979 "{\n" 12980 " int Type;\n" 12981 " union\n" 12982 " {\n" 12983 " int x;\n" 12984 " double y;\n" 12985 " } Value;\n" 12986 " class C\n" 12987 " {\n" 12988 " MyFavoriteType Value;\n" 12989 " } Class;\n" 12990 "}\n", 12991 MozillaBraceStyle); 12992 } 12993 12994 TEST_F(FormatTest, StroustrupBraceBreaking) { 12995 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 12996 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12997 verifyFormat("namespace a {\n" 12998 "class A {\n" 12999 " void f()\n" 13000 " {\n" 13001 " if (true) {\n" 13002 " a();\n" 13003 " b();\n" 13004 " }\n" 13005 " }\n" 13006 " void g() { return; }\n" 13007 "};\n" 13008 "struct B {\n" 13009 " int x;\n" 13010 "};\n" 13011 "} // namespace a\n", 13012 StroustrupBraceStyle); 13013 13014 verifyFormat("void foo()\n" 13015 "{\n" 13016 " if (a) {\n" 13017 " a();\n" 13018 " }\n" 13019 " else {\n" 13020 " b();\n" 13021 " }\n" 13022 "}\n", 13023 StroustrupBraceStyle); 13024 13025 verifyFormat("#ifdef _DEBUG\n" 13026 "int foo(int i = 0)\n" 13027 "#else\n" 13028 "int foo(int i = 5)\n" 13029 "#endif\n" 13030 "{\n" 13031 " return i;\n" 13032 "}", 13033 StroustrupBraceStyle); 13034 13035 verifyFormat("void foo() {}\n" 13036 "void bar()\n" 13037 "#ifdef _DEBUG\n" 13038 "{\n" 13039 " foo();\n" 13040 "}\n" 13041 "#else\n" 13042 "{\n" 13043 "}\n" 13044 "#endif", 13045 StroustrupBraceStyle); 13046 13047 verifyFormat("void foobar() { int i = 5; }\n" 13048 "#ifdef _DEBUG\n" 13049 "void bar() {}\n" 13050 "#else\n" 13051 "void bar() { foobar(); }\n" 13052 "#endif", 13053 StroustrupBraceStyle); 13054 } 13055 13056 TEST_F(FormatTest, AllmanBraceBreaking) { 13057 FormatStyle AllmanBraceStyle = getLLVMStyle(); 13058 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 13059 13060 EXPECT_EQ("namespace a\n" 13061 "{\n" 13062 "void f();\n" 13063 "void g();\n" 13064 "} // namespace a\n", 13065 format("namespace a\n" 13066 "{\n" 13067 "void f();\n" 13068 "void g();\n" 13069 "}\n", 13070 AllmanBraceStyle)); 13071 13072 verifyFormat("namespace a\n" 13073 "{\n" 13074 "class A\n" 13075 "{\n" 13076 " void f()\n" 13077 " {\n" 13078 " if (true)\n" 13079 " {\n" 13080 " a();\n" 13081 " b();\n" 13082 " }\n" 13083 " }\n" 13084 " void g() { return; }\n" 13085 "};\n" 13086 "struct B\n" 13087 "{\n" 13088 " int x;\n" 13089 "};\n" 13090 "union C\n" 13091 "{\n" 13092 "};\n" 13093 "} // namespace a", 13094 AllmanBraceStyle); 13095 13096 verifyFormat("void f()\n" 13097 "{\n" 13098 " if (true)\n" 13099 " {\n" 13100 " a();\n" 13101 " }\n" 13102 " else if (false)\n" 13103 " {\n" 13104 " b();\n" 13105 " }\n" 13106 " else\n" 13107 " {\n" 13108 " c();\n" 13109 " }\n" 13110 "}\n", 13111 AllmanBraceStyle); 13112 13113 verifyFormat("void f()\n" 13114 "{\n" 13115 " for (int i = 0; i < 10; ++i)\n" 13116 " {\n" 13117 " a();\n" 13118 " }\n" 13119 " while (false)\n" 13120 " {\n" 13121 " b();\n" 13122 " }\n" 13123 " do\n" 13124 " {\n" 13125 " c();\n" 13126 " } while (false)\n" 13127 "}\n", 13128 AllmanBraceStyle); 13129 13130 verifyFormat("void f(int a)\n" 13131 "{\n" 13132 " switch (a)\n" 13133 " {\n" 13134 " case 0:\n" 13135 " break;\n" 13136 " case 1:\n" 13137 " {\n" 13138 " break;\n" 13139 " }\n" 13140 " case 2:\n" 13141 " {\n" 13142 " }\n" 13143 " break;\n" 13144 " default:\n" 13145 " break;\n" 13146 " }\n" 13147 "}\n", 13148 AllmanBraceStyle); 13149 13150 verifyFormat("enum X\n" 13151 "{\n" 13152 " Y = 0,\n" 13153 "}\n", 13154 AllmanBraceStyle); 13155 verifyFormat("enum X\n" 13156 "{\n" 13157 " Y = 0\n" 13158 "}\n", 13159 AllmanBraceStyle); 13160 13161 verifyFormat("@interface BSApplicationController ()\n" 13162 "{\n" 13163 "@private\n" 13164 " id _extraIvar;\n" 13165 "}\n" 13166 "@end\n", 13167 AllmanBraceStyle); 13168 13169 verifyFormat("#ifdef _DEBUG\n" 13170 "int foo(int i = 0)\n" 13171 "#else\n" 13172 "int foo(int i = 5)\n" 13173 "#endif\n" 13174 "{\n" 13175 " return i;\n" 13176 "}", 13177 AllmanBraceStyle); 13178 13179 verifyFormat("void foo() {}\n" 13180 "void bar()\n" 13181 "#ifdef _DEBUG\n" 13182 "{\n" 13183 " foo();\n" 13184 "}\n" 13185 "#else\n" 13186 "{\n" 13187 "}\n" 13188 "#endif", 13189 AllmanBraceStyle); 13190 13191 verifyFormat("void foobar() { int i = 5; }\n" 13192 "#ifdef _DEBUG\n" 13193 "void bar() {}\n" 13194 "#else\n" 13195 "void bar() { foobar(); }\n" 13196 "#endif", 13197 AllmanBraceStyle); 13198 13199 // This shouldn't affect ObjC blocks.. 13200 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 13201 " // ...\n" 13202 " int i;\n" 13203 "}];", 13204 AllmanBraceStyle); 13205 verifyFormat("void (^block)(void) = ^{\n" 13206 " // ...\n" 13207 " int i;\n" 13208 "};", 13209 AllmanBraceStyle); 13210 // .. or dict literals. 13211 verifyFormat("void f()\n" 13212 "{\n" 13213 " // ...\n" 13214 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 13215 "}", 13216 AllmanBraceStyle); 13217 verifyFormat("void f()\n" 13218 "{\n" 13219 " // ...\n" 13220 " [object someMethod:@{a : @\"b\"}];\n" 13221 "}", 13222 AllmanBraceStyle); 13223 verifyFormat("int f()\n" 13224 "{ // comment\n" 13225 " return 42;\n" 13226 "}", 13227 AllmanBraceStyle); 13228 13229 AllmanBraceStyle.ColumnLimit = 19; 13230 verifyFormat("void f() { int i; }", AllmanBraceStyle); 13231 AllmanBraceStyle.ColumnLimit = 18; 13232 verifyFormat("void f()\n" 13233 "{\n" 13234 " int i;\n" 13235 "}", 13236 AllmanBraceStyle); 13237 AllmanBraceStyle.ColumnLimit = 80; 13238 13239 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 13240 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 13241 FormatStyle::SIS_WithoutElse; 13242 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 13243 verifyFormat("void f(bool b)\n" 13244 "{\n" 13245 " if (b)\n" 13246 " {\n" 13247 " return;\n" 13248 " }\n" 13249 "}\n", 13250 BreakBeforeBraceShortIfs); 13251 verifyFormat("void f(bool b)\n" 13252 "{\n" 13253 " if constexpr (b)\n" 13254 " {\n" 13255 " return;\n" 13256 " }\n" 13257 "}\n", 13258 BreakBeforeBraceShortIfs); 13259 verifyFormat("void f(bool b)\n" 13260 "{\n" 13261 " if CONSTEXPR (b)\n" 13262 " {\n" 13263 " return;\n" 13264 " }\n" 13265 "}\n", 13266 BreakBeforeBraceShortIfs); 13267 verifyFormat("void f(bool b)\n" 13268 "{\n" 13269 " if (b) return;\n" 13270 "}\n", 13271 BreakBeforeBraceShortIfs); 13272 verifyFormat("void f(bool b)\n" 13273 "{\n" 13274 " if constexpr (b) return;\n" 13275 "}\n", 13276 BreakBeforeBraceShortIfs); 13277 verifyFormat("void f(bool b)\n" 13278 "{\n" 13279 " if CONSTEXPR (b) return;\n" 13280 "}\n", 13281 BreakBeforeBraceShortIfs); 13282 verifyFormat("void f(bool b)\n" 13283 "{\n" 13284 " while (b)\n" 13285 " {\n" 13286 " return;\n" 13287 " }\n" 13288 "}\n", 13289 BreakBeforeBraceShortIfs); 13290 } 13291 13292 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 13293 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 13294 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 13295 13296 // Make a few changes to the style for testing purposes 13297 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 13298 FormatStyle::SFS_Empty; 13299 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13300 WhitesmithsBraceStyle.ColumnLimit = 0; 13301 13302 // FIXME: this test case can't decide whether there should be a blank line 13303 // after the ~D() line or not. It adds one if one doesn't exist in the test 13304 // and it removes the line if one exists. 13305 /* 13306 verifyFormat("class A;\n" 13307 "namespace B\n" 13308 " {\n" 13309 "class C;\n" 13310 "// Comment\n" 13311 "class D\n" 13312 " {\n" 13313 "public:\n" 13314 " D();\n" 13315 " ~D() {}\n" 13316 "private:\n" 13317 " enum E\n" 13318 " {\n" 13319 " F\n" 13320 " }\n" 13321 " };\n" 13322 " } // namespace B\n", 13323 WhitesmithsBraceStyle); 13324 */ 13325 13326 verifyFormat("namespace a\n" 13327 " {\n" 13328 "class A\n" 13329 " {\n" 13330 " void f()\n" 13331 " {\n" 13332 " if (true)\n" 13333 " {\n" 13334 " a();\n" 13335 " b();\n" 13336 " }\n" 13337 " }\n" 13338 " void g()\n" 13339 " {\n" 13340 " return;\n" 13341 " }\n" 13342 " };\n" 13343 "struct B\n" 13344 " {\n" 13345 " int x;\n" 13346 " };\n" 13347 " } // namespace a", 13348 WhitesmithsBraceStyle); 13349 13350 verifyFormat("void f()\n" 13351 " {\n" 13352 " if (true)\n" 13353 " {\n" 13354 " a();\n" 13355 " }\n" 13356 " else if (false)\n" 13357 " {\n" 13358 " b();\n" 13359 " }\n" 13360 " else\n" 13361 " {\n" 13362 " c();\n" 13363 " }\n" 13364 " }\n", 13365 WhitesmithsBraceStyle); 13366 13367 verifyFormat("void f()\n" 13368 " {\n" 13369 " for (int i = 0; i < 10; ++i)\n" 13370 " {\n" 13371 " a();\n" 13372 " }\n" 13373 " while (false)\n" 13374 " {\n" 13375 " b();\n" 13376 " }\n" 13377 " do\n" 13378 " {\n" 13379 " c();\n" 13380 " } while (false)\n" 13381 " }\n", 13382 WhitesmithsBraceStyle); 13383 13384 WhitesmithsBraceStyle.IndentCaseBlocks = true; 13385 verifyFormat("void switchTest1(int a)\n" 13386 " {\n" 13387 " switch (a)\n" 13388 " {\n" 13389 " case 2:\n" 13390 " {\n" 13391 " }\n" 13392 " break;\n" 13393 " }\n" 13394 " }\n", 13395 WhitesmithsBraceStyle); 13396 13397 verifyFormat("void switchTest2(int a)\n" 13398 " {\n" 13399 " switch (a)\n" 13400 " {\n" 13401 " case 0:\n" 13402 " break;\n" 13403 " case 1:\n" 13404 " {\n" 13405 " break;\n" 13406 " }\n" 13407 " case 2:\n" 13408 " {\n" 13409 " }\n" 13410 " break;\n" 13411 " default:\n" 13412 " break;\n" 13413 " }\n" 13414 " }\n", 13415 WhitesmithsBraceStyle); 13416 13417 verifyFormat("void switchTest3(int a)\n" 13418 " {\n" 13419 " switch (a)\n" 13420 " {\n" 13421 " case 0:\n" 13422 " {\n" 13423 " foo(x);\n" 13424 " }\n" 13425 " break;\n" 13426 " default:\n" 13427 " {\n" 13428 " foo(1);\n" 13429 " }\n" 13430 " break;\n" 13431 " }\n" 13432 " }\n", 13433 WhitesmithsBraceStyle); 13434 13435 WhitesmithsBraceStyle.IndentCaseBlocks = false; 13436 13437 verifyFormat("void switchTest4(int a)\n" 13438 " {\n" 13439 " switch (a)\n" 13440 " {\n" 13441 " case 2:\n" 13442 " {\n" 13443 " }\n" 13444 " break;\n" 13445 " }\n" 13446 " }\n", 13447 WhitesmithsBraceStyle); 13448 13449 verifyFormat("void switchTest5(int a)\n" 13450 " {\n" 13451 " switch (a)\n" 13452 " {\n" 13453 " case 0:\n" 13454 " break;\n" 13455 " case 1:\n" 13456 " {\n" 13457 " foo();\n" 13458 " break;\n" 13459 " }\n" 13460 " case 2:\n" 13461 " {\n" 13462 " }\n" 13463 " break;\n" 13464 " default:\n" 13465 " break;\n" 13466 " }\n" 13467 " }\n", 13468 WhitesmithsBraceStyle); 13469 13470 verifyFormat("void switchTest6(int a)\n" 13471 " {\n" 13472 " switch (a)\n" 13473 " {\n" 13474 " case 0:\n" 13475 " {\n" 13476 " foo(x);\n" 13477 " }\n" 13478 " break;\n" 13479 " default:\n" 13480 " {\n" 13481 " foo(1);\n" 13482 " }\n" 13483 " break;\n" 13484 " }\n" 13485 " }\n", 13486 WhitesmithsBraceStyle); 13487 13488 verifyFormat("enum X\n" 13489 " {\n" 13490 " Y = 0, // testing\n" 13491 " }\n", 13492 WhitesmithsBraceStyle); 13493 13494 verifyFormat("enum X\n" 13495 " {\n" 13496 " Y = 0\n" 13497 " }\n", 13498 WhitesmithsBraceStyle); 13499 verifyFormat("enum X\n" 13500 " {\n" 13501 " Y = 0,\n" 13502 " Z = 1\n" 13503 " };\n", 13504 WhitesmithsBraceStyle); 13505 13506 verifyFormat("@interface BSApplicationController ()\n" 13507 " {\n" 13508 "@private\n" 13509 " id _extraIvar;\n" 13510 " }\n" 13511 "@end\n", 13512 WhitesmithsBraceStyle); 13513 13514 verifyFormat("#ifdef _DEBUG\n" 13515 "int foo(int i = 0)\n" 13516 "#else\n" 13517 "int foo(int i = 5)\n" 13518 "#endif\n" 13519 " {\n" 13520 " return i;\n" 13521 " }", 13522 WhitesmithsBraceStyle); 13523 13524 verifyFormat("void foo() {}\n" 13525 "void bar()\n" 13526 "#ifdef _DEBUG\n" 13527 " {\n" 13528 " foo();\n" 13529 " }\n" 13530 "#else\n" 13531 " {\n" 13532 " }\n" 13533 "#endif", 13534 WhitesmithsBraceStyle); 13535 13536 verifyFormat("void foobar()\n" 13537 " {\n" 13538 " int i = 5;\n" 13539 " }\n" 13540 "#ifdef _DEBUG\n" 13541 "void bar()\n" 13542 " {\n" 13543 " }\n" 13544 "#else\n" 13545 "void bar()\n" 13546 " {\n" 13547 " foobar();\n" 13548 " }\n" 13549 "#endif", 13550 WhitesmithsBraceStyle); 13551 13552 // This shouldn't affect ObjC blocks.. 13553 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 13554 " // ...\n" 13555 " int i;\n" 13556 "}];", 13557 WhitesmithsBraceStyle); 13558 verifyFormat("void (^block)(void) = ^{\n" 13559 " // ...\n" 13560 " int i;\n" 13561 "};", 13562 WhitesmithsBraceStyle); 13563 // .. or dict literals. 13564 verifyFormat("void f()\n" 13565 " {\n" 13566 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 13567 " }", 13568 WhitesmithsBraceStyle); 13569 13570 verifyFormat("int f()\n" 13571 " { // comment\n" 13572 " return 42;\n" 13573 " }", 13574 WhitesmithsBraceStyle); 13575 13576 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 13577 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 13578 FormatStyle::SIS_Always; 13579 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 13580 verifyFormat("void f(bool b)\n" 13581 " {\n" 13582 " if (b)\n" 13583 " {\n" 13584 " return;\n" 13585 " }\n" 13586 " }\n", 13587 BreakBeforeBraceShortIfs); 13588 verifyFormat("void f(bool b)\n" 13589 " {\n" 13590 " if (b) return;\n" 13591 " }\n", 13592 BreakBeforeBraceShortIfs); 13593 verifyFormat("void f(bool b)\n" 13594 " {\n" 13595 " while (b)\n" 13596 " {\n" 13597 " return;\n" 13598 " }\n" 13599 " }\n", 13600 BreakBeforeBraceShortIfs); 13601 } 13602 13603 TEST_F(FormatTest, GNUBraceBreaking) { 13604 FormatStyle GNUBraceStyle = getLLVMStyle(); 13605 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 13606 verifyFormat("namespace a\n" 13607 "{\n" 13608 "class A\n" 13609 "{\n" 13610 " void f()\n" 13611 " {\n" 13612 " int a;\n" 13613 " {\n" 13614 " int b;\n" 13615 " }\n" 13616 " if (true)\n" 13617 " {\n" 13618 " a();\n" 13619 " b();\n" 13620 " }\n" 13621 " }\n" 13622 " void g() { return; }\n" 13623 "}\n" 13624 "} // namespace a", 13625 GNUBraceStyle); 13626 13627 verifyFormat("void f()\n" 13628 "{\n" 13629 " if (true)\n" 13630 " {\n" 13631 " a();\n" 13632 " }\n" 13633 " else if (false)\n" 13634 " {\n" 13635 " b();\n" 13636 " }\n" 13637 " else\n" 13638 " {\n" 13639 " c();\n" 13640 " }\n" 13641 "}\n", 13642 GNUBraceStyle); 13643 13644 verifyFormat("void f()\n" 13645 "{\n" 13646 " for (int i = 0; i < 10; ++i)\n" 13647 " {\n" 13648 " a();\n" 13649 " }\n" 13650 " while (false)\n" 13651 " {\n" 13652 " b();\n" 13653 " }\n" 13654 " do\n" 13655 " {\n" 13656 " c();\n" 13657 " }\n" 13658 " while (false);\n" 13659 "}\n", 13660 GNUBraceStyle); 13661 13662 verifyFormat("void f(int a)\n" 13663 "{\n" 13664 " switch (a)\n" 13665 " {\n" 13666 " case 0:\n" 13667 " break;\n" 13668 " case 1:\n" 13669 " {\n" 13670 " break;\n" 13671 " }\n" 13672 " case 2:\n" 13673 " {\n" 13674 " }\n" 13675 " break;\n" 13676 " default:\n" 13677 " break;\n" 13678 " }\n" 13679 "}\n", 13680 GNUBraceStyle); 13681 13682 verifyFormat("enum X\n" 13683 "{\n" 13684 " Y = 0,\n" 13685 "}\n", 13686 GNUBraceStyle); 13687 13688 verifyFormat("@interface BSApplicationController ()\n" 13689 "{\n" 13690 "@private\n" 13691 " id _extraIvar;\n" 13692 "}\n" 13693 "@end\n", 13694 GNUBraceStyle); 13695 13696 verifyFormat("#ifdef _DEBUG\n" 13697 "int foo(int i = 0)\n" 13698 "#else\n" 13699 "int foo(int i = 5)\n" 13700 "#endif\n" 13701 "{\n" 13702 " return i;\n" 13703 "}", 13704 GNUBraceStyle); 13705 13706 verifyFormat("void foo() {}\n" 13707 "void bar()\n" 13708 "#ifdef _DEBUG\n" 13709 "{\n" 13710 " foo();\n" 13711 "}\n" 13712 "#else\n" 13713 "{\n" 13714 "}\n" 13715 "#endif", 13716 GNUBraceStyle); 13717 13718 verifyFormat("void foobar() { int i = 5; }\n" 13719 "#ifdef _DEBUG\n" 13720 "void bar() {}\n" 13721 "#else\n" 13722 "void bar() { foobar(); }\n" 13723 "#endif", 13724 GNUBraceStyle); 13725 } 13726 13727 TEST_F(FormatTest, WebKitBraceBreaking) { 13728 FormatStyle WebKitBraceStyle = getLLVMStyle(); 13729 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 13730 WebKitBraceStyle.FixNamespaceComments = false; 13731 verifyFormat("namespace a {\n" 13732 "class A {\n" 13733 " void f()\n" 13734 " {\n" 13735 " if (true) {\n" 13736 " a();\n" 13737 " b();\n" 13738 " }\n" 13739 " }\n" 13740 " void g() { return; }\n" 13741 "};\n" 13742 "enum E {\n" 13743 " A,\n" 13744 " // foo\n" 13745 " B,\n" 13746 " C\n" 13747 "};\n" 13748 "struct B {\n" 13749 " int x;\n" 13750 "};\n" 13751 "}\n", 13752 WebKitBraceStyle); 13753 verifyFormat("struct S {\n" 13754 " int Type;\n" 13755 " union {\n" 13756 " int x;\n" 13757 " double y;\n" 13758 " } Value;\n" 13759 " class C {\n" 13760 " MyFavoriteType Value;\n" 13761 " } Class;\n" 13762 "};\n", 13763 WebKitBraceStyle); 13764 } 13765 13766 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 13767 verifyFormat("void f() {\n" 13768 " try {\n" 13769 " } catch (const Exception &e) {\n" 13770 " }\n" 13771 "}\n", 13772 getLLVMStyle()); 13773 } 13774 13775 TEST_F(FormatTest, UnderstandsPragmas) { 13776 verifyFormat("#pragma omp reduction(| : var)"); 13777 verifyFormat("#pragma omp reduction(+ : var)"); 13778 13779 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 13780 "(including parentheses).", 13781 format("#pragma mark Any non-hyphenated or hyphenated string " 13782 "(including parentheses).")); 13783 } 13784 13785 TEST_F(FormatTest, UnderstandPragmaOption) { 13786 verifyFormat("#pragma option -C -A"); 13787 13788 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 13789 } 13790 13791 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 13792 FormatStyle Style = getLLVMStyle(); 13793 Style.ColumnLimit = 20; 13794 13795 // See PR41213 13796 EXPECT_EQ("/*\n" 13797 " *\t9012345\n" 13798 " * /8901\n" 13799 " */", 13800 format("/*\n" 13801 " *\t9012345 /8901\n" 13802 " */", 13803 Style)); 13804 EXPECT_EQ("/*\n" 13805 " *345678\n" 13806 " *\t/8901\n" 13807 " */", 13808 format("/*\n" 13809 " *345678\t/8901\n" 13810 " */", 13811 Style)); 13812 13813 verifyFormat("int a; // the\n" 13814 " // comment", 13815 Style); 13816 EXPECT_EQ("int a; /* first line\n" 13817 " * second\n" 13818 " * line third\n" 13819 " * line\n" 13820 " */", 13821 format("int a; /* first line\n" 13822 " * second\n" 13823 " * line third\n" 13824 " * line\n" 13825 " */", 13826 Style)); 13827 EXPECT_EQ("int a; // first line\n" 13828 " // second\n" 13829 " // line third\n" 13830 " // line", 13831 format("int a; // first line\n" 13832 " // second line\n" 13833 " // third line", 13834 Style)); 13835 13836 Style.PenaltyExcessCharacter = 90; 13837 verifyFormat("int a; // the comment", Style); 13838 EXPECT_EQ("int a; // the comment\n" 13839 " // aaa", 13840 format("int a; // the comment aaa", Style)); 13841 EXPECT_EQ("int a; /* first line\n" 13842 " * second line\n" 13843 " * third line\n" 13844 " */", 13845 format("int a; /* first line\n" 13846 " * second line\n" 13847 " * third line\n" 13848 " */", 13849 Style)); 13850 EXPECT_EQ("int a; // first line\n" 13851 " // second line\n" 13852 " // third line", 13853 format("int a; // first line\n" 13854 " // second line\n" 13855 " // third line", 13856 Style)); 13857 // FIXME: Investigate why this is not getting the same layout as the test 13858 // above. 13859 EXPECT_EQ("int a; /* first line\n" 13860 " * second line\n" 13861 " * third line\n" 13862 " */", 13863 format("int a; /* first line second line third line" 13864 "\n*/", 13865 Style)); 13866 13867 EXPECT_EQ("// foo bar baz bazfoo\n" 13868 "// foo bar foo bar\n", 13869 format("// foo bar baz bazfoo\n" 13870 "// foo bar foo bar\n", 13871 Style)); 13872 EXPECT_EQ("// foo bar baz bazfoo\n" 13873 "// foo bar foo bar\n", 13874 format("// foo bar baz bazfoo\n" 13875 "// foo bar foo bar\n", 13876 Style)); 13877 13878 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 13879 // next one. 13880 EXPECT_EQ("// foo bar baz bazfoo\n" 13881 "// bar foo bar\n", 13882 format("// foo bar baz bazfoo bar\n" 13883 "// foo bar\n", 13884 Style)); 13885 13886 EXPECT_EQ("// foo bar baz bazfoo\n" 13887 "// foo bar baz bazfoo\n" 13888 "// bar foo bar\n", 13889 format("// foo bar baz bazfoo\n" 13890 "// foo bar baz bazfoo bar\n" 13891 "// foo bar\n", 13892 Style)); 13893 13894 EXPECT_EQ("// foo bar baz bazfoo\n" 13895 "// foo bar baz bazfoo\n" 13896 "// bar foo bar\n", 13897 format("// foo bar baz bazfoo\n" 13898 "// foo bar baz bazfoo bar\n" 13899 "// foo bar\n", 13900 Style)); 13901 13902 // Make sure we do not keep protruding characters if strict mode reflow is 13903 // cheaper than keeping protruding characters. 13904 Style.ColumnLimit = 21; 13905 EXPECT_EQ( 13906 "// foo foo foo foo\n" 13907 "// foo foo foo foo\n" 13908 "// foo foo foo foo\n", 13909 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 13910 13911 EXPECT_EQ("int a = /* long block\n" 13912 " comment */\n" 13913 " 42;", 13914 format("int a = /* long block comment */ 42;", Style)); 13915 } 13916 13917 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 13918 for (size_t i = 1; i < Styles.size(); ++i) \ 13919 EXPECT_EQ(Styles[0], Styles[i]) \ 13920 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 13921 13922 TEST_F(FormatTest, GetsPredefinedStyleByName) { 13923 SmallVector<FormatStyle, 3> Styles; 13924 Styles.resize(3); 13925 13926 Styles[0] = getLLVMStyle(); 13927 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 13928 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 13929 EXPECT_ALL_STYLES_EQUAL(Styles); 13930 13931 Styles[0] = getGoogleStyle(); 13932 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 13933 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 13934 EXPECT_ALL_STYLES_EQUAL(Styles); 13935 13936 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 13937 EXPECT_TRUE( 13938 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 13939 EXPECT_TRUE( 13940 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 13941 EXPECT_ALL_STYLES_EQUAL(Styles); 13942 13943 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 13944 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 13945 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 13946 EXPECT_ALL_STYLES_EQUAL(Styles); 13947 13948 Styles[0] = getMozillaStyle(); 13949 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 13950 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 13951 EXPECT_ALL_STYLES_EQUAL(Styles); 13952 13953 Styles[0] = getWebKitStyle(); 13954 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 13955 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 13956 EXPECT_ALL_STYLES_EQUAL(Styles); 13957 13958 Styles[0] = getGNUStyle(); 13959 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 13960 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 13961 EXPECT_ALL_STYLES_EQUAL(Styles); 13962 13963 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 13964 } 13965 13966 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 13967 SmallVector<FormatStyle, 8> Styles; 13968 Styles.resize(2); 13969 13970 Styles[0] = getGoogleStyle(); 13971 Styles[1] = getLLVMStyle(); 13972 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 13973 EXPECT_ALL_STYLES_EQUAL(Styles); 13974 13975 Styles.resize(5); 13976 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 13977 Styles[1] = getLLVMStyle(); 13978 Styles[1].Language = FormatStyle::LK_JavaScript; 13979 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 13980 13981 Styles[2] = getLLVMStyle(); 13982 Styles[2].Language = FormatStyle::LK_JavaScript; 13983 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 13984 "BasedOnStyle: Google", 13985 &Styles[2]) 13986 .value()); 13987 13988 Styles[3] = getLLVMStyle(); 13989 Styles[3].Language = FormatStyle::LK_JavaScript; 13990 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 13991 "Language: JavaScript", 13992 &Styles[3]) 13993 .value()); 13994 13995 Styles[4] = getLLVMStyle(); 13996 Styles[4].Language = FormatStyle::LK_JavaScript; 13997 EXPECT_EQ(0, parseConfiguration("---\n" 13998 "BasedOnStyle: LLVM\n" 13999 "IndentWidth: 123\n" 14000 "---\n" 14001 "BasedOnStyle: Google\n" 14002 "Language: JavaScript", 14003 &Styles[4]) 14004 .value()); 14005 EXPECT_ALL_STYLES_EQUAL(Styles); 14006 } 14007 14008 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 14009 Style.FIELD = false; \ 14010 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 14011 EXPECT_TRUE(Style.FIELD); \ 14012 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 14013 EXPECT_FALSE(Style.FIELD); 14014 14015 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 14016 14017 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 14018 Style.STRUCT.FIELD = false; \ 14019 EXPECT_EQ(0, \ 14020 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 14021 .value()); \ 14022 EXPECT_TRUE(Style.STRUCT.FIELD); \ 14023 EXPECT_EQ(0, \ 14024 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 14025 .value()); \ 14026 EXPECT_FALSE(Style.STRUCT.FIELD); 14027 14028 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 14029 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 14030 14031 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 14032 EXPECT_NE(VALUE, Style.FIELD) << "Initial value already the same!"; \ 14033 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 14034 EXPECT_EQ(VALUE, Style.FIELD) << "Unexpected value after parsing!" 14035 14036 TEST_F(FormatTest, ParsesConfigurationBools) { 14037 FormatStyle Style = {}; 14038 Style.Language = FormatStyle::LK_Cpp; 14039 CHECK_PARSE_BOOL(AlignTrailingComments); 14040 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 14041 CHECK_PARSE_BOOL(AlignConsecutiveBitFields); 14042 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 14043 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 14044 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 14045 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 14046 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 14047 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 14048 CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine); 14049 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 14050 CHECK_PARSE_BOOL(BinPackArguments); 14051 CHECK_PARSE_BOOL(BinPackParameters); 14052 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 14053 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 14054 CHECK_PARSE_BOOL(BreakStringLiterals); 14055 CHECK_PARSE_BOOL(CompactNamespaces); 14056 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 14057 CHECK_PARSE_BOOL(DeriveLineEnding); 14058 CHECK_PARSE_BOOL(DerivePointerAlignment); 14059 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 14060 CHECK_PARSE_BOOL(DisableFormat); 14061 CHECK_PARSE_BOOL(IndentCaseLabels); 14062 CHECK_PARSE_BOOL(IndentCaseBlocks); 14063 CHECK_PARSE_BOOL(IndentGotoLabels); 14064 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 14065 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 14066 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 14067 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 14068 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 14069 CHECK_PARSE_BOOL(ReflowComments); 14070 CHECK_PARSE_BOOL(SortIncludes); 14071 CHECK_PARSE_BOOL(SortUsingDeclarations); 14072 CHECK_PARSE_BOOL(SpacesInParentheses); 14073 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 14074 CHECK_PARSE_BOOL(SpacesInAngles); 14075 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 14076 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 14077 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 14078 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 14079 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 14080 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 14081 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 14082 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 14083 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 14084 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 14085 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 14086 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 14087 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 14088 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 14089 CHECK_PARSE_BOOL(UseCRLF); 14090 14091 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 14092 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 14093 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 14094 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 14095 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 14096 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 14097 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 14098 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 14099 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 14100 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 14101 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 14102 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody); 14103 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile); 14104 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 14105 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 14106 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 14107 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 14108 } 14109 14110 #undef CHECK_PARSE_BOOL 14111 14112 TEST_F(FormatTest, ParsesConfiguration) { 14113 FormatStyle Style = {}; 14114 Style.Language = FormatStyle::LK_Cpp; 14115 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 14116 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 14117 ConstructorInitializerIndentWidth, 1234u); 14118 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 14119 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 14120 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 14121 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 14122 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 14123 PenaltyBreakBeforeFirstCallParameter, 1234u); 14124 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 14125 PenaltyBreakTemplateDeclaration, 1234u); 14126 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 14127 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 14128 PenaltyReturnTypeOnItsOwnLine, 1234u); 14129 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 14130 SpacesBeforeTrailingComments, 1234u); 14131 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 14132 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 14133 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 14134 14135 Style.PointerAlignment = FormatStyle::PAS_Middle; 14136 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 14137 FormatStyle::PAS_Left); 14138 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 14139 FormatStyle::PAS_Right); 14140 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 14141 FormatStyle::PAS_Middle); 14142 // For backward compatibility: 14143 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 14144 FormatStyle::PAS_Left); 14145 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 14146 FormatStyle::PAS_Right); 14147 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 14148 FormatStyle::PAS_Middle); 14149 14150 Style.Standard = FormatStyle::LS_Auto; 14151 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 14152 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 14153 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 14154 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 14155 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 14156 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 14157 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 14158 // Legacy aliases: 14159 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 14160 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 14161 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 14162 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 14163 14164 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 14165 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 14166 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 14167 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 14168 FormatStyle::BOS_None); 14169 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 14170 FormatStyle::BOS_All); 14171 // For backward compatibility: 14172 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 14173 FormatStyle::BOS_None); 14174 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 14175 FormatStyle::BOS_All); 14176 14177 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 14178 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 14179 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 14180 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 14181 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 14182 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 14183 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 14184 // For backward compatibility: 14185 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 14186 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 14187 14188 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 14189 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 14190 FormatStyle::BILS_BeforeComma); 14191 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 14192 FormatStyle::BILS_AfterColon); 14193 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 14194 FormatStyle::BILS_BeforeColon); 14195 // For backward compatibility: 14196 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 14197 FormatStyle::BILS_BeforeComma); 14198 14199 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 14200 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 14201 FormatStyle::BAS_Align); 14202 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 14203 FormatStyle::BAS_DontAlign); 14204 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 14205 FormatStyle::BAS_AlwaysBreak); 14206 // For backward compatibility: 14207 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 14208 FormatStyle::BAS_DontAlign); 14209 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 14210 FormatStyle::BAS_Align); 14211 14212 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 14213 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 14214 FormatStyle::ENAS_DontAlign); 14215 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 14216 FormatStyle::ENAS_Left); 14217 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 14218 FormatStyle::ENAS_Right); 14219 // For backward compatibility: 14220 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 14221 FormatStyle::ENAS_Left); 14222 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 14223 FormatStyle::ENAS_Right); 14224 14225 Style.AlignOperands = FormatStyle::OAS_Align; 14226 CHECK_PARSE("AlignOperands: DontAlign", AlignOperands, 14227 FormatStyle::OAS_DontAlign); 14228 CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align); 14229 CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands, 14230 FormatStyle::OAS_AlignAfterOperator); 14231 // For backward compatibility: 14232 CHECK_PARSE("AlignOperands: false", AlignOperands, 14233 FormatStyle::OAS_DontAlign); 14234 CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align); 14235 14236 Style.UseTab = FormatStyle::UT_ForIndentation; 14237 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 14238 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 14239 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 14240 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 14241 FormatStyle::UT_ForContinuationAndIndentation); 14242 CHECK_PARSE("UseTab: AlignWithSpaces", UseTab, 14243 FormatStyle::UT_AlignWithSpaces); 14244 // For backward compatibility: 14245 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 14246 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 14247 14248 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 14249 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 14250 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 14251 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 14252 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 14253 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 14254 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 14255 // For backward compatibility: 14256 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 14257 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 14258 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 14259 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 14260 14261 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 14262 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 14263 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 14264 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 14265 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 14266 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 14267 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 14268 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 14269 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 14270 // For backward compatibility: 14271 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 14272 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 14273 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 14274 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 14275 14276 Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Both; 14277 CHECK_PARSE("SpaceAroundPointerQualifiers: Default", 14278 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Default); 14279 CHECK_PARSE("SpaceAroundPointerQualifiers: Before", 14280 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Before); 14281 CHECK_PARSE("SpaceAroundPointerQualifiers: After", 14282 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_After); 14283 CHECK_PARSE("SpaceAroundPointerQualifiers: Both", 14284 SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both); 14285 14286 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 14287 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 14288 FormatStyle::SBPO_Never); 14289 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 14290 FormatStyle::SBPO_Always); 14291 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 14292 FormatStyle::SBPO_ControlStatements); 14293 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 14294 FormatStyle::SBPO_NonEmptyParentheses); 14295 // For backward compatibility: 14296 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 14297 FormatStyle::SBPO_Never); 14298 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 14299 FormatStyle::SBPO_ControlStatements); 14300 14301 Style.ColumnLimit = 123; 14302 FormatStyle BaseStyle = getLLVMStyle(); 14303 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 14304 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 14305 14306 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 14307 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 14308 FormatStyle::BS_Attach); 14309 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 14310 FormatStyle::BS_Linux); 14311 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 14312 FormatStyle::BS_Mozilla); 14313 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 14314 FormatStyle::BS_Stroustrup); 14315 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 14316 FormatStyle::BS_Allman); 14317 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 14318 FormatStyle::BS_Whitesmiths); 14319 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 14320 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 14321 FormatStyle::BS_WebKit); 14322 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 14323 FormatStyle::BS_Custom); 14324 14325 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 14326 CHECK_PARSE("BraceWrapping:\n" 14327 " AfterControlStatement: MultiLine", 14328 BraceWrapping.AfterControlStatement, 14329 FormatStyle::BWACS_MultiLine); 14330 CHECK_PARSE("BraceWrapping:\n" 14331 " AfterControlStatement: Always", 14332 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 14333 CHECK_PARSE("BraceWrapping:\n" 14334 " AfterControlStatement: Never", 14335 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 14336 // For backward compatibility: 14337 CHECK_PARSE("BraceWrapping:\n" 14338 " AfterControlStatement: true", 14339 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 14340 CHECK_PARSE("BraceWrapping:\n" 14341 " AfterControlStatement: false", 14342 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 14343 14344 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 14345 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 14346 FormatStyle::RTBS_None); 14347 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 14348 FormatStyle::RTBS_All); 14349 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 14350 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 14351 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 14352 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 14353 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 14354 AlwaysBreakAfterReturnType, 14355 FormatStyle::RTBS_TopLevelDefinitions); 14356 14357 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 14358 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 14359 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 14360 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 14361 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 14362 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 14363 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 14364 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 14365 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 14366 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 14367 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 14368 14369 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 14370 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 14371 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 14372 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 14373 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 14374 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 14375 AlwaysBreakAfterDefinitionReturnType, 14376 FormatStyle::DRTBS_TopLevel); 14377 14378 Style.NamespaceIndentation = FormatStyle::NI_All; 14379 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 14380 FormatStyle::NI_None); 14381 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 14382 FormatStyle::NI_Inner); 14383 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 14384 FormatStyle::NI_All); 14385 14386 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 14387 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 14388 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 14389 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 14390 AllowShortIfStatementsOnASingleLine, 14391 FormatStyle::SIS_WithoutElse); 14392 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 14393 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 14394 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 14395 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 14396 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 14397 AllowShortIfStatementsOnASingleLine, 14398 FormatStyle::SIS_WithoutElse); 14399 14400 Style.IndentExternBlock = FormatStyle::IEBS_NoIndent; 14401 CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock, 14402 FormatStyle::IEBS_AfterExternBlock); 14403 CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock, 14404 FormatStyle::IEBS_Indent); 14405 CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock, 14406 FormatStyle::IEBS_NoIndent); 14407 CHECK_PARSE("IndentExternBlock: true", IndentExternBlock, 14408 FormatStyle::IEBS_Indent); 14409 CHECK_PARSE("IndentExternBlock: false", IndentExternBlock, 14410 FormatStyle::IEBS_NoIndent); 14411 14412 Style.BitFieldColonSpacing = FormatStyle::BFCS_None; 14413 CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing, 14414 FormatStyle::BFCS_Both); 14415 CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing, 14416 FormatStyle::BFCS_None); 14417 CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing, 14418 FormatStyle::BFCS_Before); 14419 CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing, 14420 FormatStyle::BFCS_After); 14421 14422 Style.SortJavaStaticImport = FormatStyle::SJSIO_Before; 14423 CHECK_PARSE("SortJavaStaticImport: After", SortJavaStaticImport, 14424 FormatStyle::SJSIO_After); 14425 CHECK_PARSE("SortJavaStaticImport: Before", SortJavaStaticImport, 14426 FormatStyle::SJSIO_Before); 14427 14428 // FIXME: This is required because parsing a configuration simply overwrites 14429 // the first N elements of the list instead of resetting it. 14430 Style.ForEachMacros.clear(); 14431 std::vector<std::string> BoostForeach; 14432 BoostForeach.push_back("BOOST_FOREACH"); 14433 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 14434 std::vector<std::string> BoostAndQForeach; 14435 BoostAndQForeach.push_back("BOOST_FOREACH"); 14436 BoostAndQForeach.push_back("Q_FOREACH"); 14437 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 14438 BoostAndQForeach); 14439 14440 Style.AttributeMacros.clear(); 14441 CHECK_PARSE("BasedOnStyle: LLVM", AttributeMacros, 14442 std::vector<std::string>{"__capability"}); 14443 CHECK_PARSE("AttributeMacros: [attr1, attr2]", AttributeMacros, 14444 std::vector<std::string>({"attr1", "attr2"})); 14445 14446 Style.StatementMacros.clear(); 14447 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 14448 std::vector<std::string>{"QUNUSED"}); 14449 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 14450 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 14451 14452 Style.NamespaceMacros.clear(); 14453 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 14454 std::vector<std::string>{"TESTSUITE"}); 14455 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 14456 std::vector<std::string>({"TESTSUITE", "SUITE"})); 14457 14458 Style.WhitespaceSensitiveMacros.clear(); 14459 CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]", 14460 WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"}); 14461 CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]", 14462 WhitespaceSensitiveMacros, 14463 std::vector<std::string>({"STRINGIZE", "ASSERT"})); 14464 Style.WhitespaceSensitiveMacros.clear(); 14465 CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']", 14466 WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"}); 14467 CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']", 14468 WhitespaceSensitiveMacros, 14469 std::vector<std::string>({"STRINGIZE", "ASSERT"})); 14470 14471 Style.IncludeStyle.IncludeCategories.clear(); 14472 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 14473 {"abc/.*", 2, 0}, {".*", 1, 0}}; 14474 CHECK_PARSE("IncludeCategories:\n" 14475 " - Regex: abc/.*\n" 14476 " Priority: 2\n" 14477 " - Regex: .*\n" 14478 " Priority: 1", 14479 IncludeStyle.IncludeCategories, ExpectedCategories); 14480 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 14481 "abc$"); 14482 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 14483 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 14484 14485 Style.RawStringFormats.clear(); 14486 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 14487 { 14488 FormatStyle::LK_TextProto, 14489 {"pb", "proto"}, 14490 {"PARSE_TEXT_PROTO"}, 14491 /*CanonicalDelimiter=*/"", 14492 "llvm", 14493 }, 14494 { 14495 FormatStyle::LK_Cpp, 14496 {"cc", "cpp"}, 14497 {"C_CODEBLOCK", "CPPEVAL"}, 14498 /*CanonicalDelimiter=*/"cc", 14499 /*BasedOnStyle=*/"", 14500 }, 14501 }; 14502 14503 CHECK_PARSE("RawStringFormats:\n" 14504 " - Language: TextProto\n" 14505 " Delimiters:\n" 14506 " - 'pb'\n" 14507 " - 'proto'\n" 14508 " EnclosingFunctions:\n" 14509 " - 'PARSE_TEXT_PROTO'\n" 14510 " BasedOnStyle: llvm\n" 14511 " - Language: Cpp\n" 14512 " Delimiters:\n" 14513 " - 'cc'\n" 14514 " - 'cpp'\n" 14515 " EnclosingFunctions:\n" 14516 " - 'C_CODEBLOCK'\n" 14517 " - 'CPPEVAL'\n" 14518 " CanonicalDelimiter: 'cc'", 14519 RawStringFormats, ExpectedRawStringFormats); 14520 } 14521 14522 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 14523 FormatStyle Style = {}; 14524 Style.Language = FormatStyle::LK_Cpp; 14525 CHECK_PARSE("Language: Cpp\n" 14526 "IndentWidth: 12", 14527 IndentWidth, 12u); 14528 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 14529 "IndentWidth: 34", 14530 &Style), 14531 ParseError::Unsuitable); 14532 FormatStyle BinPackedTCS = {}; 14533 BinPackedTCS.Language = FormatStyle::LK_JavaScript; 14534 EXPECT_EQ(parseConfiguration("BinPackArguments: true\n" 14535 "InsertTrailingCommas: Wrapped", 14536 &BinPackedTCS), 14537 ParseError::BinPackTrailingCommaConflict); 14538 EXPECT_EQ(12u, Style.IndentWidth); 14539 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 14540 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14541 14542 Style.Language = FormatStyle::LK_JavaScript; 14543 CHECK_PARSE("Language: JavaScript\n" 14544 "IndentWidth: 12", 14545 IndentWidth, 12u); 14546 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 14547 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 14548 "IndentWidth: 34", 14549 &Style), 14550 ParseError::Unsuitable); 14551 EXPECT_EQ(23u, Style.IndentWidth); 14552 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 14553 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14554 14555 CHECK_PARSE("BasedOnStyle: LLVM\n" 14556 "IndentWidth: 67", 14557 IndentWidth, 67u); 14558 14559 CHECK_PARSE("---\n" 14560 "Language: JavaScript\n" 14561 "IndentWidth: 12\n" 14562 "---\n" 14563 "Language: Cpp\n" 14564 "IndentWidth: 34\n" 14565 "...\n", 14566 IndentWidth, 12u); 14567 14568 Style.Language = FormatStyle::LK_Cpp; 14569 CHECK_PARSE("---\n" 14570 "Language: JavaScript\n" 14571 "IndentWidth: 12\n" 14572 "---\n" 14573 "Language: Cpp\n" 14574 "IndentWidth: 34\n" 14575 "...\n", 14576 IndentWidth, 34u); 14577 CHECK_PARSE("---\n" 14578 "IndentWidth: 78\n" 14579 "---\n" 14580 "Language: JavaScript\n" 14581 "IndentWidth: 56\n" 14582 "...\n", 14583 IndentWidth, 78u); 14584 14585 Style.ColumnLimit = 123; 14586 Style.IndentWidth = 234; 14587 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 14588 Style.TabWidth = 345; 14589 EXPECT_FALSE(parseConfiguration("---\n" 14590 "IndentWidth: 456\n" 14591 "BreakBeforeBraces: Allman\n" 14592 "---\n" 14593 "Language: JavaScript\n" 14594 "IndentWidth: 111\n" 14595 "TabWidth: 111\n" 14596 "---\n" 14597 "Language: Cpp\n" 14598 "BreakBeforeBraces: Stroustrup\n" 14599 "TabWidth: 789\n" 14600 "...\n", 14601 &Style)); 14602 EXPECT_EQ(123u, Style.ColumnLimit); 14603 EXPECT_EQ(456u, Style.IndentWidth); 14604 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 14605 EXPECT_EQ(789u, Style.TabWidth); 14606 14607 EXPECT_EQ(parseConfiguration("---\n" 14608 "Language: JavaScript\n" 14609 "IndentWidth: 56\n" 14610 "---\n" 14611 "IndentWidth: 78\n" 14612 "...\n", 14613 &Style), 14614 ParseError::Error); 14615 EXPECT_EQ(parseConfiguration("---\n" 14616 "Language: JavaScript\n" 14617 "IndentWidth: 56\n" 14618 "---\n" 14619 "Language: JavaScript\n" 14620 "IndentWidth: 78\n" 14621 "...\n", 14622 &Style), 14623 ParseError::Error); 14624 14625 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14626 } 14627 14628 #undef CHECK_PARSE 14629 14630 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 14631 FormatStyle Style = {}; 14632 Style.Language = FormatStyle::LK_JavaScript; 14633 Style.BreakBeforeTernaryOperators = true; 14634 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 14635 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14636 14637 Style.BreakBeforeTernaryOperators = true; 14638 EXPECT_EQ(0, parseConfiguration("---\n" 14639 "BasedOnStyle: Google\n" 14640 "---\n" 14641 "Language: JavaScript\n" 14642 "IndentWidth: 76\n" 14643 "...\n", 14644 &Style) 14645 .value()); 14646 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14647 EXPECT_EQ(76u, Style.IndentWidth); 14648 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14649 } 14650 14651 TEST_F(FormatTest, ConfigurationRoundTripTest) { 14652 FormatStyle Style = getLLVMStyle(); 14653 std::string YAML = configurationAsText(Style); 14654 FormatStyle ParsedStyle = {}; 14655 ParsedStyle.Language = FormatStyle::LK_Cpp; 14656 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 14657 EXPECT_EQ(Style, ParsedStyle); 14658 } 14659 14660 TEST_F(FormatTest, WorksFor8bitEncodings) { 14661 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 14662 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 14663 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 14664 "\"\xef\xee\xf0\xf3...\"", 14665 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 14666 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 14667 "\xef\xee\xf0\xf3...\"", 14668 getLLVMStyleWithColumns(12))); 14669 } 14670 14671 TEST_F(FormatTest, HandlesUTF8BOM) { 14672 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 14673 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 14674 format("\xef\xbb\xbf#include <iostream>")); 14675 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 14676 format("\xef\xbb\xbf\n#include <iostream>")); 14677 } 14678 14679 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 14680 #if !defined(_MSC_VER) 14681 14682 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 14683 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 14684 getLLVMStyleWithColumns(35)); 14685 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 14686 getLLVMStyleWithColumns(31)); 14687 verifyFormat("// Однажды в студёную зимнюю пору...", 14688 getLLVMStyleWithColumns(36)); 14689 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 14690 verifyFormat("/* Однажды в студёную зимнюю пору... */", 14691 getLLVMStyleWithColumns(39)); 14692 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 14693 getLLVMStyleWithColumns(35)); 14694 } 14695 14696 TEST_F(FormatTest, SplitsUTF8Strings) { 14697 // Non-printable characters' width is currently considered to be the length in 14698 // bytes in UTF8. The characters can be displayed in very different manner 14699 // (zero-width, single width with a substitution glyph, expanded to their code 14700 // (e.g. "<8d>"), so there's no single correct way to handle them. 14701 EXPECT_EQ("\"aaaaÄ\"\n" 14702 "\"\xc2\x8d\";", 14703 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14704 EXPECT_EQ("\"aaaaaaaÄ\"\n" 14705 "\"\xc2\x8d\";", 14706 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14707 EXPECT_EQ("\"Однажды, в \"\n" 14708 "\"студёную \"\n" 14709 "\"зимнюю \"\n" 14710 "\"пору,\"", 14711 format("\"Однажды, в студёную зимнюю пору,\"", 14712 getLLVMStyleWithColumns(13))); 14713 EXPECT_EQ( 14714 "\"一 二 三 \"\n" 14715 "\"四 五六 \"\n" 14716 "\"七 八 九 \"\n" 14717 "\"十\"", 14718 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 14719 EXPECT_EQ("\"一\t\"\n" 14720 "\"二 \t\"\n" 14721 "\"三 四 \"\n" 14722 "\"五\t\"\n" 14723 "\"六 \t\"\n" 14724 "\"七 \"\n" 14725 "\"八九十\tqq\"", 14726 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 14727 getLLVMStyleWithColumns(11))); 14728 14729 // UTF8 character in an escape sequence. 14730 EXPECT_EQ("\"aaaaaa\"\n" 14731 "\"\\\xC2\x8D\"", 14732 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 14733 } 14734 14735 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 14736 EXPECT_EQ("const char *sssss =\n" 14737 " \"一二三四五六七八\\\n" 14738 " 九 十\";", 14739 format("const char *sssss = \"一二三四五六七八\\\n" 14740 " 九 十\";", 14741 getLLVMStyleWithColumns(30))); 14742 } 14743 14744 TEST_F(FormatTest, SplitsUTF8LineComments) { 14745 EXPECT_EQ("// aaaaÄ\xc2\x8d", 14746 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 14747 EXPECT_EQ("// Я из лесу\n" 14748 "// вышел; был\n" 14749 "// сильный\n" 14750 "// мороз.", 14751 format("// Я из лесу вышел; был сильный мороз.", 14752 getLLVMStyleWithColumns(13))); 14753 EXPECT_EQ("// 一二三\n" 14754 "// 四五六七\n" 14755 "// 八 九\n" 14756 "// 十", 14757 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 14758 } 14759 14760 TEST_F(FormatTest, SplitsUTF8BlockComments) { 14761 EXPECT_EQ("/* Гляжу,\n" 14762 " * поднимается\n" 14763 " * медленно в\n" 14764 " * гору\n" 14765 " * Лошадка,\n" 14766 " * везущая\n" 14767 " * хворосту\n" 14768 " * воз. */", 14769 format("/* Гляжу, поднимается медленно в гору\n" 14770 " * Лошадка, везущая хворосту воз. */", 14771 getLLVMStyleWithColumns(13))); 14772 EXPECT_EQ( 14773 "/* 一二三\n" 14774 " * 四五六七\n" 14775 " * 八 九\n" 14776 " * 十 */", 14777 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 14778 EXPECT_EQ("/* \n" 14779 " * \n" 14780 " * - */", 14781 format("/* - */", getLLVMStyleWithColumns(12))); 14782 } 14783 14784 #endif // _MSC_VER 14785 14786 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 14787 FormatStyle Style = getLLVMStyle(); 14788 14789 Style.ConstructorInitializerIndentWidth = 4; 14790 verifyFormat( 14791 "SomeClass::Constructor()\n" 14792 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14793 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14794 Style); 14795 14796 Style.ConstructorInitializerIndentWidth = 2; 14797 verifyFormat( 14798 "SomeClass::Constructor()\n" 14799 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14800 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14801 Style); 14802 14803 Style.ConstructorInitializerIndentWidth = 0; 14804 verifyFormat( 14805 "SomeClass::Constructor()\n" 14806 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14807 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14808 Style); 14809 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 14810 verifyFormat( 14811 "SomeLongTemplateVariableName<\n" 14812 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 14813 Style); 14814 verifyFormat("bool smaller = 1 < " 14815 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 14816 " " 14817 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 14818 Style); 14819 14820 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 14821 verifyFormat("SomeClass::Constructor() :\n" 14822 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 14823 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 14824 Style); 14825 } 14826 14827 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 14828 FormatStyle Style = getLLVMStyle(); 14829 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 14830 Style.ConstructorInitializerIndentWidth = 4; 14831 verifyFormat("SomeClass::Constructor()\n" 14832 " : a(a)\n" 14833 " , b(b)\n" 14834 " , c(c) {}", 14835 Style); 14836 verifyFormat("SomeClass::Constructor()\n" 14837 " : a(a) {}", 14838 Style); 14839 14840 Style.ColumnLimit = 0; 14841 verifyFormat("SomeClass::Constructor()\n" 14842 " : a(a) {}", 14843 Style); 14844 verifyFormat("SomeClass::Constructor() noexcept\n" 14845 " : a(a) {}", 14846 Style); 14847 verifyFormat("SomeClass::Constructor()\n" 14848 " : a(a)\n" 14849 " , b(b)\n" 14850 " , c(c) {}", 14851 Style); 14852 verifyFormat("SomeClass::Constructor()\n" 14853 " : a(a) {\n" 14854 " foo();\n" 14855 " bar();\n" 14856 "}", 14857 Style); 14858 14859 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 14860 verifyFormat("SomeClass::Constructor()\n" 14861 " : a(a)\n" 14862 " , b(b)\n" 14863 " , c(c) {\n}", 14864 Style); 14865 verifyFormat("SomeClass::Constructor()\n" 14866 " : a(a) {\n}", 14867 Style); 14868 14869 Style.ColumnLimit = 80; 14870 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 14871 Style.ConstructorInitializerIndentWidth = 2; 14872 verifyFormat("SomeClass::Constructor()\n" 14873 " : a(a)\n" 14874 " , b(b)\n" 14875 " , c(c) {}", 14876 Style); 14877 14878 Style.ConstructorInitializerIndentWidth = 0; 14879 verifyFormat("SomeClass::Constructor()\n" 14880 ": a(a)\n" 14881 ", b(b)\n" 14882 ", c(c) {}", 14883 Style); 14884 14885 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 14886 Style.ConstructorInitializerIndentWidth = 4; 14887 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 14888 verifyFormat( 14889 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 14890 Style); 14891 verifyFormat( 14892 "SomeClass::Constructor()\n" 14893 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 14894 Style); 14895 Style.ConstructorInitializerIndentWidth = 4; 14896 Style.ColumnLimit = 60; 14897 verifyFormat("SomeClass::Constructor()\n" 14898 " : aaaaaaaa(aaaaaaaa)\n" 14899 " , aaaaaaaa(aaaaaaaa)\n" 14900 " , aaaaaaaa(aaaaaaaa) {}", 14901 Style); 14902 } 14903 14904 TEST_F(FormatTest, Destructors) { 14905 verifyFormat("void F(int &i) { i.~int(); }"); 14906 verifyFormat("void F(int &i) { i->~int(); }"); 14907 } 14908 14909 TEST_F(FormatTest, FormatsWithWebKitStyle) { 14910 FormatStyle Style = getWebKitStyle(); 14911 14912 // Don't indent in outer namespaces. 14913 verifyFormat("namespace outer {\n" 14914 "int i;\n" 14915 "namespace inner {\n" 14916 " int i;\n" 14917 "} // namespace inner\n" 14918 "} // namespace outer\n" 14919 "namespace other_outer {\n" 14920 "int i;\n" 14921 "}", 14922 Style); 14923 14924 // Don't indent case labels. 14925 verifyFormat("switch (variable) {\n" 14926 "case 1:\n" 14927 "case 2:\n" 14928 " doSomething();\n" 14929 " break;\n" 14930 "default:\n" 14931 " ++variable;\n" 14932 "}", 14933 Style); 14934 14935 // Wrap before binary operators. 14936 EXPECT_EQ("void f()\n" 14937 "{\n" 14938 " if (aaaaaaaaaaaaaaaa\n" 14939 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 14940 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 14941 " return;\n" 14942 "}", 14943 format("void f() {\n" 14944 "if (aaaaaaaaaaaaaaaa\n" 14945 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 14946 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 14947 "return;\n" 14948 "}", 14949 Style)); 14950 14951 // Allow functions on a single line. 14952 verifyFormat("void f() { return; }", Style); 14953 14954 // Allow empty blocks on a single line and insert a space in empty blocks. 14955 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 14956 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 14957 // However, don't merge non-empty short loops. 14958 EXPECT_EQ("while (true) {\n" 14959 " continue;\n" 14960 "}", 14961 format("while (true) { continue; }", Style)); 14962 14963 // Constructor initializers are formatted one per line with the "," on the 14964 // new line. 14965 verifyFormat("Constructor()\n" 14966 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 14967 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 14968 " aaaaaaaaaaaaaa)\n" 14969 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 14970 "{\n" 14971 "}", 14972 Style); 14973 verifyFormat("SomeClass::Constructor()\n" 14974 " : a(a)\n" 14975 "{\n" 14976 "}", 14977 Style); 14978 EXPECT_EQ("SomeClass::Constructor()\n" 14979 " : a(a)\n" 14980 "{\n" 14981 "}", 14982 format("SomeClass::Constructor():a(a){}", Style)); 14983 verifyFormat("SomeClass::Constructor()\n" 14984 " : a(a)\n" 14985 " , b(b)\n" 14986 " , c(c)\n" 14987 "{\n" 14988 "}", 14989 Style); 14990 verifyFormat("SomeClass::Constructor()\n" 14991 " : a(a)\n" 14992 "{\n" 14993 " foo();\n" 14994 " bar();\n" 14995 "}", 14996 Style); 14997 14998 // Access specifiers should be aligned left. 14999 verifyFormat("class C {\n" 15000 "public:\n" 15001 " int i;\n" 15002 "};", 15003 Style); 15004 15005 // Do not align comments. 15006 verifyFormat("int a; // Do not\n" 15007 "double b; // align comments.", 15008 Style); 15009 15010 // Do not align operands. 15011 EXPECT_EQ("ASSERT(aaaa\n" 15012 " || bbbb);", 15013 format("ASSERT ( aaaa\n||bbbb);", Style)); 15014 15015 // Accept input's line breaks. 15016 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 15017 " || bbbbbbbbbbbbbbb) {\n" 15018 " i++;\n" 15019 "}", 15020 format("if (aaaaaaaaaaaaaaa\n" 15021 "|| bbbbbbbbbbbbbbb) { i++; }", 15022 Style)); 15023 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 15024 " i++;\n" 15025 "}", 15026 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 15027 15028 // Don't automatically break all macro definitions (llvm.org/PR17842). 15029 verifyFormat("#define aNumber 10", Style); 15030 // However, generally keep the line breaks that the user authored. 15031 EXPECT_EQ("#define aNumber \\\n" 15032 " 10", 15033 format("#define aNumber \\\n" 15034 " 10", 15035 Style)); 15036 15037 // Keep empty and one-element array literals on a single line. 15038 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 15039 " copyItems:YES];", 15040 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 15041 "copyItems:YES];", 15042 Style)); 15043 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 15044 " copyItems:YES];", 15045 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 15046 " copyItems:YES];", 15047 Style)); 15048 // FIXME: This does not seem right, there should be more indentation before 15049 // the array literal's entries. Nested blocks have the same problem. 15050 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 15051 " @\"a\",\n" 15052 " @\"a\"\n" 15053 "]\n" 15054 " copyItems:YES];", 15055 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 15056 " @\"a\",\n" 15057 " @\"a\"\n" 15058 " ]\n" 15059 " copyItems:YES];", 15060 Style)); 15061 EXPECT_EQ( 15062 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 15063 " copyItems:YES];", 15064 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 15065 " copyItems:YES];", 15066 Style)); 15067 15068 verifyFormat("[self.a b:c c:d];", Style); 15069 EXPECT_EQ("[self.a b:c\n" 15070 " c:d];", 15071 format("[self.a b:c\n" 15072 "c:d];", 15073 Style)); 15074 } 15075 15076 TEST_F(FormatTest, FormatsLambdas) { 15077 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 15078 verifyFormat( 15079 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 15080 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 15081 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 15082 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 15083 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 15084 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 15085 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 15086 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 15087 verifyFormat("int x = f(*+[] {});"); 15088 verifyFormat("void f() {\n" 15089 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 15090 "}\n"); 15091 verifyFormat("void f() {\n" 15092 " other(x.begin(), //\n" 15093 " x.end(), //\n" 15094 " [&](int, int) { return 1; });\n" 15095 "}\n"); 15096 verifyFormat("void f() {\n" 15097 " other.other.other.other.other(\n" 15098 " x.begin(), x.end(),\n" 15099 " [something, rather](int, int, int, int, int, int, int) { " 15100 "return 1; });\n" 15101 "}\n"); 15102 verifyFormat( 15103 "void f() {\n" 15104 " other.other.other.other.other(\n" 15105 " x.begin(), x.end(),\n" 15106 " [something, rather](int, int, int, int, int, int, int) {\n" 15107 " //\n" 15108 " });\n" 15109 "}\n"); 15110 verifyFormat("SomeFunction([]() { // A cool function...\n" 15111 " return 43;\n" 15112 "});"); 15113 EXPECT_EQ("SomeFunction([]() {\n" 15114 "#define A a\n" 15115 " return 43;\n" 15116 "});", 15117 format("SomeFunction([](){\n" 15118 "#define A a\n" 15119 "return 43;\n" 15120 "});")); 15121 verifyFormat("void f() {\n" 15122 " SomeFunction([](decltype(x), A *a) {});\n" 15123 " SomeFunction([](typeof(x), A *a) {});\n" 15124 " SomeFunction([](_Atomic(x), A *a) {});\n" 15125 " SomeFunction([](__underlying_type(x), A *a) {});\n" 15126 "}"); 15127 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15128 " [](const aaaaaaaaaa &a) { return a; });"); 15129 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 15130 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 15131 "});"); 15132 verifyFormat("Constructor()\n" 15133 " : Field([] { // comment\n" 15134 " int i;\n" 15135 " }) {}"); 15136 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 15137 " return some_parameter.size();\n" 15138 "};"); 15139 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 15140 " [](const string &s) { return s; };"); 15141 verifyFormat("int i = aaaaaa ? 1 //\n" 15142 " : [] {\n" 15143 " return 2; //\n" 15144 " }();"); 15145 verifyFormat("llvm::errs() << \"number of twos is \"\n" 15146 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 15147 " return x == 2; // force break\n" 15148 " });"); 15149 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15150 " [=](int iiiiiiiiiiii) {\n" 15151 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 15152 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 15153 " });", 15154 getLLVMStyleWithColumns(60)); 15155 verifyFormat("SomeFunction({[&] {\n" 15156 " // comment\n" 15157 " },\n" 15158 " [&] {\n" 15159 " // comment\n" 15160 " }});"); 15161 verifyFormat("SomeFunction({[&] {\n" 15162 " // comment\n" 15163 "}});"); 15164 verifyFormat( 15165 "virtual aaaaaaaaaaaaaaaa(\n" 15166 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 15167 " aaaaa aaaaaaaaa);"); 15168 15169 // Lambdas with return types. 15170 verifyFormat("int c = []() -> int { return 2; }();\n"); 15171 verifyFormat("int c = []() -> int * { return 2; }();\n"); 15172 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 15173 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 15174 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 15175 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 15176 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 15177 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 15178 verifyFormat("[a, a]() -> a<1> {};"); 15179 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 15180 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 15181 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 15182 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 15183 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 15184 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 15185 verifyFormat("[]() -> foo<!5> { return {}; };"); 15186 verifyFormat("[]() -> foo<~5> { return {}; };"); 15187 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 15188 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 15189 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 15190 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 15191 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 15192 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 15193 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 15194 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 15195 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 15196 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 15197 verifyFormat("namespace bar {\n" 15198 "// broken:\n" 15199 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 15200 "} // namespace bar"); 15201 verifyFormat("namespace bar {\n" 15202 "// broken:\n" 15203 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 15204 "} // namespace bar"); 15205 verifyFormat("namespace bar {\n" 15206 "// broken:\n" 15207 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 15208 "} // namespace bar"); 15209 verifyFormat("namespace bar {\n" 15210 "// broken:\n" 15211 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 15212 "} // namespace bar"); 15213 verifyFormat("namespace bar {\n" 15214 "// broken:\n" 15215 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 15216 "} // namespace bar"); 15217 verifyFormat("namespace bar {\n" 15218 "// broken:\n" 15219 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 15220 "} // namespace bar"); 15221 verifyFormat("namespace bar {\n" 15222 "// broken:\n" 15223 "auto foo{[]() -> foo<!5> { return {}; }};\n" 15224 "} // namespace bar"); 15225 verifyFormat("namespace bar {\n" 15226 "// broken:\n" 15227 "auto foo{[]() -> foo<~5> { return {}; }};\n" 15228 "} // namespace bar"); 15229 verifyFormat("namespace bar {\n" 15230 "// broken:\n" 15231 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 15232 "} // namespace bar"); 15233 verifyFormat("namespace bar {\n" 15234 "// broken:\n" 15235 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 15236 "} // namespace bar"); 15237 verifyFormat("namespace bar {\n" 15238 "// broken:\n" 15239 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 15240 "} // namespace bar"); 15241 verifyFormat("namespace bar {\n" 15242 "// broken:\n" 15243 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 15244 "} // namespace bar"); 15245 verifyFormat("namespace bar {\n" 15246 "// broken:\n" 15247 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 15248 "} // namespace bar"); 15249 verifyFormat("namespace bar {\n" 15250 "// broken:\n" 15251 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 15252 "} // namespace bar"); 15253 verifyFormat("namespace bar {\n" 15254 "// broken:\n" 15255 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 15256 "} // namespace bar"); 15257 verifyFormat("namespace bar {\n" 15258 "// broken:\n" 15259 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 15260 "} // namespace bar"); 15261 verifyFormat("namespace bar {\n" 15262 "// broken:\n" 15263 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 15264 "} // namespace bar"); 15265 verifyFormat("namespace bar {\n" 15266 "// broken:\n" 15267 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 15268 "} // namespace bar"); 15269 verifyFormat("[]() -> a<1> {};"); 15270 verifyFormat("[]() -> a<1> { ; };"); 15271 verifyFormat("[]() -> a<1> { ; }();"); 15272 verifyFormat("[a, a]() -> a<true> {};"); 15273 verifyFormat("[]() -> a<true> {};"); 15274 verifyFormat("[]() -> a<true> { ; };"); 15275 verifyFormat("[]() -> a<true> { ; }();"); 15276 verifyFormat("[a, a]() -> a<false> {};"); 15277 verifyFormat("[]() -> a<false> {};"); 15278 verifyFormat("[]() -> a<false> { ; };"); 15279 verifyFormat("[]() -> a<false> { ; }();"); 15280 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 15281 verifyFormat("namespace bar {\n" 15282 "auto foo{[]() -> foo<false> { ; }};\n" 15283 "} // namespace bar"); 15284 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 15285 " int j) -> int {\n" 15286 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 15287 "};"); 15288 verifyFormat( 15289 "aaaaaaaaaaaaaaaaaaaaaa(\n" 15290 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 15291 " return aaaaaaaaaaaaaaaaa;\n" 15292 " });", 15293 getLLVMStyleWithColumns(70)); 15294 verifyFormat("[]() //\n" 15295 " -> int {\n" 15296 " return 1; //\n" 15297 "};"); 15298 verifyFormat("[]() -> Void<T...> {};"); 15299 verifyFormat("[a, b]() -> Tuple<T...> { return {}; };"); 15300 15301 // Lambdas with explicit template argument lists. 15302 verifyFormat( 15303 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 15304 15305 // Multiple lambdas in the same parentheses change indentation rules. These 15306 // lambdas are forced to start on new lines. 15307 verifyFormat("SomeFunction(\n" 15308 " []() {\n" 15309 " //\n" 15310 " },\n" 15311 " []() {\n" 15312 " //\n" 15313 " });"); 15314 15315 // A lambda passed as arg0 is always pushed to the next line. 15316 verifyFormat("SomeFunction(\n" 15317 " [this] {\n" 15318 " //\n" 15319 " },\n" 15320 " 1);\n"); 15321 15322 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 15323 // the arg0 case above. 15324 auto Style = getGoogleStyle(); 15325 Style.BinPackArguments = false; 15326 verifyFormat("SomeFunction(\n" 15327 " a,\n" 15328 " [this] {\n" 15329 " //\n" 15330 " },\n" 15331 " b);\n", 15332 Style); 15333 verifyFormat("SomeFunction(\n" 15334 " a,\n" 15335 " [this] {\n" 15336 " //\n" 15337 " },\n" 15338 " b);\n"); 15339 15340 // A lambda with a very long line forces arg0 to be pushed out irrespective of 15341 // the BinPackArguments value (as long as the code is wide enough). 15342 verifyFormat( 15343 "something->SomeFunction(\n" 15344 " a,\n" 15345 " [this] {\n" 15346 " " 15347 "D0000000000000000000000000000000000000000000000000000000000001();\n" 15348 " },\n" 15349 " b);\n"); 15350 15351 // A multi-line lambda is pulled up as long as the introducer fits on the 15352 // previous line and there are no further args. 15353 verifyFormat("function(1, [this, that] {\n" 15354 " //\n" 15355 "});\n"); 15356 verifyFormat("function([this, that] {\n" 15357 " //\n" 15358 "});\n"); 15359 // FIXME: this format is not ideal and we should consider forcing the first 15360 // arg onto its own line. 15361 verifyFormat("function(a, b, c, //\n" 15362 " d, [this, that] {\n" 15363 " //\n" 15364 " });\n"); 15365 15366 // Multiple lambdas are treated correctly even when there is a short arg0. 15367 verifyFormat("SomeFunction(\n" 15368 " 1,\n" 15369 " [this] {\n" 15370 " //\n" 15371 " },\n" 15372 " [this] {\n" 15373 " //\n" 15374 " },\n" 15375 " 1);\n"); 15376 15377 // More complex introducers. 15378 verifyFormat("return [i, args...] {};"); 15379 15380 // Not lambdas. 15381 verifyFormat("constexpr char hello[]{\"hello\"};"); 15382 verifyFormat("double &operator[](int i) { return 0; }\n" 15383 "int i;"); 15384 verifyFormat("std::unique_ptr<int[]> foo() {}"); 15385 verifyFormat("int i = a[a][a]->f();"); 15386 verifyFormat("int i = (*b)[a]->f();"); 15387 15388 // Other corner cases. 15389 verifyFormat("void f() {\n" 15390 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 15391 " );\n" 15392 "}"); 15393 15394 // Lambdas created through weird macros. 15395 verifyFormat("void f() {\n" 15396 " MACRO((const AA &a) { return 1; });\n" 15397 " MACRO((AA &a) { return 1; });\n" 15398 "}"); 15399 15400 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 15401 " doo_dah();\n" 15402 " doo_dah();\n" 15403 " })) {\n" 15404 "}"); 15405 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 15406 " doo_dah();\n" 15407 " doo_dah();\n" 15408 " })) {\n" 15409 "}"); 15410 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 15411 " doo_dah();\n" 15412 " doo_dah();\n" 15413 " })) {\n" 15414 "}"); 15415 verifyFormat("auto lambda = []() {\n" 15416 " int a = 2\n" 15417 "#if A\n" 15418 " + 2\n" 15419 "#endif\n" 15420 " ;\n" 15421 "};"); 15422 15423 // Lambdas with complex multiline introducers. 15424 verifyFormat( 15425 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15426 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 15427 " -> ::std::unordered_set<\n" 15428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 15429 " //\n" 15430 " });"); 15431 15432 FormatStyle DoNotMerge = getLLVMStyle(); 15433 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 15434 verifyFormat("auto c = []() {\n" 15435 " return b;\n" 15436 "};", 15437 "auto c = []() { return b; };", DoNotMerge); 15438 verifyFormat("auto c = []() {\n" 15439 "};", 15440 " auto c = []() {};", DoNotMerge); 15441 15442 FormatStyle MergeEmptyOnly = getLLVMStyle(); 15443 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 15444 verifyFormat("auto c = []() {\n" 15445 " return b;\n" 15446 "};", 15447 "auto c = []() {\n" 15448 " return b;\n" 15449 " };", 15450 MergeEmptyOnly); 15451 verifyFormat("auto c = []() {};", 15452 "auto c = []() {\n" 15453 "};", 15454 MergeEmptyOnly); 15455 15456 FormatStyle MergeInline = getLLVMStyle(); 15457 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 15458 verifyFormat("auto c = []() {\n" 15459 " return b;\n" 15460 "};", 15461 "auto c = []() { return b; };", MergeInline); 15462 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 15463 MergeInline); 15464 verifyFormat("function([]() { return b; }, a)", 15465 "function([]() { return b; }, a)", MergeInline); 15466 verifyFormat("function(a, []() { return b; })", 15467 "function(a, []() { return b; })", MergeInline); 15468 15469 // Check option "BraceWrapping.BeforeLambdaBody" and different state of 15470 // AllowShortLambdasOnASingleLine 15471 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15472 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15473 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15474 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15475 FormatStyle::ShortLambdaStyle::SLS_None; 15476 verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n" 15477 " []()\n" 15478 " {\n" 15479 " return 17;\n" 15480 " });", 15481 LLVMWithBeforeLambdaBody); 15482 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n" 15483 " []()\n" 15484 " {\n" 15485 " });", 15486 LLVMWithBeforeLambdaBody); 15487 verifyFormat("auto fct_SLS_None = []()\n" 15488 "{\n" 15489 " return 17;\n" 15490 "};", 15491 LLVMWithBeforeLambdaBody); 15492 verifyFormat("TwoNestedLambdas_SLS_None(\n" 15493 " []()\n" 15494 " {\n" 15495 " return Call(\n" 15496 " []()\n" 15497 " {\n" 15498 " return 17;\n" 15499 " });\n" 15500 " });", 15501 LLVMWithBeforeLambdaBody); 15502 verifyFormat("void Fct()\n" 15503 "{\n" 15504 " return {[]()\n" 15505 " {\n" 15506 " return 17;\n" 15507 " }};\n" 15508 "}", 15509 LLVMWithBeforeLambdaBody); 15510 15511 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15512 FormatStyle::ShortLambdaStyle::SLS_Empty; 15513 verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" 15514 " []()\n" 15515 " {\n" 15516 " return 17;\n" 15517 " });", 15518 LLVMWithBeforeLambdaBody); 15519 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});", 15520 LLVMWithBeforeLambdaBody); 15521 verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL" 15522 "ongFunctionName_SLS_Empty(\n" 15523 " []() {});", 15524 LLVMWithBeforeLambdaBody); 15525 verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n" 15526 " []()\n" 15527 " {\n" 15528 " return 17;\n" 15529 " });", 15530 LLVMWithBeforeLambdaBody); 15531 verifyFormat("auto fct_SLS_Empty = []()\n" 15532 "{\n" 15533 " return 17;\n" 15534 "};", 15535 LLVMWithBeforeLambdaBody); 15536 verifyFormat("TwoNestedLambdas_SLS_Empty(\n" 15537 " []()\n" 15538 " {\n" 15539 " return Call([]() {});\n" 15540 " });", 15541 LLVMWithBeforeLambdaBody); 15542 verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n" 15543 " []()\n" 15544 " {\n" 15545 " return Call([]() {});\n" 15546 " });", 15547 LLVMWithBeforeLambdaBody); 15548 verifyFormat( 15549 "FctWithLongLineInLambda_SLS_Empty(\n" 15550 " []()\n" 15551 " {\n" 15552 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15553 " AndShouldNotBeConsiderAsInline,\n" 15554 " LambdaBodyMustBeBreak);\n" 15555 " });", 15556 LLVMWithBeforeLambdaBody); 15557 15558 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15559 FormatStyle::ShortLambdaStyle::SLS_Inline; 15560 verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });", 15561 LLVMWithBeforeLambdaBody); 15562 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});", 15563 LLVMWithBeforeLambdaBody); 15564 verifyFormat("auto fct_SLS_Inline = []()\n" 15565 "{\n" 15566 " return 17;\n" 15567 "};", 15568 LLVMWithBeforeLambdaBody); 15569 verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return " 15570 "17; }); });", 15571 LLVMWithBeforeLambdaBody); 15572 verifyFormat( 15573 "FctWithLongLineInLambda_SLS_Inline(\n" 15574 " []()\n" 15575 " {\n" 15576 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15577 " AndShouldNotBeConsiderAsInline,\n" 15578 " LambdaBodyMustBeBreak);\n" 15579 " });", 15580 LLVMWithBeforeLambdaBody); 15581 verifyFormat("FctWithMultipleParams_SLS_Inline(" 15582 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15583 " []() { return 17; });", 15584 LLVMWithBeforeLambdaBody); 15585 verifyFormat( 15586 "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });", 15587 LLVMWithBeforeLambdaBody); 15588 15589 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15590 FormatStyle::ShortLambdaStyle::SLS_All; 15591 verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });", 15592 LLVMWithBeforeLambdaBody); 15593 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});", 15594 LLVMWithBeforeLambdaBody); 15595 verifyFormat("auto fct_SLS_All = []() { return 17; };", 15596 LLVMWithBeforeLambdaBody); 15597 verifyFormat("FctWithOneParam_SLS_All(\n" 15598 " []()\n" 15599 " {\n" 15600 " // A cool function...\n" 15601 " return 43;\n" 15602 " });", 15603 LLVMWithBeforeLambdaBody); 15604 verifyFormat("FctWithMultipleParams_SLS_All(" 15605 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15606 " []() { return 17; });", 15607 LLVMWithBeforeLambdaBody); 15608 verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });", 15609 LLVMWithBeforeLambdaBody); 15610 verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });", 15611 LLVMWithBeforeLambdaBody); 15612 verifyFormat( 15613 "FctWithLongLineInLambda_SLS_All(\n" 15614 " []()\n" 15615 " {\n" 15616 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15617 " AndShouldNotBeConsiderAsInline,\n" 15618 " LambdaBodyMustBeBreak);\n" 15619 " });", 15620 LLVMWithBeforeLambdaBody); 15621 verifyFormat( 15622 "auto fct_SLS_All = []()\n" 15623 "{\n" 15624 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15625 " AndShouldNotBeConsiderAsInline,\n" 15626 " LambdaBodyMustBeBreak);\n" 15627 "};", 15628 LLVMWithBeforeLambdaBody); 15629 LLVMWithBeforeLambdaBody.BinPackParameters = false; 15630 verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);", 15631 LLVMWithBeforeLambdaBody); 15632 verifyFormat( 15633 "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n" 15634 " FirstParam,\n" 15635 " SecondParam,\n" 15636 " ThirdParam,\n" 15637 " FourthParam);", 15638 LLVMWithBeforeLambdaBody); 15639 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15640 " []() { return " 15641 "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n" 15642 " FirstParam,\n" 15643 " SecondParam,\n" 15644 " ThirdParam,\n" 15645 " FourthParam);", 15646 LLVMWithBeforeLambdaBody); 15647 verifyFormat( 15648 "FctWithLongLineInLambda_SLS_All(FirstParam,\n" 15649 " SecondParam,\n" 15650 " ThirdParam,\n" 15651 " FourthParam,\n" 15652 " []() { return SomeValueNotSoLong; });", 15653 LLVMWithBeforeLambdaBody); 15654 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15655 " []()\n" 15656 " {\n" 15657 " return " 15658 "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB" 15659 "eConsiderAsInline;\n" 15660 " });", 15661 LLVMWithBeforeLambdaBody); 15662 verifyFormat( 15663 "FctWithLongLineInLambda_SLS_All(\n" 15664 " []()\n" 15665 " {\n" 15666 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15667 " AndShouldNotBeConsiderAsInline,\n" 15668 " LambdaBodyMustBeBreak);\n" 15669 " });", 15670 LLVMWithBeforeLambdaBody); 15671 verifyFormat("FctWithTwoParams_SLS_All(\n" 15672 " []()\n" 15673 " {\n" 15674 " // A cool function...\n" 15675 " return 43;\n" 15676 " },\n" 15677 " 87);", 15678 LLVMWithBeforeLambdaBody); 15679 verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);", 15680 LLVMWithBeforeLambdaBody); 15681 verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });", 15682 LLVMWithBeforeLambdaBody); 15683 verifyFormat( 15684 "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });", 15685 LLVMWithBeforeLambdaBody); 15686 verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; " 15687 "}); }, x);", 15688 LLVMWithBeforeLambdaBody); 15689 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15690 " []()\n" 15691 " {\n" 15692 " // A cool function...\n" 15693 " return Call([]() { return 17; });\n" 15694 " });", 15695 LLVMWithBeforeLambdaBody); 15696 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15697 " []()\n" 15698 " {\n" 15699 " return Call(\n" 15700 " []()\n" 15701 " {\n" 15702 " // A cool function...\n" 15703 " return 17;\n" 15704 " });\n" 15705 " });", 15706 LLVMWithBeforeLambdaBody); 15707 } 15708 15709 TEST_F(FormatTest, LambdaWithLineComments) { 15710 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15711 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15712 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15713 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15714 FormatStyle::ShortLambdaStyle::SLS_All; 15715 15716 verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody); 15717 verifyFormat("auto k = []() // comment\n" 15718 "{ return; }", 15719 LLVMWithBeforeLambdaBody); 15720 verifyFormat("auto k = []() /* comment */ { return; }", 15721 LLVMWithBeforeLambdaBody); 15722 verifyFormat("auto k = []() /* comment */ /* comment */ { return; }", 15723 LLVMWithBeforeLambdaBody); 15724 verifyFormat("auto k = []() // X\n" 15725 "{ return; }", 15726 LLVMWithBeforeLambdaBody); 15727 verifyFormat( 15728 "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" 15729 "{ return; }", 15730 LLVMWithBeforeLambdaBody); 15731 } 15732 15733 TEST_F(FormatTest, EmptyLinesInLambdas) { 15734 verifyFormat("auto lambda = []() {\n" 15735 " x(); //\n" 15736 "};", 15737 "auto lambda = []() {\n" 15738 "\n" 15739 " x(); //\n" 15740 "\n" 15741 "};"); 15742 } 15743 15744 TEST_F(FormatTest, FormatsBlocks) { 15745 FormatStyle ShortBlocks = getLLVMStyle(); 15746 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15747 verifyFormat("int (^Block)(int, int);", ShortBlocks); 15748 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 15749 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 15750 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 15751 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 15752 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 15753 15754 verifyFormat("foo(^{ bar(); });", ShortBlocks); 15755 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 15756 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 15757 15758 verifyFormat("[operation setCompletionBlock:^{\n" 15759 " [self onOperationDone];\n" 15760 "}];"); 15761 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 15762 " [self onOperationDone];\n" 15763 "}]};"); 15764 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 15765 " f();\n" 15766 "}];"); 15767 verifyFormat("int a = [operation block:^int(int *i) {\n" 15768 " return 1;\n" 15769 "}];"); 15770 verifyFormat("[myObject doSomethingWith:arg1\n" 15771 " aaa:^int(int *a) {\n" 15772 " return 1;\n" 15773 " }\n" 15774 " bbb:f(a * bbbbbbbb)];"); 15775 15776 verifyFormat("[operation setCompletionBlock:^{\n" 15777 " [self.delegate newDataAvailable];\n" 15778 "}];", 15779 getLLVMStyleWithColumns(60)); 15780 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 15781 " NSString *path = [self sessionFilePath];\n" 15782 " if (path) {\n" 15783 " // ...\n" 15784 " }\n" 15785 "});"); 15786 verifyFormat("[[SessionService sharedService]\n" 15787 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15788 " if (window) {\n" 15789 " [self windowDidLoad:window];\n" 15790 " } else {\n" 15791 " [self errorLoadingWindow];\n" 15792 " }\n" 15793 " }];"); 15794 verifyFormat("void (^largeBlock)(void) = ^{\n" 15795 " // ...\n" 15796 "};\n", 15797 getLLVMStyleWithColumns(40)); 15798 verifyFormat("[[SessionService sharedService]\n" 15799 " loadWindowWithCompletionBlock: //\n" 15800 " ^(SessionWindow *window) {\n" 15801 " if (window) {\n" 15802 " [self windowDidLoad:window];\n" 15803 " } else {\n" 15804 " [self errorLoadingWindow];\n" 15805 " }\n" 15806 " }];", 15807 getLLVMStyleWithColumns(60)); 15808 verifyFormat("[myObject doSomethingWith:arg1\n" 15809 " firstBlock:^(Foo *a) {\n" 15810 " // ...\n" 15811 " int i;\n" 15812 " }\n" 15813 " secondBlock:^(Bar *b) {\n" 15814 " // ...\n" 15815 " int i;\n" 15816 " }\n" 15817 " thirdBlock:^Foo(Bar *b) {\n" 15818 " // ...\n" 15819 " int i;\n" 15820 " }];"); 15821 verifyFormat("[myObject doSomethingWith:arg1\n" 15822 " firstBlock:-1\n" 15823 " secondBlock:^(Bar *b) {\n" 15824 " // ...\n" 15825 " int i;\n" 15826 " }];"); 15827 15828 verifyFormat("f(^{\n" 15829 " @autoreleasepool {\n" 15830 " if (a) {\n" 15831 " g();\n" 15832 " }\n" 15833 " }\n" 15834 "});"); 15835 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 15836 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 15837 "};"); 15838 15839 FormatStyle FourIndent = getLLVMStyle(); 15840 FourIndent.ObjCBlockIndentWidth = 4; 15841 verifyFormat("[operation setCompletionBlock:^{\n" 15842 " [self onOperationDone];\n" 15843 "}];", 15844 FourIndent); 15845 } 15846 15847 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 15848 FormatStyle ZeroColumn = getLLVMStyle(); 15849 ZeroColumn.ColumnLimit = 0; 15850 15851 verifyFormat("[[SessionService sharedService] " 15852 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15853 " if (window) {\n" 15854 " [self windowDidLoad:window];\n" 15855 " } else {\n" 15856 " [self errorLoadingWindow];\n" 15857 " }\n" 15858 "}];", 15859 ZeroColumn); 15860 EXPECT_EQ("[[SessionService sharedService]\n" 15861 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15862 " if (window) {\n" 15863 " [self windowDidLoad:window];\n" 15864 " } else {\n" 15865 " [self errorLoadingWindow];\n" 15866 " }\n" 15867 " }];", 15868 format("[[SessionService sharedService]\n" 15869 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15870 " if (window) {\n" 15871 " [self windowDidLoad:window];\n" 15872 " } else {\n" 15873 " [self errorLoadingWindow];\n" 15874 " }\n" 15875 "}];", 15876 ZeroColumn)); 15877 verifyFormat("[myObject doSomethingWith:arg1\n" 15878 " firstBlock:^(Foo *a) {\n" 15879 " // ...\n" 15880 " int i;\n" 15881 " }\n" 15882 " secondBlock:^(Bar *b) {\n" 15883 " // ...\n" 15884 " int i;\n" 15885 " }\n" 15886 " thirdBlock:^Foo(Bar *b) {\n" 15887 " // ...\n" 15888 " int i;\n" 15889 " }];", 15890 ZeroColumn); 15891 verifyFormat("f(^{\n" 15892 " @autoreleasepool {\n" 15893 " if (a) {\n" 15894 " g();\n" 15895 " }\n" 15896 " }\n" 15897 "});", 15898 ZeroColumn); 15899 verifyFormat("void (^largeBlock)(void) = ^{\n" 15900 " // ...\n" 15901 "};", 15902 ZeroColumn); 15903 15904 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15905 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 15906 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 15907 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 15908 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 15909 " int i;\n" 15910 "};", 15911 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 15912 } 15913 15914 TEST_F(FormatTest, SupportsCRLF) { 15915 EXPECT_EQ("int a;\r\n" 15916 "int b;\r\n" 15917 "int c;\r\n", 15918 format("int a;\r\n" 15919 " int b;\r\n" 15920 " int c;\r\n", 15921 getLLVMStyle())); 15922 EXPECT_EQ("int a;\r\n" 15923 "int b;\r\n" 15924 "int c;\r\n", 15925 format("int a;\r\n" 15926 " int b;\n" 15927 " int c;\r\n", 15928 getLLVMStyle())); 15929 EXPECT_EQ("int a;\n" 15930 "int b;\n" 15931 "int c;\n", 15932 format("int a;\r\n" 15933 " int b;\n" 15934 " int c;\n", 15935 getLLVMStyle())); 15936 EXPECT_EQ("\"aaaaaaa \"\r\n" 15937 "\"bbbbbbb\";\r\n", 15938 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 15939 EXPECT_EQ("#define A \\\r\n" 15940 " b; \\\r\n" 15941 " c; \\\r\n" 15942 " d;\r\n", 15943 format("#define A \\\r\n" 15944 " b; \\\r\n" 15945 " c; d; \r\n", 15946 getGoogleStyle())); 15947 15948 EXPECT_EQ("/*\r\n" 15949 "multi line block comments\r\n" 15950 "should not introduce\r\n" 15951 "an extra carriage return\r\n" 15952 "*/\r\n", 15953 format("/*\r\n" 15954 "multi line block comments\r\n" 15955 "should not introduce\r\n" 15956 "an extra carriage return\r\n" 15957 "*/\r\n")); 15958 EXPECT_EQ("/*\r\n" 15959 "\r\n" 15960 "*/", 15961 format("/*\r\n" 15962 " \r\r\r\n" 15963 "*/")); 15964 15965 FormatStyle style = getLLVMStyle(); 15966 15967 style.DeriveLineEnding = true; 15968 style.UseCRLF = false; 15969 EXPECT_EQ("union FooBarBazQux {\n" 15970 " int foo;\n" 15971 " int bar;\n" 15972 " int baz;\n" 15973 "};", 15974 format("union FooBarBazQux {\r\n" 15975 " int foo;\n" 15976 " int bar;\r\n" 15977 " int baz;\n" 15978 "};", 15979 style)); 15980 style.UseCRLF = true; 15981 EXPECT_EQ("union FooBarBazQux {\r\n" 15982 " int foo;\r\n" 15983 " int bar;\r\n" 15984 " int baz;\r\n" 15985 "};", 15986 format("union FooBarBazQux {\r\n" 15987 " int foo;\n" 15988 " int bar;\r\n" 15989 " int baz;\n" 15990 "};", 15991 style)); 15992 15993 style.DeriveLineEnding = false; 15994 style.UseCRLF = false; 15995 EXPECT_EQ("union FooBarBazQux {\n" 15996 " int foo;\n" 15997 " int bar;\n" 15998 " int baz;\n" 15999 " int qux;\n" 16000 "};", 16001 format("union FooBarBazQux {\r\n" 16002 " int foo;\n" 16003 " int bar;\r\n" 16004 " int baz;\n" 16005 " int qux;\r\n" 16006 "};", 16007 style)); 16008 style.UseCRLF = true; 16009 EXPECT_EQ("union FooBarBazQux {\r\n" 16010 " int foo;\r\n" 16011 " int bar;\r\n" 16012 " int baz;\r\n" 16013 " int qux;\r\n" 16014 "};", 16015 format("union FooBarBazQux {\r\n" 16016 " int foo;\n" 16017 " int bar;\r\n" 16018 " int baz;\n" 16019 " int qux;\n" 16020 "};", 16021 style)); 16022 16023 style.DeriveLineEnding = true; 16024 style.UseCRLF = false; 16025 EXPECT_EQ("union FooBarBazQux {\r\n" 16026 " int foo;\r\n" 16027 " int bar;\r\n" 16028 " int baz;\r\n" 16029 " int qux;\r\n" 16030 "};", 16031 format("union FooBarBazQux {\r\n" 16032 " int foo;\n" 16033 " int bar;\r\n" 16034 " int baz;\n" 16035 " int qux;\r\n" 16036 "};", 16037 style)); 16038 style.UseCRLF = true; 16039 EXPECT_EQ("union FooBarBazQux {\n" 16040 " int foo;\n" 16041 " int bar;\n" 16042 " int baz;\n" 16043 " int qux;\n" 16044 "};", 16045 format("union FooBarBazQux {\r\n" 16046 " int foo;\n" 16047 " int bar;\r\n" 16048 " int baz;\n" 16049 " int qux;\n" 16050 "};", 16051 style)); 16052 } 16053 16054 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 16055 verifyFormat("MY_CLASS(C) {\n" 16056 " int i;\n" 16057 " int j;\n" 16058 "};"); 16059 } 16060 16061 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 16062 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 16063 TwoIndent.ContinuationIndentWidth = 2; 16064 16065 EXPECT_EQ("int i =\n" 16066 " longFunction(\n" 16067 " arg);", 16068 format("int i = longFunction(arg);", TwoIndent)); 16069 16070 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 16071 SixIndent.ContinuationIndentWidth = 6; 16072 16073 EXPECT_EQ("int i =\n" 16074 " longFunction(\n" 16075 " arg);", 16076 format("int i = longFunction(arg);", SixIndent)); 16077 } 16078 16079 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 16080 FormatStyle Style = getLLVMStyle(); 16081 verifyFormat("int Foo::getter(\n" 16082 " //\n" 16083 ") const {\n" 16084 " return foo;\n" 16085 "}", 16086 Style); 16087 verifyFormat("void Foo::setter(\n" 16088 " //\n" 16089 ") {\n" 16090 " foo = 1;\n" 16091 "}", 16092 Style); 16093 } 16094 16095 TEST_F(FormatTest, SpacesInAngles) { 16096 FormatStyle Spaces = getLLVMStyle(); 16097 Spaces.SpacesInAngles = true; 16098 16099 verifyFormat("static_cast< int >(arg);", Spaces); 16100 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 16101 verifyFormat("f< int, float >();", Spaces); 16102 verifyFormat("template <> g() {}", Spaces); 16103 verifyFormat("template < std::vector< int > > f() {}", Spaces); 16104 verifyFormat("std::function< void(int, int) > fct;", Spaces); 16105 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 16106 Spaces); 16107 16108 Spaces.Standard = FormatStyle::LS_Cpp03; 16109 Spaces.SpacesInAngles = true; 16110 verifyFormat("A< A< int > >();", Spaces); 16111 16112 Spaces.SpacesInAngles = false; 16113 verifyFormat("A<A<int> >();", Spaces); 16114 16115 Spaces.Standard = FormatStyle::LS_Cpp11; 16116 Spaces.SpacesInAngles = true; 16117 verifyFormat("A< A< int > >();", Spaces); 16118 16119 Spaces.SpacesInAngles = false; 16120 verifyFormat("A<A<int>>();", Spaces); 16121 } 16122 16123 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 16124 FormatStyle Style = getLLVMStyle(); 16125 Style.SpaceAfterTemplateKeyword = false; 16126 verifyFormat("template<int> void foo();", Style); 16127 } 16128 16129 TEST_F(FormatTest, TripleAngleBrackets) { 16130 verifyFormat("f<<<1, 1>>>();"); 16131 verifyFormat("f<<<1, 1, 1, s>>>();"); 16132 verifyFormat("f<<<a, b, c, d>>>();"); 16133 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 16134 verifyFormat("f<param><<<1, 1>>>();"); 16135 verifyFormat("f<1><<<1, 1>>>();"); 16136 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 16137 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16138 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 16139 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 16140 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 16141 } 16142 16143 TEST_F(FormatTest, MergeLessLessAtEnd) { 16144 verifyFormat("<<"); 16145 EXPECT_EQ("< < <", format("\\\n<<<")); 16146 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16147 "aaallvm::outs() <<"); 16148 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 16149 "aaaallvm::outs()\n <<"); 16150 } 16151 16152 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 16153 std::string code = "#if A\n" 16154 "#if B\n" 16155 "a.\n" 16156 "#endif\n" 16157 " a = 1;\n" 16158 "#else\n" 16159 "#endif\n" 16160 "#if C\n" 16161 "#else\n" 16162 "#endif\n"; 16163 EXPECT_EQ(code, format(code)); 16164 } 16165 16166 TEST_F(FormatTest, HandleConflictMarkers) { 16167 // Git/SVN conflict markers. 16168 EXPECT_EQ("int a;\n" 16169 "void f() {\n" 16170 " callme(some(parameter1,\n" 16171 "<<<<<<< text by the vcs\n" 16172 " parameter2),\n" 16173 "||||||| text by the vcs\n" 16174 " parameter2),\n" 16175 " parameter3,\n" 16176 "======= text by the vcs\n" 16177 " parameter2, parameter3),\n" 16178 ">>>>>>> text by the vcs\n" 16179 " otherparameter);\n", 16180 format("int a;\n" 16181 "void f() {\n" 16182 " callme(some(parameter1,\n" 16183 "<<<<<<< text by the vcs\n" 16184 " parameter2),\n" 16185 "||||||| text by the vcs\n" 16186 " parameter2),\n" 16187 " parameter3,\n" 16188 "======= text by the vcs\n" 16189 " parameter2,\n" 16190 " parameter3),\n" 16191 ">>>>>>> text by the vcs\n" 16192 " otherparameter);\n")); 16193 16194 // Perforce markers. 16195 EXPECT_EQ("void f() {\n" 16196 " function(\n" 16197 ">>>> text by the vcs\n" 16198 " parameter,\n" 16199 "==== text by the vcs\n" 16200 " parameter,\n" 16201 "==== text by the vcs\n" 16202 " parameter,\n" 16203 "<<<< text by the vcs\n" 16204 " parameter);\n", 16205 format("void f() {\n" 16206 " function(\n" 16207 ">>>> text by the vcs\n" 16208 " parameter,\n" 16209 "==== text by the vcs\n" 16210 " parameter,\n" 16211 "==== text by the vcs\n" 16212 " parameter,\n" 16213 "<<<< text by the vcs\n" 16214 " parameter);\n")); 16215 16216 EXPECT_EQ("<<<<<<<\n" 16217 "|||||||\n" 16218 "=======\n" 16219 ">>>>>>>", 16220 format("<<<<<<<\n" 16221 "|||||||\n" 16222 "=======\n" 16223 ">>>>>>>")); 16224 16225 EXPECT_EQ("<<<<<<<\n" 16226 "|||||||\n" 16227 "int i;\n" 16228 "=======\n" 16229 ">>>>>>>", 16230 format("<<<<<<<\n" 16231 "|||||||\n" 16232 "int i;\n" 16233 "=======\n" 16234 ">>>>>>>")); 16235 16236 // FIXME: Handle parsing of macros around conflict markers correctly: 16237 EXPECT_EQ("#define Macro \\\n" 16238 "<<<<<<<\n" 16239 "Something \\\n" 16240 "|||||||\n" 16241 "Else \\\n" 16242 "=======\n" 16243 "Other \\\n" 16244 ">>>>>>>\n" 16245 " End int i;\n", 16246 format("#define Macro \\\n" 16247 "<<<<<<<\n" 16248 " Something \\\n" 16249 "|||||||\n" 16250 " Else \\\n" 16251 "=======\n" 16252 " Other \\\n" 16253 ">>>>>>>\n" 16254 " End\n" 16255 "int i;\n")); 16256 } 16257 16258 TEST_F(FormatTest, DisableRegions) { 16259 EXPECT_EQ("int i;\n" 16260 "// clang-format off\n" 16261 " int j;\n" 16262 "// clang-format on\n" 16263 "int k;", 16264 format(" int i;\n" 16265 " // clang-format off\n" 16266 " int j;\n" 16267 " // clang-format on\n" 16268 " int k;")); 16269 EXPECT_EQ("int i;\n" 16270 "/* clang-format off */\n" 16271 " int j;\n" 16272 "/* clang-format on */\n" 16273 "int k;", 16274 format(" int i;\n" 16275 " /* clang-format off */\n" 16276 " int j;\n" 16277 " /* clang-format on */\n" 16278 " int k;")); 16279 16280 // Don't reflow comments within disabled regions. 16281 EXPECT_EQ("// clang-format off\n" 16282 "// long long long long long long line\n" 16283 "/* clang-format on */\n" 16284 "/* long long long\n" 16285 " * long long long\n" 16286 " * line */\n" 16287 "int i;\n" 16288 "/* clang-format off */\n" 16289 "/* long long long long long long line */\n", 16290 format("// clang-format off\n" 16291 "// long long long long long long line\n" 16292 "/* clang-format on */\n" 16293 "/* long long long long long long line */\n" 16294 "int i;\n" 16295 "/* clang-format off */\n" 16296 "/* long long long long long long line */\n", 16297 getLLVMStyleWithColumns(20))); 16298 } 16299 16300 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 16301 format("? ) ="); 16302 verifyNoCrash("#define a\\\n /**/}"); 16303 } 16304 16305 TEST_F(FormatTest, FormatsTableGenCode) { 16306 FormatStyle Style = getLLVMStyle(); 16307 Style.Language = FormatStyle::LK_TableGen; 16308 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 16309 } 16310 16311 TEST_F(FormatTest, ArrayOfTemplates) { 16312 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 16313 format("auto a = new unique_ptr<int > [ 10];")); 16314 16315 FormatStyle Spaces = getLLVMStyle(); 16316 Spaces.SpacesInSquareBrackets = true; 16317 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 16318 format("auto a = new unique_ptr<int > [10];", Spaces)); 16319 } 16320 16321 TEST_F(FormatTest, ArrayAsTemplateType) { 16322 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 16323 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 16324 16325 FormatStyle Spaces = getLLVMStyle(); 16326 Spaces.SpacesInSquareBrackets = true; 16327 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 16328 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 16329 } 16330 16331 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 16332 16333 TEST(FormatStyle, GetStyleWithEmptyFileName) { 16334 llvm::vfs::InMemoryFileSystem FS; 16335 auto Style1 = getStyle("file", "", "Google", "", &FS); 16336 ASSERT_TRUE((bool)Style1); 16337 ASSERT_EQ(*Style1, getGoogleStyle()); 16338 } 16339 16340 TEST(FormatStyle, GetStyleOfFile) { 16341 llvm::vfs::InMemoryFileSystem FS; 16342 // Test 1: format file in the same directory. 16343 ASSERT_TRUE( 16344 FS.addFile("/a/.clang-format", 0, 16345 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 16346 ASSERT_TRUE( 16347 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16348 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 16349 ASSERT_TRUE((bool)Style1); 16350 ASSERT_EQ(*Style1, getLLVMStyle()); 16351 16352 // Test 2.1: fallback to default. 16353 ASSERT_TRUE( 16354 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16355 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 16356 ASSERT_TRUE((bool)Style2); 16357 ASSERT_EQ(*Style2, getMozillaStyle()); 16358 16359 // Test 2.2: no format on 'none' fallback style. 16360 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 16361 ASSERT_TRUE((bool)Style2); 16362 ASSERT_EQ(*Style2, getNoStyle()); 16363 16364 // Test 2.3: format if config is found with no based style while fallback is 16365 // 'none'. 16366 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 16367 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 16368 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 16369 ASSERT_TRUE((bool)Style2); 16370 ASSERT_EQ(*Style2, getLLVMStyle()); 16371 16372 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 16373 Style2 = getStyle("{}", "a.h", "none", "", &FS); 16374 ASSERT_TRUE((bool)Style2); 16375 ASSERT_EQ(*Style2, getLLVMStyle()); 16376 16377 // Test 3: format file in parent directory. 16378 ASSERT_TRUE( 16379 FS.addFile("/c/.clang-format", 0, 16380 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 16381 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 16382 llvm::MemoryBuffer::getMemBuffer("int i;"))); 16383 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 16384 ASSERT_TRUE((bool)Style3); 16385 ASSERT_EQ(*Style3, getGoogleStyle()); 16386 16387 // Test 4: error on invalid fallback style 16388 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 16389 ASSERT_FALSE((bool)Style4); 16390 llvm::consumeError(Style4.takeError()); 16391 16392 // Test 5: error on invalid yaml on command line 16393 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 16394 ASSERT_FALSE((bool)Style5); 16395 llvm::consumeError(Style5.takeError()); 16396 16397 // Test 6: error on invalid style 16398 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 16399 ASSERT_FALSE((bool)Style6); 16400 llvm::consumeError(Style6.takeError()); 16401 16402 // Test 7: found config file, error on parsing it 16403 ASSERT_TRUE( 16404 FS.addFile("/d/.clang-format", 0, 16405 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 16406 "InvalidKey: InvalidValue"))); 16407 ASSERT_TRUE( 16408 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16409 auto Style7a = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 16410 ASSERT_FALSE((bool)Style7a); 16411 llvm::consumeError(Style7a.takeError()); 16412 16413 auto Style7b = getStyle("file", "/d/.clang-format", "LLVM", "", &FS, true); 16414 ASSERT_TRUE((bool)Style7b); 16415 16416 // Test 8: inferred per-language defaults apply. 16417 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 16418 ASSERT_TRUE((bool)StyleTd); 16419 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 16420 } 16421 16422 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 16423 // Column limit is 20. 16424 std::string Code = "Type *a =\n" 16425 " new Type();\n" 16426 "g(iiiii, 0, jjjjj,\n" 16427 " 0, kkkkk, 0, mm);\n" 16428 "int bad = format ;"; 16429 std::string Expected = "auto a = new Type();\n" 16430 "g(iiiii, nullptr,\n" 16431 " jjjjj, nullptr,\n" 16432 " kkkkk, nullptr,\n" 16433 " mm);\n" 16434 "int bad = format ;"; 16435 FileID ID = Context.createInMemoryFile("format.cpp", Code); 16436 tooling::Replacements Replaces = toReplacements( 16437 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 16438 "auto "), 16439 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 16440 "nullptr"), 16441 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 16442 "nullptr"), 16443 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 16444 "nullptr")}); 16445 16446 format::FormatStyle Style = format::getLLVMStyle(); 16447 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 16448 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 16449 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 16450 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 16451 auto Result = applyAllReplacements(Code, *FormattedReplaces); 16452 EXPECT_TRUE(static_cast<bool>(Result)); 16453 EXPECT_EQ(Expected, *Result); 16454 } 16455 16456 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 16457 std::string Code = "#include \"a.h\"\n" 16458 "#include \"c.h\"\n" 16459 "\n" 16460 "int main() {\n" 16461 " return 0;\n" 16462 "}"; 16463 std::string Expected = "#include \"a.h\"\n" 16464 "#include \"b.h\"\n" 16465 "#include \"c.h\"\n" 16466 "\n" 16467 "int main() {\n" 16468 " return 0;\n" 16469 "}"; 16470 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 16471 tooling::Replacements Replaces = toReplacements( 16472 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 16473 "#include \"b.h\"\n")}); 16474 16475 format::FormatStyle Style = format::getLLVMStyle(); 16476 Style.SortIncludes = true; 16477 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 16478 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 16479 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 16480 auto Result = applyAllReplacements(Code, *FormattedReplaces); 16481 EXPECT_TRUE(static_cast<bool>(Result)); 16482 EXPECT_EQ(Expected, *Result); 16483 } 16484 16485 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 16486 EXPECT_EQ("using std::cin;\n" 16487 "using std::cout;", 16488 format("using std::cout;\n" 16489 "using std::cin;", 16490 getGoogleStyle())); 16491 } 16492 16493 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 16494 format::FormatStyle Style = format::getLLVMStyle(); 16495 Style.Standard = FormatStyle::LS_Cpp03; 16496 // cpp03 recognize this string as identifier u8 and literal character 'a' 16497 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 16498 } 16499 16500 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 16501 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 16502 // all modes, including C++11, C++14 and C++17 16503 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 16504 } 16505 16506 TEST_F(FormatTest, DoNotFormatLikelyXml) { 16507 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 16508 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 16509 } 16510 16511 TEST_F(FormatTest, StructuredBindings) { 16512 // Structured bindings is a C++17 feature. 16513 // all modes, including C++11, C++14 and C++17 16514 verifyFormat("auto [a, b] = f();"); 16515 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 16516 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 16517 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 16518 EXPECT_EQ("auto const volatile [a, b] = f();", 16519 format("auto const volatile[a, b] = f();")); 16520 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 16521 EXPECT_EQ("auto &[a, b, c] = f();", 16522 format("auto &[ a , b,c ] = f();")); 16523 EXPECT_EQ("auto &&[a, b, c] = f();", 16524 format("auto &&[ a , b,c ] = f();")); 16525 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 16526 EXPECT_EQ("auto const volatile &&[a, b] = f();", 16527 format("auto const volatile &&[a, b] = f();")); 16528 EXPECT_EQ("auto const &&[a, b] = f();", 16529 format("auto const && [a, b] = f();")); 16530 EXPECT_EQ("const auto &[a, b] = f();", 16531 format("const auto & [a, b] = f();")); 16532 EXPECT_EQ("const auto volatile &&[a, b] = f();", 16533 format("const auto volatile &&[a, b] = f();")); 16534 EXPECT_EQ("volatile const auto &&[a, b] = f();", 16535 format("volatile const auto &&[a, b] = f();")); 16536 EXPECT_EQ("const auto &&[a, b] = f();", 16537 format("const auto && [a, b] = f();")); 16538 16539 // Make sure we don't mistake structured bindings for lambdas. 16540 FormatStyle PointerMiddle = getLLVMStyle(); 16541 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 16542 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 16543 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 16544 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 16545 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 16546 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 16547 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 16548 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 16549 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 16550 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 16551 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 16552 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 16553 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 16554 16555 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 16556 format("for (const auto && [a, b] : some_range) {\n}")); 16557 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 16558 format("for (const auto & [a, b] : some_range) {\n}")); 16559 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 16560 format("for (const auto[a, b] : some_range) {\n}")); 16561 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 16562 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 16563 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 16564 EXPECT_EQ("auto const &[x, y](expr);", 16565 format("auto const & [x,y] (expr);")); 16566 EXPECT_EQ("auto const &&[x, y](expr);", 16567 format("auto const && [x,y] (expr);")); 16568 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 16569 EXPECT_EQ("auto const &[x, y]{expr};", 16570 format("auto const & [x,y] {expr};")); 16571 EXPECT_EQ("auto const &&[x, y]{expr};", 16572 format("auto const && [x,y] {expr};")); 16573 16574 format::FormatStyle Spaces = format::getLLVMStyle(); 16575 Spaces.SpacesInSquareBrackets = true; 16576 verifyFormat("auto [ a, b ] = f();", Spaces); 16577 verifyFormat("auto &&[ a, b ] = f();", Spaces); 16578 verifyFormat("auto &[ a, b ] = f();", Spaces); 16579 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 16580 verifyFormat("auto const &[ a, b ] = f();", Spaces); 16581 } 16582 16583 TEST_F(FormatTest, FileAndCode) { 16584 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 16585 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 16586 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 16587 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 16588 EXPECT_EQ(FormatStyle::LK_ObjC, 16589 guessLanguage("foo.h", "@interface Foo\n@end\n")); 16590 EXPECT_EQ( 16591 FormatStyle::LK_ObjC, 16592 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 16593 EXPECT_EQ(FormatStyle::LK_ObjC, 16594 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 16595 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 16596 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 16597 EXPECT_EQ(FormatStyle::LK_ObjC, 16598 guessLanguage("foo", "@interface Foo\n@end\n")); 16599 EXPECT_EQ(FormatStyle::LK_ObjC, 16600 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 16601 EXPECT_EQ( 16602 FormatStyle::LK_ObjC, 16603 guessLanguage("foo.h", 16604 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 16605 EXPECT_EQ( 16606 FormatStyle::LK_Cpp, 16607 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 16608 } 16609 16610 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 16611 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 16612 EXPECT_EQ(FormatStyle::LK_ObjC, 16613 guessLanguage("foo.h", "array[[calculator getIndex]];")); 16614 EXPECT_EQ(FormatStyle::LK_Cpp, 16615 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 16616 EXPECT_EQ( 16617 FormatStyle::LK_Cpp, 16618 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 16619 EXPECT_EQ(FormatStyle::LK_ObjC, 16620 guessLanguage("foo.h", "[[noreturn foo] bar];")); 16621 EXPECT_EQ(FormatStyle::LK_Cpp, 16622 guessLanguage("foo.h", "[[clang::fallthrough]];")); 16623 EXPECT_EQ(FormatStyle::LK_ObjC, 16624 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 16625 EXPECT_EQ(FormatStyle::LK_Cpp, 16626 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 16627 EXPECT_EQ(FormatStyle::LK_Cpp, 16628 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 16629 EXPECT_EQ(FormatStyle::LK_ObjC, 16630 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 16631 EXPECT_EQ(FormatStyle::LK_Cpp, 16632 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 16633 EXPECT_EQ( 16634 FormatStyle::LK_Cpp, 16635 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 16636 EXPECT_EQ( 16637 FormatStyle::LK_Cpp, 16638 guessLanguage("foo.h", 16639 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 16640 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 16641 } 16642 16643 TEST_F(FormatTest, GuessLanguageWithCaret) { 16644 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 16645 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 16646 EXPECT_EQ(FormatStyle::LK_ObjC, 16647 guessLanguage("foo.h", "int(^)(char, float);")); 16648 EXPECT_EQ(FormatStyle::LK_ObjC, 16649 guessLanguage("foo.h", "int(^foo)(char, float);")); 16650 EXPECT_EQ(FormatStyle::LK_ObjC, 16651 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 16652 EXPECT_EQ(FormatStyle::LK_ObjC, 16653 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 16654 EXPECT_EQ( 16655 FormatStyle::LK_ObjC, 16656 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 16657 } 16658 16659 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) { 16660 // ASM symbolic names are identifiers that must be surrounded by [] without 16661 // space in between: 16662 // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands 16663 16664 // Example from https://bugs.llvm.org/show_bug.cgi?id=45108. 16665 verifyFormat(R"(// 16666 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result)); 16667 )"); 16668 16669 // A list of several ASM symbolic names. 16670 verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)"); 16671 16672 // ASM symbolic names in inline ASM with inputs and outputs. 16673 verifyFormat(R"(// 16674 asm("cmoveq %1, %2, %[result]" 16675 : [result] "=r"(result) 16676 : "r"(test), "r"(new), "[result]"(old)); 16677 )"); 16678 16679 // ASM symbolic names in inline ASM with no outputs. 16680 verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)"); 16681 } 16682 16683 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 16684 EXPECT_EQ(FormatStyle::LK_Cpp, 16685 guessLanguage("foo.h", "void f() {\n" 16686 " asm (\"mov %[e], %[d]\"\n" 16687 " : [d] \"=rm\" (d)\n" 16688 " [e] \"rm\" (*e));\n" 16689 "}")); 16690 EXPECT_EQ(FormatStyle::LK_Cpp, 16691 guessLanguage("foo.h", "void f() {\n" 16692 " _asm (\"mov %[e], %[d]\"\n" 16693 " : [d] \"=rm\" (d)\n" 16694 " [e] \"rm\" (*e));\n" 16695 "}")); 16696 EXPECT_EQ(FormatStyle::LK_Cpp, 16697 guessLanguage("foo.h", "void f() {\n" 16698 " __asm (\"mov %[e], %[d]\"\n" 16699 " : [d] \"=rm\" (d)\n" 16700 " [e] \"rm\" (*e));\n" 16701 "}")); 16702 EXPECT_EQ(FormatStyle::LK_Cpp, 16703 guessLanguage("foo.h", "void f() {\n" 16704 " __asm__ (\"mov %[e], %[d]\"\n" 16705 " : [d] \"=rm\" (d)\n" 16706 " [e] \"rm\" (*e));\n" 16707 "}")); 16708 EXPECT_EQ(FormatStyle::LK_Cpp, 16709 guessLanguage("foo.h", "void f() {\n" 16710 " asm (\"mov %[e], %[d]\"\n" 16711 " : [d] \"=rm\" (d),\n" 16712 " [e] \"rm\" (*e));\n" 16713 "}")); 16714 EXPECT_EQ(FormatStyle::LK_Cpp, 16715 guessLanguage("foo.h", "void f() {\n" 16716 " asm volatile (\"mov %[e], %[d]\"\n" 16717 " : [d] \"=rm\" (d)\n" 16718 " [e] \"rm\" (*e));\n" 16719 "}")); 16720 } 16721 16722 TEST_F(FormatTest, GuessLanguageWithChildLines) { 16723 EXPECT_EQ(FormatStyle::LK_Cpp, 16724 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 16725 EXPECT_EQ(FormatStyle::LK_ObjC, 16726 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 16727 EXPECT_EQ( 16728 FormatStyle::LK_Cpp, 16729 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 16730 EXPECT_EQ( 16731 FormatStyle::LK_ObjC, 16732 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 16733 } 16734 16735 TEST_F(FormatTest, TypenameMacros) { 16736 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 16737 16738 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 16739 FormatStyle Google = getGoogleStyleWithColumns(0); 16740 Google.TypenameMacros = TypenameMacros; 16741 verifyFormat("struct foo {\n" 16742 " int bar;\n" 16743 " TAILQ_ENTRY(a) bleh;\n" 16744 "};", 16745 Google); 16746 16747 FormatStyle Macros = getLLVMStyle(); 16748 Macros.TypenameMacros = TypenameMacros; 16749 16750 verifyFormat("STACK_OF(int) a;", Macros); 16751 verifyFormat("STACK_OF(int) *a;", Macros); 16752 verifyFormat("STACK_OF(int const *) *a;", Macros); 16753 verifyFormat("STACK_OF(int *const) *a;", Macros); 16754 verifyFormat("STACK_OF(int, string) a;", Macros); 16755 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 16756 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 16757 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 16758 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 16759 verifyFormat("vector<LIST(uint64_t) *attr> x;", Macros); 16760 verifyFormat("vector<LIST(uint64_t) *const> f(LIST(uint64_t) *arg);", Macros); 16761 16762 Macros.PointerAlignment = FormatStyle::PAS_Left; 16763 verifyFormat("STACK_OF(int)* a;", Macros); 16764 verifyFormat("STACK_OF(int*)* a;", Macros); 16765 verifyFormat("x = (STACK_OF(uint64_t))*a;", Macros); 16766 verifyFormat("x = (STACK_OF(uint64_t))&a;", Macros); 16767 verifyFormat("vector<STACK_OF(uint64_t)* attr> x;", Macros); 16768 } 16769 16770 TEST_F(FormatTest, AtomicQualifier) { 16771 // Check that we treate _Atomic as a type and not a function call 16772 FormatStyle Google = getGoogleStyleWithColumns(0); 16773 verifyFormat("struct foo {\n" 16774 " int a1;\n" 16775 " _Atomic(a) a2;\n" 16776 " _Atomic(_Atomic(int) *const) a3;\n" 16777 "};", 16778 Google); 16779 verifyFormat("_Atomic(uint64_t) a;"); 16780 verifyFormat("_Atomic(uint64_t) *a;"); 16781 verifyFormat("_Atomic(uint64_t const *) *a;"); 16782 verifyFormat("_Atomic(uint64_t *const) *a;"); 16783 verifyFormat("_Atomic(const uint64_t *) *a;"); 16784 verifyFormat("_Atomic(uint64_t) a;"); 16785 verifyFormat("_Atomic(_Atomic(uint64_t)) a;"); 16786 verifyFormat("_Atomic(_Atomic(uint64_t)) a, b;"); 16787 verifyFormat("for (_Atomic(uint64_t) *a = NULL; a;) {\n}"); 16788 verifyFormat("_Atomic(uint64_t) f(_Atomic(uint64_t) *arg);"); 16789 16790 verifyFormat("_Atomic(uint64_t) *s(InitValue);"); 16791 verifyFormat("_Atomic(uint64_t) *s{InitValue};"); 16792 FormatStyle Style = getLLVMStyle(); 16793 Style.PointerAlignment = FormatStyle::PAS_Left; 16794 verifyFormat("_Atomic(uint64_t)* s(InitValue);", Style); 16795 verifyFormat("_Atomic(uint64_t)* s{InitValue};", Style); 16796 verifyFormat("_Atomic(int)* a;", Style); 16797 verifyFormat("_Atomic(int*)* a;", Style); 16798 verifyFormat("vector<_Atomic(uint64_t)* attr> x;", Style); 16799 16800 Style.SpacesInCStyleCastParentheses = true; 16801 Style.SpacesInParentheses = false; 16802 verifyFormat("x = ( _Atomic(uint64_t) )*a;", Style); 16803 Style.SpacesInCStyleCastParentheses = false; 16804 Style.SpacesInParentheses = true; 16805 verifyFormat("x = (_Atomic( uint64_t ))*a;", Style); 16806 verifyFormat("x = (_Atomic( uint64_t ))&a;", Style); 16807 } 16808 16809 TEST_F(FormatTest, AmbersandInLamda) { 16810 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 16811 FormatStyle AlignStyle = getLLVMStyle(); 16812 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 16813 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 16814 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 16815 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 16816 } 16817 16818 TEST_F(FormatTest, SpacesInConditionalStatement) { 16819 FormatStyle Spaces = getLLVMStyle(); 16820 Spaces.SpacesInConditionalStatement = true; 16821 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 16822 verifyFormat("if ( !a )\n return;", Spaces); 16823 verifyFormat("if ( a )\n return;", Spaces); 16824 verifyFormat("if constexpr ( a )\n return;", Spaces); 16825 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 16826 verifyFormat("while ( a )\n return;", Spaces); 16827 verifyFormat("while ( (a && b) )\n return;", Spaces); 16828 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 16829 verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces); 16830 // Check that space on the left of "::" is inserted as expected at beginning 16831 // of condition. 16832 verifyFormat("while ( ::func() )\n return;", Spaces); 16833 } 16834 16835 TEST_F(FormatTest, AlternativeOperators) { 16836 // Test case for ensuring alternate operators are not 16837 // combined with their right most neighbour. 16838 verifyFormat("int a and b;"); 16839 verifyFormat("int a and_eq b;"); 16840 verifyFormat("int a bitand b;"); 16841 verifyFormat("int a bitor b;"); 16842 verifyFormat("int a compl b;"); 16843 verifyFormat("int a not b;"); 16844 verifyFormat("int a not_eq b;"); 16845 verifyFormat("int a or b;"); 16846 verifyFormat("int a xor b;"); 16847 verifyFormat("int a xor_eq b;"); 16848 verifyFormat("return this not_eq bitand other;"); 16849 verifyFormat("bool operator not_eq(const X bitand other)"); 16850 16851 verifyFormat("int a and 5;"); 16852 verifyFormat("int a and_eq 5;"); 16853 verifyFormat("int a bitand 5;"); 16854 verifyFormat("int a bitor 5;"); 16855 verifyFormat("int a compl 5;"); 16856 verifyFormat("int a not 5;"); 16857 verifyFormat("int a not_eq 5;"); 16858 verifyFormat("int a or 5;"); 16859 verifyFormat("int a xor 5;"); 16860 verifyFormat("int a xor_eq 5;"); 16861 16862 verifyFormat("int a compl(5);"); 16863 verifyFormat("int a not(5);"); 16864 16865 /* FIXME handle alternate tokens 16866 * https://en.cppreference.com/w/cpp/language/operator_alternative 16867 // alternative tokens 16868 verifyFormat("compl foo();"); // ~foo(); 16869 verifyFormat("foo() <%%>;"); // foo(); 16870 verifyFormat("void foo() <%%>;"); // void foo(){} 16871 verifyFormat("int a <:1:>;"); // int a[1];[ 16872 verifyFormat("%:define ABC abc"); // #define ABC abc 16873 verifyFormat("%:%:"); // ## 16874 */ 16875 } 16876 16877 TEST_F(FormatTest, STLWhileNotDefineChed) { 16878 verifyFormat("#if defined(while)\n" 16879 "#define while EMIT WARNING C4005\n" 16880 "#endif // while"); 16881 } 16882 16883 TEST_F(FormatTest, OperatorSpacing) { 16884 FormatStyle Style = getLLVMStyle(); 16885 Style.PointerAlignment = FormatStyle::PAS_Right; 16886 verifyFormat("Foo::operator*();", Style); 16887 verifyFormat("Foo::operator void *();", Style); 16888 verifyFormat("Foo::operator void **();", Style); 16889 verifyFormat("Foo::operator void *&();", Style); 16890 verifyFormat("Foo::operator void *&&();", Style); 16891 verifyFormat("Foo::operator()(void *);", Style); 16892 verifyFormat("Foo::operator*(void *);", Style); 16893 verifyFormat("Foo::operator*();", Style); 16894 verifyFormat("Foo::operator**();", Style); 16895 verifyFormat("Foo::operator&();", Style); 16896 verifyFormat("Foo::operator<int> *();", Style); 16897 verifyFormat("Foo::operator<Foo> *();", Style); 16898 verifyFormat("Foo::operator<int> **();", Style); 16899 verifyFormat("Foo::operator<Foo> **();", Style); 16900 verifyFormat("Foo::operator<int> &();", Style); 16901 verifyFormat("Foo::operator<Foo> &();", Style); 16902 verifyFormat("Foo::operator<int> &&();", Style); 16903 verifyFormat("Foo::operator<Foo> &&();", Style); 16904 verifyFormat("Foo::operator<int> *&();", Style); 16905 verifyFormat("Foo::operator<Foo> *&();", Style); 16906 verifyFormat("Foo::operator<int> *&&();", Style); 16907 verifyFormat("Foo::operator<Foo> *&&();", Style); 16908 verifyFormat("operator*(int (*)(), class Foo);", Style); 16909 16910 verifyFormat("Foo::operator&();", Style); 16911 verifyFormat("Foo::operator void &();", Style); 16912 verifyFormat("Foo::operator()(void &);", Style); 16913 verifyFormat("Foo::operator&(void &);", Style); 16914 verifyFormat("Foo::operator&();", Style); 16915 verifyFormat("operator&(int (&)(), class Foo);", Style); 16916 16917 verifyFormat("Foo::operator&&();", Style); 16918 verifyFormat("Foo::operator**();", Style); 16919 verifyFormat("Foo::operator void &&();", Style); 16920 verifyFormat("Foo::operator()(void &&);", Style); 16921 verifyFormat("Foo::operator&&(void &&);", Style); 16922 verifyFormat("Foo::operator&&();", Style); 16923 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 16924 verifyFormat("operator const nsTArrayRight<E> &()", Style); 16925 verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()", 16926 Style); 16927 verifyFormat("operator void **()", Style); 16928 verifyFormat("operator const FooRight<Object> &()", Style); 16929 verifyFormat("operator const FooRight<Object> *()", Style); 16930 verifyFormat("operator const FooRight<Object> **()", Style); 16931 verifyFormat("operator const FooRight<Object> *&()", Style); 16932 verifyFormat("operator const FooRight<Object> *&&()", Style); 16933 16934 Style.PointerAlignment = FormatStyle::PAS_Left; 16935 verifyFormat("Foo::operator*();", Style); 16936 verifyFormat("Foo::operator**();", Style); 16937 verifyFormat("Foo::operator void*();", Style); 16938 verifyFormat("Foo::operator void**();", Style); 16939 verifyFormat("Foo::operator void*&();", Style); 16940 verifyFormat("Foo::operator/*comment*/ void*();", Style); 16941 verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); 16942 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); 16943 verifyFormat("Foo::operator()(void*);", Style); 16944 verifyFormat("Foo::operator*(void*);", Style); 16945 verifyFormat("Foo::operator*();", Style); 16946 verifyFormat("Foo::operator<int>*();", Style); 16947 verifyFormat("Foo::operator<Foo>*();", Style); 16948 verifyFormat("Foo::operator<int>**();", Style); 16949 verifyFormat("Foo::operator<Foo>**();", Style); 16950 verifyFormat("Foo::operator<Foo>*&();", Style); 16951 verifyFormat("Foo::operator<int>&();", Style); 16952 verifyFormat("Foo::operator<Foo>&();", Style); 16953 verifyFormat("Foo::operator<int>&&();", Style); 16954 verifyFormat("Foo::operator<Foo>&&();", Style); 16955 verifyFormat("Foo::operator<int>*&();", Style); 16956 verifyFormat("Foo::operator<Foo>*&();", Style); 16957 verifyFormat("operator*(int (*)(), class Foo);", Style); 16958 16959 verifyFormat("Foo::operator&();", Style); 16960 verifyFormat("Foo::operator void&();", Style); 16961 verifyFormat("Foo::operator/*comment*/ void&();", Style); 16962 verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); 16963 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); 16964 verifyFormat("Foo::operator()(void&);", Style); 16965 verifyFormat("Foo::operator&(void&);", Style); 16966 verifyFormat("Foo::operator&();", Style); 16967 verifyFormat("operator&(int (&)(), class Foo);", Style); 16968 16969 verifyFormat("Foo::operator&&();", Style); 16970 verifyFormat("Foo::operator void&&();", Style); 16971 verifyFormat("Foo::operator/*comment*/ void&&();", Style); 16972 verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); 16973 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); 16974 verifyFormat("Foo::operator()(void&&);", Style); 16975 verifyFormat("Foo::operator&&(void&&);", Style); 16976 verifyFormat("Foo::operator&&();", Style); 16977 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 16978 verifyFormat("operator const nsTArrayLeft<E>&()", Style); 16979 verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()", 16980 Style); 16981 verifyFormat("operator void**()", Style); 16982 verifyFormat("operator const FooLeft<Object>&()", Style); 16983 verifyFormat("operator const FooLeft<Object>*()", Style); 16984 verifyFormat("operator const FooLeft<Object>**()", Style); 16985 verifyFormat("operator const FooLeft<Object>*&()", Style); 16986 verifyFormat("operator const FooLeft<Object>*&&()", Style); 16987 16988 // PR45107 16989 verifyFormat("operator Vector<String>&();", Style); 16990 verifyFormat("operator const Vector<String>&();", Style); 16991 verifyFormat("operator foo::Bar*();", Style); 16992 verifyFormat("operator const Foo<X>::Bar<Y>*();", Style); 16993 verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();", 16994 Style); 16995 16996 Style.PointerAlignment = FormatStyle::PAS_Middle; 16997 verifyFormat("Foo::operator*();", Style); 16998 verifyFormat("Foo::operator void *();", Style); 16999 verifyFormat("Foo::operator()(void *);", Style); 17000 verifyFormat("Foo::operator*(void *);", Style); 17001 verifyFormat("Foo::operator*();", Style); 17002 verifyFormat("operator*(int (*)(), class Foo);", Style); 17003 17004 verifyFormat("Foo::operator&();", Style); 17005 verifyFormat("Foo::operator void &();", Style); 17006 verifyFormat("Foo::operator()(void &);", Style); 17007 verifyFormat("Foo::operator&(void &);", Style); 17008 verifyFormat("Foo::operator&();", Style); 17009 verifyFormat("operator&(int (&)(), class Foo);", Style); 17010 17011 verifyFormat("Foo::operator&&();", Style); 17012 verifyFormat("Foo::operator void &&();", Style); 17013 verifyFormat("Foo::operator()(void &&);", Style); 17014 verifyFormat("Foo::operator&&(void &&);", Style); 17015 verifyFormat("Foo::operator&&();", Style); 17016 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 17017 } 17018 17019 TEST_F(FormatTest, OperatorPassedAsAFunctionPtr) { 17020 FormatStyle Style = getLLVMStyle(); 17021 // PR46157 17022 verifyFormat("foo(operator+, -42);", Style); 17023 verifyFormat("foo(operator++, -42);", Style); 17024 verifyFormat("foo(operator--, -42);", Style); 17025 verifyFormat("foo(-42, operator--);", Style); 17026 verifyFormat("foo(-42, operator, );", Style); 17027 verifyFormat("foo(operator, , -42);", Style); 17028 } 17029 17030 TEST_F(FormatTest, WhitespaceSensitiveMacros) { 17031 FormatStyle Style = getLLVMStyle(); 17032 Style.WhitespaceSensitiveMacros.push_back("FOO"); 17033 17034 // Don't use the helpers here, since 'mess up' will change the whitespace 17035 // and these are all whitespace sensitive by definition 17036 EXPECT_EQ("FOO(String-ized&Messy+But(: :Still)=Intentional);", 17037 format("FOO(String-ized&Messy+But(: :Still)=Intentional);", Style)); 17038 EXPECT_EQ( 17039 "FOO(String-ized&Messy+But\\(: :Still)=Intentional);", 17040 format("FOO(String-ized&Messy+But\\(: :Still)=Intentional);", Style)); 17041 EXPECT_EQ("FOO(String-ized&Messy+But,: :Still=Intentional);", 17042 format("FOO(String-ized&Messy+But,: :Still=Intentional);", Style)); 17043 EXPECT_EQ("FOO(String-ized&Messy+But,: :\n" 17044 " Still=Intentional);", 17045 format("FOO(String-ized&Messy+But,: :\n" 17046 " Still=Intentional);", 17047 Style)); 17048 Style.AlignConsecutiveAssignments = true; 17049 EXPECT_EQ("FOO(String-ized=&Messy+But,: :\n" 17050 " Still=Intentional);", 17051 format("FOO(String-ized=&Messy+But,: :\n" 17052 " Still=Intentional);", 17053 Style)); 17054 17055 Style.ColumnLimit = 21; 17056 EXPECT_EQ("FOO(String-ized&Messy+But: :Still=Intentional);", 17057 format("FOO(String-ized&Messy+But: :Still=Intentional);", Style)); 17058 } 17059 17060 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) { 17061 // These tests are not in NamespaceFixer because that doesn't 17062 // test its interaction with line wrapping 17063 FormatStyle Style = getLLVMStyle(); 17064 Style.ColumnLimit = 80; 17065 verifyFormat("namespace {\n" 17066 "int i;\n" 17067 "int j;\n" 17068 "} // namespace", 17069 Style); 17070 17071 verifyFormat("namespace AAA {\n" 17072 "int i;\n" 17073 "int j;\n" 17074 "} // namespace AAA", 17075 Style); 17076 17077 EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n" 17078 "int i;\n" 17079 "int j;\n" 17080 "} // namespace Averyveryveryverylongnamespace", 17081 format("namespace Averyveryveryverylongnamespace {\n" 17082 "int i;\n" 17083 "int j;\n" 17084 "}", 17085 Style)); 17086 17087 EXPECT_EQ( 17088 "namespace " 17089 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 17090 " went::mad::now {\n" 17091 "int i;\n" 17092 "int j;\n" 17093 "} // namespace\n" 17094 " // " 17095 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 17096 "went::mad::now", 17097 format("namespace " 17098 "would::it::save::you::a::lot::of::time::if_::i::" 17099 "just::gave::up::and_::went::mad::now {\n" 17100 "int i;\n" 17101 "int j;\n" 17102 "}", 17103 Style)); 17104 17105 // This used to duplicate the comment again and again on subsequent runs 17106 EXPECT_EQ( 17107 "namespace " 17108 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 17109 " went::mad::now {\n" 17110 "int i;\n" 17111 "int j;\n" 17112 "} // namespace\n" 17113 " // " 17114 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 17115 "went::mad::now", 17116 format("namespace " 17117 "would::it::save::you::a::lot::of::time::if_::i::" 17118 "just::gave::up::and_::went::mad::now {\n" 17119 "int i;\n" 17120 "int j;\n" 17121 "} // namespace\n" 17122 " // " 17123 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::" 17124 "and_::went::mad::now", 17125 Style)); 17126 } 17127 17128 TEST_F(FormatTest, LikelyUnlikely) { 17129 FormatStyle Style = getLLVMStyle(); 17130 17131 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17132 " return 29;\n" 17133 "}", 17134 Style); 17135 17136 verifyFormat("if (argc > 5) [[likely]] {\n" 17137 " return 29;\n" 17138 "}", 17139 Style); 17140 17141 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17142 " return 29;\n" 17143 "} else [[likely]] {\n" 17144 " return 42;\n" 17145 "}\n", 17146 Style); 17147 17148 verifyFormat("if (argc > 5) [[unlikely]] {\n" 17149 " return 29;\n" 17150 "} else if (argc > 10) [[likely]] {\n" 17151 " return 99;\n" 17152 "} else {\n" 17153 " return 42;\n" 17154 "}\n", 17155 Style); 17156 17157 verifyFormat("if (argc > 5) [[gnu::unused]] {\n" 17158 " return 29;\n" 17159 "}", 17160 Style); 17161 } 17162 17163 TEST_F(FormatTest, LLVMDefaultStyle) { 17164 FormatStyle Style = getLLVMStyle(); 17165 verifyFormat("extern \"C\" {\n" 17166 "int foo();\n" 17167 "}", 17168 Style); 17169 } 17170 TEST_F(FormatTest, GNUDefaultStyle) { 17171 FormatStyle Style = getGNUStyle(); 17172 verifyFormat("extern \"C\"\n" 17173 "{\n" 17174 " int foo ();\n" 17175 "}", 17176 Style); 17177 } 17178 TEST_F(FormatTest, MozillaDefaultStyle) { 17179 FormatStyle Style = getMozillaStyle(); 17180 verifyFormat("extern \"C\"\n" 17181 "{\n" 17182 " int foo();\n" 17183 "}", 17184 Style); 17185 } 17186 TEST_F(FormatTest, GoogleDefaultStyle) { 17187 FormatStyle Style = getGoogleStyle(); 17188 verifyFormat("extern \"C\" {\n" 17189 "int foo();\n" 17190 "}", 17191 Style); 17192 } 17193 TEST_F(FormatTest, ChromiumDefaultStyle) { 17194 FormatStyle Style = getChromiumStyle(FormatStyle::LanguageKind::LK_Cpp); 17195 verifyFormat("extern \"C\" {\n" 17196 "int foo();\n" 17197 "}", 17198 Style); 17199 } 17200 TEST_F(FormatTest, MicrosoftDefaultStyle) { 17201 FormatStyle Style = getMicrosoftStyle(FormatStyle::LanguageKind::LK_Cpp); 17202 verifyFormat("extern \"C\"\n" 17203 "{\n" 17204 " int foo();\n" 17205 "}", 17206 Style); 17207 } 17208 TEST_F(FormatTest, WebKitDefaultStyle) { 17209 FormatStyle Style = getWebKitStyle(); 17210 verifyFormat("extern \"C\" {\n" 17211 "int foo();\n" 17212 "}", 17213 Style); 17214 } 17215 } // namespace 17216 } // namespace format 17217 } // namespace clang 17218