1 //===- NamespaceEndCommentsFixerTest.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 "clang/Frontend/TextDiagnosticPrinter.h" 12 #include "llvm/Support/Debug.h" 13 #include "gtest/gtest.h" 14 15 #define DEBUG_TYPE "namespace-end-comments-fixer-test" 16 17 namespace clang { 18 namespace format { 19 namespace { 20 21 class NamespaceEndCommentsFixerTest : public ::testing::Test { 22 protected: 23 std::string 24 fixNamespaceEndComments(llvm::StringRef Code, 25 const std::vector<tooling::Range> &Ranges, 26 const FormatStyle &Style = getLLVMStyle()) { 27 LLVM_DEBUG(llvm::errs() << "---\n"); 28 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 29 tooling::Replacements Replaces = 30 clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>"); 31 auto Result = applyAllReplacements(Code, Replaces); 32 EXPECT_TRUE(static_cast<bool>(Result)); 33 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 34 return *Result; 35 } 36 37 std::string 38 fixNamespaceEndComments(llvm::StringRef Code, 39 const FormatStyle &Style = getLLVMStyle()) { 40 return fixNamespaceEndComments( 41 Code, 42 /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style); 43 } 44 }; 45 46 TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) { 47 EXPECT_EQ("namespace {\n" 48 " int i;\n" 49 " int j;\n" 50 "}// namespace", 51 fixNamespaceEndComments("namespace {\n" 52 " int i;\n" 53 " int j;\n" 54 "}")); 55 EXPECT_EQ("namespace {\n" 56 " int i;\n" 57 " int j;\n" 58 "}// namespace\n", 59 fixNamespaceEndComments("namespace {\n" 60 " int i;\n" 61 " int j;\n" 62 "}\n")); 63 EXPECT_EQ("namespace A {\n" 64 " int i;\n" 65 " int j;\n" 66 "}// namespace A", 67 fixNamespaceEndComments("namespace A {\n" 68 " int i;\n" 69 " int j;\n" 70 "}")); 71 EXPECT_EQ("inline namespace A {\n" 72 " int i;\n" 73 " int j;\n" 74 "}// namespace A", 75 fixNamespaceEndComments("inline namespace A {\n" 76 " int i;\n" 77 " int j;\n" 78 "}")); 79 EXPECT_EQ("namespace ::A {\n" 80 " int i;\n" 81 " int j;\n" 82 "}// namespace ::A", 83 fixNamespaceEndComments("namespace ::A {\n" 84 " int i;\n" 85 " int j;\n" 86 "}")); 87 EXPECT_EQ("namespace ::A::B {\n" 88 " int i;\n" 89 " int j;\n" 90 "}// namespace ::A::B", 91 fixNamespaceEndComments("namespace ::A::B {\n" 92 " int i;\n" 93 " int j;\n" 94 "}")); 95 EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n" 96 " int i;\n" 97 " int j;\n" 98 "}// namespace ::A::B", 99 fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n" 100 " int i;\n" 101 " int j;\n" 102 "}")); 103 EXPECT_EQ("namespace A {\n" 104 "namespace B {\n" 105 " int i;\n" 106 "}\n" 107 "}// namespace A", 108 fixNamespaceEndComments("namespace A {\n" 109 "namespace B {\n" 110 " int i;\n" 111 "}\n" 112 "}")); 113 EXPECT_EQ("namespace A {\n" 114 "namespace B {\n" 115 " int i;\n" 116 " int j;\n" 117 "}// namespace B\n" 118 "}// namespace A", 119 fixNamespaceEndComments("namespace A {\n" 120 "namespace B {\n" 121 " int i;\n" 122 " int j;\n" 123 "}\n" 124 "}")); 125 EXPECT_EQ("namespace A {\n" 126 " int a;\n" 127 " int b;\n" 128 "}// namespace A\n" 129 "namespace B {\n" 130 " int b;\n" 131 " int a;\n" 132 "}// namespace B", 133 fixNamespaceEndComments("namespace A {\n" 134 " int a;\n" 135 " int b;\n" 136 "}\n" 137 "namespace B {\n" 138 " int b;\n" 139 " int a;\n" 140 "}")); 141 EXPECT_EQ("namespace A {\n" 142 " int a1;\n" 143 " int a2;\n" 144 "}// namespace A\n" 145 "namespace A {\n" 146 " int a2;\n" 147 " int a1;\n" 148 "}// namespace A", 149 fixNamespaceEndComments("namespace A {\n" 150 " int a1;\n" 151 " int a2;\n" 152 "}\n" 153 "namespace A {\n" 154 " int a2;\n" 155 " int a1;\n" 156 "}")); 157 EXPECT_EQ("namespace A {\n" 158 " int a;\n" 159 " int b;\n" 160 "}// namespace A\n" 161 "// comment about b\n" 162 "int b;", 163 fixNamespaceEndComments("namespace A {\n" 164 " int a;\n" 165 " int b;\n" 166 "}\n" 167 "// comment about b\n" 168 "int b;")); 169 170 EXPECT_EQ("namespace A {\n" 171 "namespace B {\n" 172 "namespace C {\n" 173 "namespace D {\n" 174 "}\n" 175 "}// namespace C\n" 176 "}// namespace B\n" 177 "}// namespace A", 178 fixNamespaceEndComments("namespace A {\n" 179 "namespace B {\n" 180 "namespace C {\n" 181 "namespace D {\n" 182 "}\n" 183 "}\n" 184 "}\n" 185 "}")); 186 187 // Add comment for namespaces which will be 'compacted' 188 FormatStyle CompactNamespacesStyle = getLLVMStyle(); 189 CompactNamespacesStyle.CompactNamespaces = true; 190 EXPECT_EQ("namespace out { namespace in {\n" 191 "int i;\n" 192 "int j;\n" 193 "}}// namespace out::in", 194 fixNamespaceEndComments("namespace out { namespace in {\n" 195 "int i;\n" 196 "int j;\n" 197 "}}", 198 CompactNamespacesStyle)); 199 EXPECT_EQ("namespace out {\n" 200 "namespace in {\n" 201 "int i;\n" 202 "int j;\n" 203 "}\n" 204 "}// namespace out::in", 205 fixNamespaceEndComments("namespace out {\n" 206 "namespace in {\n" 207 "int i;\n" 208 "int j;\n" 209 "}\n" 210 "}", 211 CompactNamespacesStyle)); 212 EXPECT_EQ("namespace out { namespace in {\n" 213 "int i;\n" 214 "int j;\n" 215 "};}// namespace out::in", 216 fixNamespaceEndComments("namespace out { namespace in {\n" 217 "int i;\n" 218 "int j;\n" 219 "};}", 220 CompactNamespacesStyle)); 221 222 // Adds an end comment after a semicolon. 223 EXPECT_EQ("namespace {\n" 224 " int i;\n" 225 " int j;\n" 226 "};// namespace", 227 fixNamespaceEndComments("namespace {\n" 228 " int i;\n" 229 " int j;\n" 230 "};")); 231 EXPECT_EQ("namespace A {\n" 232 " int i;\n" 233 " int j;\n" 234 "};// namespace A", 235 fixNamespaceEndComments("namespace A {\n" 236 " int i;\n" 237 " int j;\n" 238 "};")); 239 EXPECT_EQ("namespace A {\n" 240 " int i;\n" 241 " int j;\n" 242 "};// namespace A\n" 243 "// unrelated", 244 fixNamespaceEndComments("namespace A {\n" 245 " int i;\n" 246 " int j;\n" 247 "};\n" 248 "// unrelated")); 249 } 250 251 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) { 252 EXPECT_EQ("namespace A {\n" 253 " int i;\n" 254 " int j;\n" 255 "}// namespace A\n" 256 " int k;", 257 fixNamespaceEndComments("namespace A {\n" 258 " int i;\n" 259 " int j;\n" 260 "} int k;")); 261 EXPECT_EQ("namespace {\n" 262 " int i;\n" 263 " int j;\n" 264 "}// namespace\n" 265 " int k;", 266 fixNamespaceEndComments("namespace {\n" 267 " int i;\n" 268 " int j;\n" 269 "} int k;")); 270 EXPECT_EQ("namespace A {\n" 271 " int i;\n" 272 " int j;\n" 273 "}// namespace A\n" 274 " namespace B {\n" 275 " int j;\n" 276 " int k;\n" 277 "}// namespace B", 278 fixNamespaceEndComments("namespace A {\n" 279 " int i;\n" 280 " int j;\n" 281 "} namespace B {\n" 282 " int j;\n" 283 " int k;\n" 284 "}")); 285 EXPECT_EQ("namespace {\n" 286 " int i;\n" 287 " int j;\n" 288 "};// namespace\n" 289 "int k;", 290 fixNamespaceEndComments("namespace {\n" 291 " int i;\n" 292 " int j;\n" 293 "};int k;")); 294 EXPECT_EQ("namespace {\n" 295 " int i;\n" 296 " int j;\n" 297 "};// namespace\n" 298 ";", 299 fixNamespaceEndComments("namespace {\n" 300 " int i;\n" 301 " int j;\n" 302 "};;")); 303 } 304 305 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) { 306 EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}")); 307 EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}")); 308 EXPECT_EQ("namespace A { a }", 309 fixNamespaceEndComments("namespace A { a }")); 310 EXPECT_EQ("namespace A { a };", 311 fixNamespaceEndComments("namespace A { a };")); 312 } 313 314 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) { 315 EXPECT_EQ("namespace A {\n" 316 " int i;\n" 317 "}", 318 fixNamespaceEndComments("namespace A {\n" 319 " int i;\n" 320 "}", 321 // The range (16, 3) spans the 'int' above. 322 /*Ranges=*/{1, tooling::Range(16, 3)})); 323 EXPECT_EQ("namespace A {\n" 324 " int i;\n" 325 "};", 326 fixNamespaceEndComments("namespace A {\n" 327 " int i;\n" 328 "};", 329 // The range (16, 3) spans the 'int' above. 330 /*Ranges=*/{1, tooling::Range(16, 3)})); 331 } 332 333 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) { 334 EXPECT_EQ("#define SAD \\\n" 335 "namespace A { \\\n" 336 " int i; \\\n" 337 "}", 338 fixNamespaceEndComments("#define SAD \\\n" 339 "namespace A { \\\n" 340 " int i; \\\n" 341 "}")); 342 } 343 344 TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) { 345 EXPECT_EQ("namespace {\n" 346 " int i;\n" 347 "} // end anonymous namespace", 348 fixNamespaceEndComments("namespace {\n" 349 " int i;\n" 350 "} // end anonymous namespace")); 351 EXPECT_EQ("namespace A {\n" 352 " int i;\n" 353 "} /* end of namespace A */", 354 fixNamespaceEndComments("namespace A {\n" 355 " int i;\n" 356 "} /* end of namespace A */")); 357 EXPECT_EQ("namespace A {\n" 358 " int i;\n" 359 "} // namespace A", 360 fixNamespaceEndComments("namespace A {\n" 361 " int i;\n" 362 "} // namespace A")); 363 EXPECT_EQ("namespace A::B {\n" 364 " int i;\n" 365 "} // end namespace A::B", 366 fixNamespaceEndComments("namespace A::B {\n" 367 " int i;\n" 368 "} // end namespace A::B")); 369 EXPECT_EQ("namespace A {\n" 370 " int i;\n" 371 "}; // end namespace A", 372 fixNamespaceEndComments("namespace A {\n" 373 " int i;\n" 374 "}; // end namespace A")); 375 EXPECT_EQ("namespace {\n" 376 " int i;\n" 377 "}; /* unnamed namespace */", 378 fixNamespaceEndComments("namespace {\n" 379 " int i;\n" 380 "}; /* unnamed namespace */")); 381 } 382 383 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) { 384 EXPECT_EQ("namespace {\n" 385 " int i;\n" 386 "} // namespace", 387 fixNamespaceEndComments("namespace {\n" 388 " int i;\n" 389 "} // namespace A")); 390 EXPECT_EQ("namespace A {\n" 391 " int i;\n" 392 "} // namespace A", 393 fixNamespaceEndComments("namespace A {\n" 394 " int i;\n" 395 "} // namespace")); 396 EXPECT_EQ("namespace A {\n" 397 " int i;\n" 398 "} // namespace A", 399 fixNamespaceEndComments("namespace A {\n" 400 " int i;\n" 401 "} //")); 402 EXPECT_EQ("namespace A {\n" 403 " int i;\n" 404 "} // namespace A", 405 fixNamespaceEndComments("namespace A {\n" 406 " int i;\n" 407 "} //")); 408 EXPECT_EQ("namespace A {\n" 409 " int i;\n" 410 "} // namespace A", 411 fixNamespaceEndComments("namespace A {\n" 412 " int i;\n" 413 "} // banamespace A")); 414 EXPECT_EQ("namespace A {\n" 415 " int i;\n" 416 "}; // namespace A", 417 fixNamespaceEndComments("namespace A {\n" 418 " int i;\n" 419 "}; // banamespace A")); 420 // Updates invalid line comments even for short namespaces. 421 EXPECT_EQ("namespace A {} // namespace A", 422 fixNamespaceEndComments("namespace A {} // namespace")); 423 EXPECT_EQ("namespace A {}; // namespace A", 424 fixNamespaceEndComments("namespace A {}; // namespace")); 425 426 // Update invalid comments for compacted namespaces. 427 FormatStyle CompactNamespacesStyle = getLLVMStyle(); 428 CompactNamespacesStyle.CompactNamespaces = true; 429 EXPECT_EQ("namespace out { namespace in {\n" 430 "}} // namespace out::in", 431 fixNamespaceEndComments("namespace out { namespace in {\n" 432 "}} // namespace out", 433 CompactNamespacesStyle)); 434 EXPECT_EQ("namespace out { namespace in {\n" 435 "}} // namespace out::in", 436 fixNamespaceEndComments("namespace out { namespace in {\n" 437 "}} // namespace in", 438 CompactNamespacesStyle)); 439 EXPECT_EQ("namespace out { namespace in {\n" 440 "}\n" 441 "} // namespace out::in", 442 fixNamespaceEndComments("namespace out { namespace in {\n" 443 "}// banamespace in\n" 444 "} // namespace out", 445 CompactNamespacesStyle)); 446 } 447 448 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) { 449 EXPECT_EQ("namespace {\n" 450 " int i;\n" 451 "} // namespace", 452 fixNamespaceEndComments("namespace {\n" 453 " int i;\n" 454 "} /* namespace A */")); 455 EXPECT_EQ("namespace A {\n" 456 " int i;\n" 457 "} // namespace A", 458 fixNamespaceEndComments("namespace A {\n" 459 " int i;\n" 460 "} /* end namespace */")); 461 EXPECT_EQ("namespace A {\n" 462 " int i;\n" 463 "} // namespace A", 464 fixNamespaceEndComments("namespace A {\n" 465 " int i;\n" 466 "} /**/")); 467 EXPECT_EQ("namespace A {\n" 468 " int i;\n" 469 "} // namespace A", 470 fixNamespaceEndComments("namespace A {\n" 471 " int i;\n" 472 "} /* end unnamed namespace */")); 473 EXPECT_EQ("namespace A {\n" 474 " int i;\n" 475 "} // namespace A", 476 fixNamespaceEndComments("namespace A {\n" 477 " int i;\n" 478 "} /* banamespace A */")); 479 EXPECT_EQ("namespace A {\n" 480 " int i;\n" 481 "}; // namespace A", 482 fixNamespaceEndComments("namespace A {\n" 483 " int i;\n" 484 "}; /* banamespace A */")); 485 EXPECT_EQ("namespace A {} // namespace A", 486 fixNamespaceEndComments("namespace A {} /**/")); 487 EXPECT_EQ("namespace A {}; // namespace A", 488 fixNamespaceEndComments("namespace A {}; /**/")); 489 } 490 491 TEST_F(NamespaceEndCommentsFixerTest, 492 DoesNotAddEndCommentForNamespacesControlledByMacros) { 493 EXPECT_EQ("#ifdef 1\n" 494 "namespace A {\n" 495 "#elseif\n" 496 "namespace B {\n" 497 "#endif\n" 498 " int i;\n" 499 "}\n" 500 "}\n", 501 fixNamespaceEndComments("#ifdef 1\n" 502 "namespace A {\n" 503 "#elseif\n" 504 "namespace B {\n" 505 "#endif\n" 506 " int i;\n" 507 "}\n" 508 "}\n")); 509 } 510 511 TEST_F(NamespaceEndCommentsFixerTest, AddEndCommentForNamespacesAroundMacros) { 512 // Conditional blocks around are fine 513 EXPECT_EQ("namespace A {\n" 514 "#if 1\n" 515 "int i;\n" 516 "#endif\n" 517 "}// namespace A", 518 fixNamespaceEndComments("namespace A {\n" 519 "#if 1\n" 520 "int i;\n" 521 "#endif\n" 522 "}")); 523 EXPECT_EQ("#if 1\n" 524 "#endif\n" 525 "namespace A {\n" 526 "int i;\n" 527 "int j;\n" 528 "}// namespace A", 529 fixNamespaceEndComments("#if 1\n" 530 "#endif\n" 531 "namespace A {\n" 532 "int i;\n" 533 "int j;\n" 534 "}")); 535 EXPECT_EQ("namespace A {\n" 536 "int i;\n" 537 "int j;\n" 538 "}// namespace A\n" 539 "#if 1\n" 540 "#endif", 541 fixNamespaceEndComments("namespace A {\n" 542 "int i;\n" 543 "int j;\n" 544 "}\n" 545 "#if 1\n" 546 "#endif")); 547 EXPECT_EQ("#if 1\n" 548 "namespace A {\n" 549 "int i;\n" 550 "int j;\n" 551 "}// namespace A\n" 552 "#endif", 553 fixNamespaceEndComments("#if 1\n" 554 "namespace A {\n" 555 "int i;\n" 556 "int j;\n" 557 "}\n" 558 "#endif")); 559 560 // Macro definition has no impact 561 EXPECT_EQ("namespace A {\n" 562 "#define FOO\n" 563 "int i;\n" 564 "}// namespace A", 565 fixNamespaceEndComments("namespace A {\n" 566 "#define FOO\n" 567 "int i;\n" 568 "}")); 569 EXPECT_EQ("#define FOO\n" 570 "namespace A {\n" 571 "int i;\n" 572 "int j;\n" 573 "}// namespace A", 574 fixNamespaceEndComments("#define FOO\n" 575 "namespace A {\n" 576 "int i;\n" 577 "int j;\n" 578 "}")); 579 EXPECT_EQ("namespace A {\n" 580 "int i;\n" 581 "int j;\n" 582 "}// namespace A\n" 583 "#define FOO\n", 584 fixNamespaceEndComments("namespace A {\n" 585 "int i;\n" 586 "int j;\n" 587 "}\n" 588 "#define FOO\n")); 589 590 // No replacement if open & close in different conditional blocks 591 EXPECT_EQ("#if 1\n" 592 "namespace A {\n" 593 "#endif\n" 594 "int i;\n" 595 "int j;\n" 596 "#if 1\n" 597 "}\n" 598 "#endif", 599 fixNamespaceEndComments("#if 1\n" 600 "namespace A {\n" 601 "#endif\n" 602 "int i;\n" 603 "int j;\n" 604 "#if 1\n" 605 "}\n" 606 "#endif")); 607 EXPECT_EQ("#ifdef A\n" 608 "namespace A {\n" 609 "#endif\n" 610 "int i;\n" 611 "int j;\n" 612 "#ifdef B\n" 613 "}\n" 614 "#endif", 615 fixNamespaceEndComments("#ifdef A\n" 616 "namespace A {\n" 617 "#endif\n" 618 "int i;\n" 619 "int j;\n" 620 "#ifdef B\n" 621 "}\n" 622 "#endif")); 623 624 // No replacement inside unreachable conditional block 625 EXPECT_EQ("#if 0\n" 626 "namespace A {\n" 627 "int i;\n" 628 "int j;\n" 629 "}\n" 630 "#endif", 631 fixNamespaceEndComments("#if 0\n" 632 "namespace A {\n" 633 "int i;\n" 634 "int j;\n" 635 "}\n" 636 "#endif")); 637 } 638 639 TEST_F(NamespaceEndCommentsFixerTest, 640 DoesNotAddEndCommentForNamespacesInMacroDeclarations) { 641 EXPECT_EQ("#ifdef 1\n" 642 "namespace A {\n" 643 "#elseif\n" 644 "namespace B {\n" 645 "#endif\n" 646 " int i;\n" 647 "}\n" 648 "}\n", 649 fixNamespaceEndComments("#ifdef 1\n" 650 "namespace A {\n" 651 "#elseif\n" 652 "namespace B {\n" 653 "#endif\n" 654 " int i;\n" 655 "}\n" 656 "}\n")); 657 EXPECT_EQ("namespace {\n" 658 " int i;\n" 659 " int j;\n" 660 "}// namespace\n" 661 "#if A\n" 662 " int i;\n" 663 "#else\n" 664 " int j;\n" 665 "#endif", 666 fixNamespaceEndComments("namespace {\n" 667 " int i;\n" 668 " int j;\n" 669 "}\n" 670 "#if A\n" 671 " int i;\n" 672 "#else\n" 673 " int j;\n" 674 "#endif")); 675 EXPECT_EQ("#if A\n" 676 "namespace A {\n" 677 "#else\n" 678 "namespace B {\n" 679 "#endif\n" 680 "int i;\n" 681 "int j;\n" 682 "}", 683 fixNamespaceEndComments("#if A\n" 684 "namespace A {\n" 685 "#else\n" 686 "namespace B {\n" 687 "#endif\n" 688 "int i;\n" 689 "int j;\n" 690 "}")); 691 EXPECT_EQ("#if A\n" 692 "namespace A {\n" 693 "#else\n" 694 "namespace B {\n" 695 "#endif\n" 696 "int i;\n" 697 "int j;\n" 698 "} // namespace A", 699 fixNamespaceEndComments("#if A\n" 700 "namespace A {\n" 701 "#else\n" 702 "namespace B {\n" 703 "#endif\n" 704 "int i;\n" 705 "int j;\n" 706 "} // namespace A")); 707 EXPECT_EQ("#if A\n" 708 "namespace A {\n" 709 "#else\n" 710 "namespace B {\n" 711 "#endif\n" 712 "int i;\n" 713 "int j;\n" 714 "} // namespace B", 715 fixNamespaceEndComments("#if A\n" 716 "namespace A {\n" 717 "#else\n" 718 "namespace B {\n" 719 "#endif\n" 720 "int i;\n" 721 "int j;\n" 722 "} // namespace B")); 723 EXPECT_EQ("namespace A\n" 724 "int i;\n" 725 "int j;\n" 726 "#if A\n" 727 "}\n" 728 "#else\n" 729 "}\n" 730 "#endif", 731 fixNamespaceEndComments("namespace A\n" 732 "int i;\n" 733 "int j;\n" 734 "#if A\n" 735 "}\n" 736 "#else\n" 737 "}\n" 738 "#endif")); 739 EXPECT_EQ("namespace A\n" 740 "int i;\n" 741 "int j;\n" 742 "#if A\n" 743 "} // namespace A\n" 744 "#else\n" 745 "} // namespace A\n" 746 "#endif", 747 fixNamespaceEndComments("namespace A\n" 748 "int i;\n" 749 "int j;\n" 750 "#if A\n" 751 "} // namespace A\n" 752 "#else\n" 753 "} // namespace A\n" 754 "#endif")); 755 } 756 757 TEST_F(NamespaceEndCommentsFixerTest, 758 DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) { 759 EXPECT_EQ("namespace {\n" 760 " int i;\n" 761 "} // namespace\n" 762 "}", 763 fixNamespaceEndComments("namespace {\n" 764 " int i;\n" 765 "} // namespace\n" 766 "}")); 767 } 768 769 TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) { 770 EXPECT_EQ("template <int> struct a {};\n" 771 "struct a<bool{}> b() {\n" 772 "}\n" 773 "#define c inline\n" 774 "void d() {\n" 775 "}\n", 776 fixNamespaceEndComments("template <int> struct a {};\n" 777 "struct a<bool{}> b() {\n" 778 "}\n" 779 "#define c inline\n" 780 "void d() {\n" 781 "}\n")); 782 } 783 } // end namespace 784 } // end namespace format 785 } // end namespace clang 786