1457 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "clang/Format/Format.h"10 11#include "llvm/Support/Debug.h"12#include "gtest/gtest.h"13 14#define DEBUG_TYPE "namespace-end-comments-fixer-test"15 16namespace clang {17namespace format {18namespace {19 20class NamespaceEndCommentsFixerTest : public testing::Test {21protected:22 std::string23 fixNamespaceEndComments(StringRef Code,24 const std::vector<tooling::Range> &Ranges,25 const FormatStyle &Style = getLLVMStyle()) {26 LLVM_DEBUG(llvm::errs() << "---\n");27 LLVM_DEBUG(llvm::errs() << Code << "\n\n");28 tooling::Replacements Replaces =29 format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>");30 auto Result = applyAllReplacements(Code, Replaces);31 EXPECT_TRUE(static_cast<bool>(Result));32 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");33 return *Result;34 }35 36 std::string37 fixNamespaceEndComments(StringRef Code,38 const FormatStyle &Style = getLLVMStyle()) {39 return fixNamespaceEndComments(40 Code,41 /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style);42 }43 44 bool isFormatted(StringRef Code, const std::vector<tooling::Range> &Ranges,45 const FormatStyle &Style = getLLVMStyle()) const {46 return format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>")47 .empty();48 }49 50 bool isFormatted(StringRef Code,51 const FormatStyle &Style = getLLVMStyle()) const {52 return isFormatted(Code, {1, tooling::Range(0, Code.size())}, Style);53 }54};55 56TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {57 EXPECT_EQ("namespace {\n"58 "int i;\n"59 "int j;\n"60 "} // namespace",61 fixNamespaceEndComments("namespace {\n"62 "int i;\n"63 "int j;\n"64 "}"));65 66 EXPECT_EQ("namespace {\n"67 "int i;\n"68 "int j;\n"69 "} // namespace",70 fixNamespaceEndComments("namespace {\n"71 "int i;\n"72 "int j;\n"73 "}"));74 EXPECT_EQ("namespace A {\n"75 "int i;\n"76 "int j;\n"77 "} // namespace A",78 fixNamespaceEndComments("namespace A {\n"79 "int i;\n"80 "int j;\n"81 "}"));82 EXPECT_EQ("#define M(x) x##x\n"83 "namespace M(x) {\n"84 "int i;\n"85 "int j;\n"86 "} // namespace M(x)",87 fixNamespaceEndComments("#define M(x) x##x\n"88 "namespace M(x) {\n"89 "int i;\n"90 "int j;\n"91 "}"));92 EXPECT_EQ("#define M(x) x##x\n"93 "namespace A::M(x) {\n"94 "int i;\n"95 "int j;\n"96 "} // namespace A::M(x)",97 fixNamespaceEndComments("#define M(x) x##x\n"98 "namespace A::M(x) {\n"99 "int i;\n"100 "int j;\n"101 "}"));102 EXPECT_EQ("#define M(x) x##x\n"103 "namespace M(x)::A {\n"104 "int i;\n"105 "int j;\n"106 "} // namespace M(x)::A",107 fixNamespaceEndComments("#define M(x) x##x\n"108 "namespace M(x)::A {\n"109 "int i;\n"110 "int j;\n"111 "}"));112 EXPECT_EQ("#define M(x) x##x\n"113 "namespace A::inline M(x)::B {\n"114 "int i;\n"115 "int j;\n"116 "} // namespace A::inline M(x)::B",117 fixNamespaceEndComments("#define M(x) x##x\n"118 "namespace A::inline M(x)::B {\n"119 "int i;\n"120 "int j;\n"121 "}"));122 EXPECT_EQ("#define M(x) x##x\n"123 "namespace [[deprecated(\"foo\")]] A::inline M(x)::A {\n"124 "int i;\n"125 "int j;\n"126 "} // namespace A::inline M(x)::A",127 fixNamespaceEndComments(128 "#define M(x) x##x\n"129 "namespace [[deprecated(\"foo\")]] A::inline M(x)::A {\n"130 "int i;\n"131 "int j;\n"132 "}"));133 EXPECT_EQ(134 "namespace /* comment */ [[deprecated(\"foo\")]] /* comment */ A {\n"135 "int i;\n"136 "int j;\n"137 "} // namespace A",138 fixNamespaceEndComments(139 "namespace /* comment */ [[deprecated(\"foo\")]] /* comment */ A {\n"140 "int i;\n"141 "int j;\n"142 "}"));143 EXPECT_EQ("namespace /* comment */ [[deprecated(\"foo\")]] A {\n"144 "int i;\n"145 "int j;\n"146 "} // namespace A",147 fixNamespaceEndComments(148 "namespace /* comment */ [[deprecated(\"foo\")]] A {\n"149 "int i;\n"150 "int j;\n"151 "}"));152 EXPECT_EQ(153 "#define M(x) x##x\n"154 "namespace /* comment */ [[deprecated(\"foo\")]] /* comment */ M(x) {\n"155 "int i;\n"156 "int j;\n"157 "} // namespace M(x)",158 fixNamespaceEndComments("#define M(x) x##x\n"159 "namespace /* comment */ "160 "[[deprecated(\"foo\")]] /* comment */ M(x) {\n"161 "int i;\n"162 "int j;\n"163 "}"));164 EXPECT_EQ("#define M(x) x##x\n"165 "namespace /* comment */ [[deprecated(\"foo\")]] /* comment */ "166 "A::M(x) {\n"167 "int i;\n"168 "int j;\n"169 "} // namespace A::M(x)",170 fixNamespaceEndComments(171 "#define M(x) x##x\n"172 "namespace /* comment */ "173 "[[deprecated(\"foo\")]] /* comment */ A::M(x) {\n"174 "int i;\n"175 "int j;\n"176 "}"));177 EXPECT_EQ("#define M(x) x##x\n"178 "namespace /* comment */ [[deprecated(\"foo\")]] /* comment */ "179 "M(x) /* comment */ {\n"180 "int i;\n"181 "int j;\n"182 "} // namespace M(x)",183 fixNamespaceEndComments(184 "#define M(x) x##x\n"185 "namespace /* comment */ [[deprecated(\"foo\")]] /* comment "186 "*/ M(x) /* comment */ {\n"187 "int i;\n"188 "int j;\n"189 "}"));190 EXPECT_EQ("#define M(x) x##x\n"191 "namespace /* comment */ [[deprecated(\"foo\")]] /* comment */ "192 "A::M(x) /* comment */ {\n"193 "int i;\n"194 "int j;\n"195 "} // namespace A::M(x)",196 fixNamespaceEndComments(197 "#define M(x) x##x\n"198 "namespace /* comment */ [[deprecated(\"foo\")]] /* comment "199 "*/ A::M(x) /* comment */ {\n"200 "int i;\n"201 "int j;\n"202 "}"));203 EXPECT_EQ("#define M(x) x##x\n"204 "namespace A M(x) {\n"205 "int i;\n"206 "int j;\n"207 "} // namespace A M(x)",208 fixNamespaceEndComments("#define M(x) x##x\n"209 "namespace A M(x) {\n"210 "int i;\n"211 "int j;\n"212 "}"));213 EXPECT_EQ(214 "#define B __attribute__((availability(macos, introduced=10.15)))\n"215 "namespace A B {\n"216 "int i;\n"217 "int j;\n"218 "} // namespace A B",219 fixNamespaceEndComments(220 "#define B __attribute__((availability(macos, introduced=10.15)))\n"221 "namespace A B {\n"222 "int i;\n"223 "int j;\n"224 "}"));225 EXPECT_EQ("#define M(x) x##x\n"226 "namespace A::B M(x) {\n"227 "int i;\n"228 "int j;\n"229 "} // namespace A::B",230 fixNamespaceEndComments("#define M(x) x##x\n"231 "namespace A::B M(x) {\n"232 "int i;\n"233 "int j;\n"234 "}"));235 EXPECT_EQ(236 "namespace A __attribute__((availability(macos, introduced=10.15))) {\n"237 "int i;\n"238 "int j;\n"239 "} // namespace A",240 fixNamespaceEndComments(241 "namespace A __attribute__((availability(macos, introduced=10.15))) "242 "{\n"243 "int i;\n"244 "int j;\n"245 "}"));246 EXPECT_EQ("inline namespace A {\n"247 "int i;\n"248 "int j;\n"249 "} // namespace A",250 fixNamespaceEndComments("inline namespace A {\n"251 "int i;\n"252 "int j;\n"253 "}"));254 255 EXPECT_EQ("namespace [[deprecated(\"foo\")]] A::B {\n"256 "int i;\n"257 "int j;\n"258 "} // namespace A::B",259 fixNamespaceEndComments("namespace [[deprecated(\"foo\")]] A::B {\n"260 "int i;\n"261 "int j;\n"262 "}"));263 264 EXPECT_EQ("namespace [[deprecated(\"foo\")]] A::inline B::inline C {\n"265 "int i;\n"266 "int j;\n"267 "} // namespace A::inline B::inline C",268 fixNamespaceEndComments(269 "namespace [[deprecated(\"foo\")]] A::inline B::inline C {\n"270 "int i;\n"271 "int j;\n"272 "}"));273 274 EXPECT_EQ("namespace DEPRECATED A::B {\n"275 "int i;\n"276 "int j;\n"277 "} // namespace A::B",278 fixNamespaceEndComments("namespace DEPRECATED A::B {\n"279 "int i;\n"280 "int j;\n"281 "}"));282 283 EXPECT_EQ("inline namespace [[deprecated]] A {\n"284 "int i;\n"285 "int j;\n"286 "} // namespace A",287 fixNamespaceEndComments("inline namespace [[deprecated]] A {\n"288 "int i;\n"289 "int j;\n"290 "}"));291 292 EXPECT_EQ("namespace ::A {\n"293 "int i;\n"294 "int j;\n"295 "} // namespace ::A",296 fixNamespaceEndComments("namespace ::A {\n"297 "int i;\n"298 "int j;\n"299 "}"));300 EXPECT_EQ("namespace ::A::B {\n"301 "int i;\n"302 "int j;\n"303 "} // namespace ::A::B",304 fixNamespaceEndComments("namespace ::A::B {\n"305 "int i;\n"306 "int j;\n"307 "}"));308 EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"309 "int i;\n"310 "int j;\n"311 "} // namespace ::A::B",312 fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"313 "int i;\n"314 "int j;\n"315 "}"));316 EXPECT_EQ("namespace A {\n"317 "namespace B {\n"318 "int i;\n"319 "}\n"320 "} // namespace A",321 fixNamespaceEndComments("namespace A {\n"322 "namespace B {\n"323 "int i;\n"324 "}\n"325 "}"));326 EXPECT_EQ("namespace A {\n"327 "namespace B {\n"328 "int i;\n"329 "int j;\n"330 "} // namespace B\n"331 "} // namespace A",332 fixNamespaceEndComments("namespace A {\n"333 "namespace B {\n"334 "int i;\n"335 "int j;\n"336 "}\n"337 "}"));338 EXPECT_EQ("namespace A {\n"339 "int a;\n"340 "int b;\n"341 "} // namespace A\n"342 "namespace B {\n"343 "int b;\n"344 "int a;\n"345 "} // namespace B",346 fixNamespaceEndComments("namespace A {\n"347 "int a;\n"348 "int b;\n"349 "}\n"350 "namespace B {\n"351 "int b;\n"352 "int a;\n"353 "}"));354 EXPECT_EQ("namespace A {\n"355 "int a1;\n"356 "int a2;\n"357 "} // namespace A\n"358 "namespace A {\n"359 "int a2;\n"360 "int a1;\n"361 "} // namespace A",362 fixNamespaceEndComments("namespace A {\n"363 "int a1;\n"364 "int a2;\n"365 "}\n"366 "namespace A {\n"367 "int a2;\n"368 "int a1;\n"369 "}"));370 EXPECT_EQ("namespace A {\n"371 "int a;\n"372 "int b;\n"373 "} // namespace A\n"374 "// comment about b\n"375 "int b;",376 fixNamespaceEndComments("namespace A {\n"377 "int a;\n"378 "int b;\n"379 "}\n"380 "// comment about b\n"381 "int b;"));382 383 EXPECT_EQ("namespace A {\n"384 "namespace B {\n"385 "namespace C {\n"386 "namespace D {\n"387 "}\n"388 "} // namespace C\n"389 "} // namespace B\n"390 "} // namespace A",391 fixNamespaceEndComments("namespace A {\n"392 "namespace B {\n"393 "namespace C {\n"394 "namespace D {\n"395 "}\n"396 "}\n"397 "}\n"398 "}"));399 400 // Add comment for namespaces which will be 'compacted'401 FormatStyle CompactNamespacesStyle = getLLVMStyle();402 CompactNamespacesStyle.CompactNamespaces = true;403 EXPECT_EQ("namespace out { namespace in {\n"404 "int i;\n"405 "int j;\n"406 "}} // namespace out::in",407 fixNamespaceEndComments("namespace out { namespace in {\n"408 "int i;\n"409 "int j;\n"410 "}}",411 CompactNamespacesStyle));412 EXPECT_EQ("namespace out {\n"413 "namespace in {\n"414 "int i;\n"415 "int j;\n"416 "}\n"417 "} // namespace out::in",418 fixNamespaceEndComments("namespace out {\n"419 "namespace in {\n"420 "int i;\n"421 "int j;\n"422 "}\n"423 "}",424 CompactNamespacesStyle));425 EXPECT_EQ("namespace out { namespace in {\n"426 "int i;\n"427 "int j;\n"428 "};} // namespace out::in",429 fixNamespaceEndComments("namespace out { namespace in {\n"430 "int i;\n"431 "int j;\n"432 "};}",433 CompactNamespacesStyle));434 EXPECT_EQ("namespace out { namespace {\n"435 "int i;\n"436 "int j;\n"437 "}} // namespace out",438 fixNamespaceEndComments("namespace out { namespace {\n"439 "int i;\n"440 "int j;\n"441 "}}",442 CompactNamespacesStyle));443 444 // Adds an end comment after a semicolon.445 EXPECT_EQ("namespace {\n"446 "int i;\n"447 "int j;\n"448 "}; // namespace",449 fixNamespaceEndComments("namespace {\n"450 "int i;\n"451 "int j;\n"452 "};"));453 EXPECT_EQ("namespace A {\n"454 "int i;\n"455 "int j;\n"456 "}; // namespace A",457 fixNamespaceEndComments("namespace A {\n"458 "int i;\n"459 "int j;\n"460 "};"));461 EXPECT_EQ("namespace A {\n"462 "int i;\n"463 "int j;\n"464 "}; // namespace A\n"465 "// unrelated",466 fixNamespaceEndComments("namespace A {\n"467 "int i;\n"468 "int j;\n"469 "};\n"470 "// unrelated"));471}472 473TEST_F(NamespaceEndCommentsFixerTest, WorksForObjCpp) {474 FormatStyle ObjCppStyle = getLLVMStyle();475 ObjCppStyle.Language = FormatStyle::LK_ObjC;476 EXPECT_EQ("namespace {\n"477 "int i;\n"478 "int j;\n"479 "} // namespace",480 fixNamespaceEndComments("namespace {\n"481 "int i;\n"482 "int j;\n"483 "}",484 ObjCppStyle));485}486 487TEST_F(NamespaceEndCommentsFixerTest, AddsMacroEndComment) {488 FormatStyle Style = getLLVMStyle();489 Style.NamespaceMacros.push_back("TESTSUITE");490 491 EXPECT_EQ("TESTSUITE() {\n"492 "int i;\n"493 "int j;\n"494 "} // TESTSUITE()",495 fixNamespaceEndComments("TESTSUITE() {\n"496 "int i;\n"497 "int j;\n"498 "}",499 Style));500 501 EXPECT_EQ("TESTSUITE(A) {\n"502 "int i;\n"503 "int j;\n"504 "} // TESTSUITE(A)",505 fixNamespaceEndComments("TESTSUITE(A) {\n"506 "int i;\n"507 "int j;\n"508 "}",509 Style));510 EXPECT_EQ("inline TESTSUITE(A) {\n"511 "int i;\n"512 "int j;\n"513 "} // TESTSUITE(A)",514 fixNamespaceEndComments("inline TESTSUITE(A) {\n"515 "int i;\n"516 "int j;\n"517 "}",518 Style));519 EXPECT_EQ("TESTSUITE(::A) {\n"520 "int i;\n"521 "int j;\n"522 "} // TESTSUITE(::A)",523 fixNamespaceEndComments("TESTSUITE(::A) {\n"524 "int i;\n"525 "int j;\n"526 "}",527 Style));528 EXPECT_EQ("TESTSUITE(::A::B) {\n"529 "int i;\n"530 "int j;\n"531 "} // TESTSUITE(::A::B)",532 fixNamespaceEndComments("TESTSUITE(::A::B) {\n"533 "int i;\n"534 "int j;\n"535 "}",536 Style));537 EXPECT_EQ("TESTSUITE(/**/::/**/A/**/::/**/B/**/) {\n"538 "int i;\n"539 "int j;\n"540 "} // TESTSUITE(::A::B)",541 fixNamespaceEndComments("TESTSUITE(/**/::/**/A/**/::/**/B/**/) {\n"542 "int i;\n"543 "int j;\n"544 "}",545 Style));546 EXPECT_EQ("TESTSUITE(A, B) {\n"547 "int i;\n"548 "int j;\n"549 "} // TESTSUITE(A)",550 fixNamespaceEndComments("TESTSUITE(A, B) {\n"551 "int i;\n"552 "int j;\n"553 "}",554 Style));555 EXPECT_EQ("TESTSUITE(\"Test1\") {\n"556 "int i;\n"557 "int j;\n"558 "} // TESTSUITE(\"Test1\")",559 fixNamespaceEndComments("TESTSUITE(\"Test1\") {\n"560 "int i;\n"561 "int j;\n"562 "}",563 Style));564}565 566TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {567 EXPECT_EQ("namespace A {\n"568 "int i;\n"569 "int j;\n"570 "} // namespace A\n"571 " int k;",572 fixNamespaceEndComments("namespace A {\n"573 "int i;\n"574 "int j;\n"575 "} int k;"));576 EXPECT_EQ("namespace {\n"577 "int i;\n"578 "int j;\n"579 "} // namespace\n"580 " int k;",581 fixNamespaceEndComments("namespace {\n"582 "int i;\n"583 "int j;\n"584 "} int k;"));585 EXPECT_EQ("namespace A {\n"586 "int i;\n"587 "int j;\n"588 "} // namespace A\n"589 " namespace B {\n"590 "int j;\n"591 "int k;\n"592 "} // namespace B",593 fixNamespaceEndComments("namespace A {\n"594 "int i;\n"595 "int j;\n"596 "} namespace B {\n"597 "int j;\n"598 "int k;\n"599 "}"));600 EXPECT_EQ("namespace {\n"601 "int i;\n"602 "int j;\n"603 "}; // namespace\n"604 "int k;",605 fixNamespaceEndComments("namespace {\n"606 "int i;\n"607 "int j;\n"608 "};int k;"));609 EXPECT_EQ("namespace {\n"610 "int i;\n"611 "int j;\n"612 "}; // namespace\n"613 ";",614 fixNamespaceEndComments("namespace {\n"615 "int i;\n"616 "int j;\n"617 "};;"));618}619 620TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {621 EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));622 EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));623 EXPECT_EQ("namespace A { a }", fixNamespaceEndComments("namespace A { a }"));624 EXPECT_EQ("namespace A { a };",625 fixNamespaceEndComments("namespace A { a };"));626}627 628TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {629 EXPECT_EQ("namespace A {\n"630 "int i;\n"631 "}",632 fixNamespaceEndComments("namespace A {\n"633 "int i;\n"634 "}",635 // The range (16, 3) spans the 'int' above.636 /*Ranges=*/{1, tooling::Range(16, 3)}));637 EXPECT_EQ("namespace A {\n"638 "int i;\n"639 "};",640 fixNamespaceEndComments("namespace A {\n"641 "int i;\n"642 "};",643 // The range (16, 3) spans the 'int' above.644 /*Ranges=*/{1, tooling::Range(16, 3)}));645}646 647TEST_F(NamespaceEndCommentsFixerTest,648 DoesNotAddCommentAfterRBraceInPPDirective) {649 EXPECT_EQ("#define SAD \\\n"650 "namespace A { \\\n"651 "int i; \\\n"652 "}",653 fixNamespaceEndComments("#define SAD \\\n"654 "namespace A { \\\n"655 "int i; \\\n"656 "}"));657}658 659TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {660 EXPECT_TRUE(isFormatted("namespace {\n"661 "int i;\n"662 "} // end anonymous namespace"));663 EXPECT_TRUE(isFormatted("namespace A {\n"664 "int i;\n"665 "} /* end of namespace A */"));666 EXPECT_TRUE(isFormatted("namespace A {\n"667 "int i;\n"668 "} // namespace A"));669 EXPECT_TRUE(isFormatted("namespace A::B {\n"670 "int i;\n"671 "} // end namespace A::B"));672 EXPECT_TRUE(isFormatted("namespace A {\n"673 "int i;\n"674 "}; // end namespace A"));675 EXPECT_TRUE(isFormatted("namespace {\n"676 "int i;\n"677 "}; /* unnamed namespace */"));678 EXPECT_TRUE(isFormatted("namespace a::inline b {\n"679 "int c;\n"680 "}; // namespace a::inline b"));681}682 683TEST_F(NamespaceEndCommentsFixerTest, KeepsValidMacroEndComment) {684 FormatStyle Style = getLLVMStyle();685 Style.NamespaceMacros.push_back("TESTSUITE");686 687 EXPECT_TRUE(isFormatted("TESTSUITE() {\n"688 "int i;\n"689 "} // end anonymous TESTSUITE()",690 Style));691 EXPECT_TRUE(isFormatted("TESTSUITE(A) {\n"692 "int i;\n"693 "} /* end of TESTSUITE(A) */",694 Style));695 EXPECT_TRUE(isFormatted("TESTSUITE(A) {\n"696 "int i;\n"697 "} // TESTSUITE(A)",698 Style));699 EXPECT_TRUE(isFormatted("TESTSUITE(A::B) {\n"700 "int i;\n"701 "} // end TESTSUITE(A::B)",702 Style));703 EXPECT_TRUE(isFormatted("TESTSUITE(A) {\n"704 "int i;\n"705 "}; // end TESTSUITE(A)",706 Style));707 EXPECT_TRUE(isFormatted("TESTSUITE() {\n"708 "int i;\n"709 "}; /* unnamed TESTSUITE() */",710 Style));711 EXPECT_TRUE(isFormatted("TESTSUITE(\"foo\") {\n"712 "int i;\n"713 "} // TESTSUITE(\"foo\")",714 Style));715}716 717TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {718 EXPECT_EQ("namespace {\n"719 "int i;\n"720 "} // namespace",721 fixNamespaceEndComments("namespace {\n"722 "int i;\n"723 "} // namespace A"));724 EXPECT_EQ("namespace A {\n"725 "int i;\n"726 "} // namespace A",727 fixNamespaceEndComments("namespace A {\n"728 "int i;\n"729 "} // namespace"));730 EXPECT_EQ("namespace A {\n"731 "int i;\n"732 "} // namespace A",733 fixNamespaceEndComments("namespace A {\n"734 "int i;\n"735 "} //"));736 EXPECT_EQ("namespace A {\n"737 "int i;\n"738 "}; // namespace A",739 fixNamespaceEndComments("namespace A {\n"740 "int i;\n"741 "}; //"));742 743 EXPECT_EQ("namespace A {\n"744 "int i;\n"745 "} // namespace A",746 fixNamespaceEndComments("namespace A {\n"747 "int i;\n"748 "} // banamespace A"));749 EXPECT_EQ("namespace A {\n"750 "int i;\n"751 "}; // namespace A",752 fixNamespaceEndComments("namespace A {\n"753 "int i;\n"754 "}; // banamespace A"));755 // Updates invalid line comments even for short namespaces.756 EXPECT_EQ("namespace A {} // namespace A",757 fixNamespaceEndComments("namespace A {} // namespace"));758 EXPECT_EQ("namespace A {}; // namespace A",759 fixNamespaceEndComments("namespace A {}; // namespace"));760 761 // Update invalid comments for compacted namespaces.762 FormatStyle CompactNamespacesStyle = getLLVMStyle();763 CompactNamespacesStyle.CompactNamespaces = true;764 EXPECT_EQ("namespace out { namespace in {\n"765 "}} // namespace out::in",766 fixNamespaceEndComments("namespace out { namespace in {\n"767 "}} // namespace out",768 CompactNamespacesStyle));769 EXPECT_EQ("namespace out { namespace in {\n"770 "}} // namespace out::in",771 fixNamespaceEndComments("namespace out { namespace in {\n"772 "}} // namespace in",773 CompactNamespacesStyle));774 EXPECT_EQ("namespace out { namespace in {\n"775 "}\n"776 "} // namespace out::in",777 fixNamespaceEndComments("namespace out { namespace in {\n"778 "}// banamespace in\n"779 "} // namespace out",780 CompactNamespacesStyle));781 EXPECT_EQ("namespace out { namespace {\n"782 "}} // namespace out",783 fixNamespaceEndComments("namespace out { namespace {\n"784 "}} // namespace out::",785 CompactNamespacesStyle));786}787 788TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidMacroEndLineComment) {789 FormatStyle Style = getLLVMStyle();790 Style.NamespaceMacros.push_back("TESTSUITE");791 792 EXPECT_EQ("TESTSUITE() {\n"793 "int i;\n"794 "} // TESTSUITE()",795 fixNamespaceEndComments("TESTSUITE() {\n"796 "int i;\n"797 "} // TESTSUITE(A)",798 Style));799 EXPECT_EQ("TESTSUITE(A) {\n"800 "int i;\n"801 "} // TESTSUITE(A)",802 fixNamespaceEndComments("TESTSUITE(A) {\n"803 "int i;\n"804 "} // TESTSUITE()",805 Style));806 EXPECT_EQ("TESTSUITE(A) {\n"807 "int i;\n"808 "} // TESTSUITE(A)",809 fixNamespaceEndComments("TESTSUITE(A) {\n"810 "int i;\n"811 "} //",812 Style));813 EXPECT_EQ("TESTSUITE(A) {\n"814 "int i;\n"815 "}; // TESTSUITE(A)",816 fixNamespaceEndComments("TESTSUITE(A) {\n"817 "int i;\n"818 "}; //",819 Style));820 EXPECT_EQ("TESTSUITE(A) {\n"821 "int i;\n"822 "} // TESTSUITE(A)",823 fixNamespaceEndComments("TESTSUITE(A) {\n"824 "int i;\n"825 "} // TESTSUITE A",826 Style));827 EXPECT_EQ("TESTSUITE() {\n"828 "int i;\n"829 "} // TESTSUITE()",830 fixNamespaceEndComments("TESTSUITE() {\n"831 "int i;\n"832 "} // TESTSUITE",833 Style));834 EXPECT_EQ("TESTSUITE(A) {\n"835 "int i;\n"836 "} // TESTSUITE(A)",837 fixNamespaceEndComments("TESTSUITE(A) {\n"838 "int i;\n"839 "} // TOASTSUITE(A)",840 Style));841 EXPECT_EQ("TESTSUITE(A) {\n"842 "int i;\n"843 "}; // TESTSUITE(A)",844 fixNamespaceEndComments("TESTSUITE(A) {\n"845 "int i;\n"846 "}; // TOASTSUITE(A)",847 Style));848 // Updates invalid line comments even for short namespaces.849 EXPECT_EQ("TESTSUITE(A) {} // TESTSUITE(A)",850 fixNamespaceEndComments("TESTSUITE(A) {} // TESTSUITE()", Style));851 EXPECT_EQ("TESTSUITE(A) {}; // TESTSUITE(A)",852 fixNamespaceEndComments("TESTSUITE(A) {}; // TESTSUITE()", Style));853 854 // Update invalid comments for compacted namespaces.855 FormatStyle CompactNamespacesStyle = getLLVMStyle();856 CompactNamespacesStyle.CompactNamespaces = true;857 CompactNamespacesStyle.NamespaceMacros.push_back("TESTSUITE");858 859 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"860 "}} // TESTSUITE(out::in)",861 fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"862 "}} // TESTSUITE(out)",863 CompactNamespacesStyle));864 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"865 "}} // TESTSUITE(out::in)",866 fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"867 "}} // TESTSUITE(in)",868 CompactNamespacesStyle));869 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"870 "}\n"871 "} // TESTSUITE(out::in)",872 fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"873 "}// TAOSTSUITE(in)\n"874 "} // TESTSUITE(out)",875 CompactNamespacesStyle));876}877 878TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {879 EXPECT_EQ("namespace {\n"880 "int i;\n"881 "} // namespace",882 fixNamespaceEndComments("namespace {\n"883 "int i;\n"884 "} /* namespace A */"));885 EXPECT_EQ("namespace A {\n"886 "int i;\n"887 "} // namespace A",888 fixNamespaceEndComments("namespace A {\n"889 "int i;\n"890 "} /* end namespace */"));891 EXPECT_EQ("namespace A {\n"892 "int i;\n"893 "} // namespace A",894 fixNamespaceEndComments("namespace A {\n"895 "int i;\n"896 "} /**/"));897 EXPECT_EQ("namespace A {\n"898 "int i;\n"899 "} // namespace A",900 fixNamespaceEndComments("namespace A {\n"901 "int i;\n"902 "} /* end unnamed namespace */"));903 EXPECT_EQ("namespace A {\n"904 "int i;\n"905 "} // namespace A",906 fixNamespaceEndComments("namespace A {\n"907 "int i;\n"908 "} /* banamespace A */"));909 EXPECT_EQ("namespace A {\n"910 "int i;\n"911 "}; // namespace A",912 fixNamespaceEndComments("namespace A {\n"913 "int i;\n"914 "}; /* banamespace A */"));915 EXPECT_EQ("namespace A {} // namespace A",916 fixNamespaceEndComments("namespace A {} /**/"));917 EXPECT_EQ("namespace A {}; // namespace A",918 fixNamespaceEndComments("namespace A {}; /**/"));919}920 921TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidMacroEndBlockComment) {922 FormatStyle Style = getLLVMStyle();923 Style.NamespaceMacros.push_back("TESTSUITE");924 925 EXPECT_EQ("TESTSUITE() {\n"926 "int i;\n"927 "} // TESTSUITE()",928 fixNamespaceEndComments("TESTSUITE() {\n"929 "int i;\n"930 "} /* TESTSUITE(A) */",931 Style));932 EXPECT_EQ("TESTSUITE(A) {\n"933 "int i;\n"934 "} // TESTSUITE(A)",935 fixNamespaceEndComments("TESTSUITE(A) {\n"936 "int i;\n"937 "} /* end TESTSUITE() */",938 Style));939 EXPECT_EQ("TESTSUITE(A) {\n"940 "int i;\n"941 "} // TESTSUITE(A)",942 fixNamespaceEndComments("TESTSUITE(A) {\n"943 "int i;\n"944 "} /**/",945 Style));946 EXPECT_EQ("TESTSUITE(A) {\n"947 "int i;\n"948 "} // TESTSUITE(A)",949 fixNamespaceEndComments("TESTSUITE(A) {\n"950 "int i;\n"951 "} /* end unnamed TESTSUITE() */",952 Style));953 EXPECT_EQ("TESTSUITE(A) {\n"954 "int i;\n"955 "} // TESTSUITE(A)",956 fixNamespaceEndComments("TESTSUITE(A) {\n"957 "int i;\n"958 "} /* TOASTSUITE(A) */",959 Style));960 EXPECT_EQ("TESTSUITE(A) {\n"961 "int i;\n"962 "}; // TESTSUITE(A)",963 fixNamespaceEndComments("TESTSUITE(A) {\n"964 "int i;\n"965 "}; /* TAOSTSUITE(A) */",966 Style));967 EXPECT_EQ("TESTSUITE(A) {} // TESTSUITE(A)",968 fixNamespaceEndComments("TESTSUITE(A) {} /**/", Style));969 EXPECT_EQ("TESTSUITE(A) {}; // TESTSUITE(A)",970 fixNamespaceEndComments("TESTSUITE(A) {}; /**/", Style));971}972 973TEST_F(NamespaceEndCommentsFixerTest,974 DoesNotAddEndCommentForNamespacesControlledByMacros) {975 EXPECT_EQ("#ifdef 1\n"976 "namespace A {\n"977 "#elseif\n"978 "namespace B {\n"979 "#endif\n"980 "int i;\n"981 "}\n"982 "}",983 fixNamespaceEndComments("#ifdef 1\n"984 "namespace A {\n"985 "#elseif\n"986 "namespace B {\n"987 "#endif\n"988 "int i;\n"989 "}\n"990 "}"));991}992 993TEST_F(NamespaceEndCommentsFixerTest, AddsEndCommentForNamespacesAroundMacros) {994 // Conditional blocks around are fine995 EXPECT_EQ("namespace A {\n"996 "#if 1\n"997 "int i;\n"998 "#endif\n"999 "} // namespace A",1000 fixNamespaceEndComments("namespace A {\n"1001 "#if 1\n"1002 "int i;\n"1003 "#endif\n"1004 "}"));1005 EXPECT_EQ("#if 1\n"1006 "#endif\n"1007 "namespace A {\n"1008 "int i;\n"1009 "int j;\n"1010 "} // namespace A",1011 fixNamespaceEndComments("#if 1\n"1012 "#endif\n"1013 "namespace A {\n"1014 "int i;\n"1015 "int j;\n"1016 "}"));1017 EXPECT_EQ("namespace A {\n"1018 "int i;\n"1019 "int j;\n"1020 "} // namespace A\n"1021 "#if 1\n"1022 "#endif",1023 fixNamespaceEndComments("namespace A {\n"1024 "int i;\n"1025 "int j;\n"1026 "}\n"1027 "#if 1\n"1028 "#endif"));1029 EXPECT_EQ("#if 1\n"1030 "namespace A {\n"1031 "int i;\n"1032 "int j;\n"1033 "} // namespace A\n"1034 "#endif",1035 fixNamespaceEndComments("#if 1\n"1036 "namespace A {\n"1037 "int i;\n"1038 "int j;\n"1039 "}\n"1040 "#endif"));1041 1042 // Macro definition has no impact1043 EXPECT_EQ("namespace A {\n"1044 "#define FOO\n"1045 "int i;\n"1046 "} // namespace A",1047 fixNamespaceEndComments("namespace A {\n"1048 "#define FOO\n"1049 "int i;\n"1050 "}"));1051 EXPECT_EQ("#define FOO\n"1052 "namespace A {\n"1053 "int i;\n"1054 "int j;\n"1055 "} // namespace A",1056 fixNamespaceEndComments("#define FOO\n"1057 "namespace A {\n"1058 "int i;\n"1059 "int j;\n"1060 "}"));1061 EXPECT_EQ("namespace A {\n"1062 "int i;\n"1063 "int j;\n"1064 "} // namespace A\n"1065 "#define FOO",1066 fixNamespaceEndComments("namespace A {\n"1067 "int i;\n"1068 "int j;\n"1069 "}\n"1070 "#define FOO"));1071 1072 // No replacement if open & close in different conditional blocks1073 EXPECT_EQ("#if 1\n"1074 "namespace A {\n"1075 "#endif\n"1076 "int i;\n"1077 "int j;\n"1078 "#if 1\n"1079 "}\n"1080 "#endif",1081 fixNamespaceEndComments("#if 1\n"1082 "namespace A {\n"1083 "#endif\n"1084 "int i;\n"1085 "int j;\n"1086 "#if 1\n"1087 "}\n"1088 "#endif"));1089 EXPECT_EQ("#ifdef A\n"1090 "namespace A {\n"1091 "#endif\n"1092 "int i;\n"1093 "int j;\n"1094 "#ifdef B\n"1095 "}\n"1096 "#endif",1097 fixNamespaceEndComments("#ifdef A\n"1098 "namespace A {\n"1099 "#endif\n"1100 "int i;\n"1101 "int j;\n"1102 "#ifdef B\n"1103 "}\n"1104 "#endif"));1105 1106 // No replacement inside unreachable conditional block1107 EXPECT_EQ("#if 0\n"1108 "namespace A {\n"1109 "int i;\n"1110 "int j;\n"1111 "}\n"1112 "#endif",1113 fixNamespaceEndComments("#if 0\n"1114 "namespace A {\n"1115 "int i;\n"1116 "int j;\n"1117 "}\n"1118 "#endif"));1119}1120 1121TEST_F(NamespaceEndCommentsFixerTest,1122 DoesNotAddEndCommentForNamespacesInMacroDeclarations) {1123 EXPECT_EQ("#ifdef 1\n"1124 "namespace A {\n"1125 "#elseif\n"1126 "namespace B {\n"1127 "#endif\n"1128 "int i;\n"1129 "}\n"1130 "}",1131 fixNamespaceEndComments("#ifdef 1\n"1132 "namespace A {\n"1133 "#elseif\n"1134 "namespace B {\n"1135 "#endif\n"1136 "int i;\n"1137 "}\n"1138 "}"));1139 EXPECT_EQ("namespace {\n"1140 "int i;\n"1141 "int j;\n"1142 "} // namespace\n"1143 "#if A\n"1144 "int i;\n"1145 "#else\n"1146 "int j;\n"1147 "#endif",1148 fixNamespaceEndComments("namespace {\n"1149 "int i;\n"1150 "int j;\n"1151 "}\n"1152 "#if A\n"1153 "int i;\n"1154 "#else\n"1155 "int j;\n"1156 "#endif"));1157 EXPECT_EQ("#if A\n"1158 "namespace A {\n"1159 "#else\n"1160 "namespace B {\n"1161 "#endif\n"1162 "int i;\n"1163 "int j;\n"1164 "}",1165 fixNamespaceEndComments("#if A\n"1166 "namespace A {\n"1167 "#else\n"1168 "namespace B {\n"1169 "#endif\n"1170 "int i;\n"1171 "int j;\n"1172 "}"));1173 EXPECT_EQ("#if A\n"1174 "namespace A {\n"1175 "#else\n"1176 "namespace B {\n"1177 "#endif\n"1178 "int i;\n"1179 "int j;\n"1180 "} // namespace A",1181 fixNamespaceEndComments("#if A\n"1182 "namespace A {\n"1183 "#else\n"1184 "namespace B {\n"1185 "#endif\n"1186 "int i;\n"1187 "int j;\n"1188 "} // namespace A"));1189 EXPECT_EQ("#if A\n"1190 "namespace A {\n"1191 "#else\n"1192 "namespace B {\n"1193 "#endif\n"1194 "int i;\n"1195 "int j;\n"1196 "} // namespace B",1197 fixNamespaceEndComments("#if A\n"1198 "namespace A {\n"1199 "#else\n"1200 "namespace B {\n"1201 "#endif\n"1202 "int i;\n"1203 "int j;\n"1204 "} // namespace B"));1205 EXPECT_EQ("namespace A\n"1206 "int i;\n"1207 "int j;\n"1208 "#if A\n"1209 "}\n"1210 "#else\n"1211 "}\n"1212 "#endif",1213 fixNamespaceEndComments("namespace A\n"1214 "int i;\n"1215 "int j;\n"1216 "#if A\n"1217 "}\n"1218 "#else\n"1219 "}\n"1220 "#endif"));1221 EXPECT_EQ("namespace A\n"1222 "int i;\n"1223 "int j;\n"1224 "#if A\n"1225 "} // namespace A\n"1226 "#else\n"1227 "} // namespace A\n"1228 "#endif",1229 fixNamespaceEndComments("namespace A\n"1230 "int i;\n"1231 "int j;\n"1232 "#if A\n"1233 "} // namespace A\n"1234 "#else\n"1235 "} // namespace A\n"1236 "#endif"));1237}1238 1239TEST_F(NamespaceEndCommentsFixerTest,1240 DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {1241 EXPECT_EQ("namespace {\n"1242 "int i;\n"1243 "} // namespace\n"1244 "}",1245 fixNamespaceEndComments("namespace {\n"1246 "int i;\n"1247 "} // namespace\n"1248 "}"));1249}1250 1251TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) {1252 EXPECT_EQ("template <int> struct a {};\n"1253 "struct a<bool{}> b() {\n"1254 "}\n"1255 "#define c inline\n"1256 "void d() {\n"1257 "}",1258 fixNamespaceEndComments("template <int> struct a {};\n"1259 "struct a<bool{}> b() {\n"1260 "}\n"1261 "#define c inline\n"1262 "void d() {\n"1263 "}"));1264}1265 1266TEST_F(NamespaceEndCommentsFixerTest, IgnoreUnbalanced) {1267 EXPECT_EQ("namespace A {\n"1268 "class Foo {\n"1269 "}\n"1270 "} // namespace A",1271 fixNamespaceEndComments("namespace A {\n"1272 "class Foo {\n"1273 "}\n"1274 "}"));1275 EXPECT_EQ("namespace A {\n"1276 "class Foo {\n"1277 "}",1278 fixNamespaceEndComments("namespace A {\n"1279 "class Foo {\n"1280 "}"));1281 1282 EXPECT_EQ("namespace A {\n"1283 "class Foo {\n"1284 "}\n"1285 "}\n"1286 "}",1287 fixNamespaceEndComments("namespace A {\n"1288 "class Foo {\n"1289 "}\n"1290 "}\n"1291 "}"));1292}1293 1294using ShortNamespaceLinesTest = NamespaceEndCommentsFixerTest;1295 1296TEST_F(ShortNamespaceLinesTest, ZeroUnwrappedLines) {1297 auto Style = getLLVMStyle();1298 Style.ShortNamespaceLines = 0u;1299 1300 EXPECT_EQ("namespace OneLinerNamespace {}",1301 fixNamespaceEndComments("namespace OneLinerNamespace {}", Style));1302 EXPECT_EQ("namespace ShortNamespace {\n"1303 "}",1304 fixNamespaceEndComments("namespace ShortNamespace {\n"1305 "}",1306 Style));1307 EXPECT_EQ("namespace LongNamespace {\n"1308 "int i;\n"1309 "} // namespace LongNamespace",1310 fixNamespaceEndComments("namespace LongNamespace {\n"1311 "int i;\n"1312 "}",1313 Style));1314}1315 1316TEST_F(ShortNamespaceLinesTest, OneUnwrappedLine) {1317 constexpr auto DefaultUnwrappedLines = 1u;1318 auto const Style = getLLVMStyle();1319 1320 EXPECT_EQ(DefaultUnwrappedLines, Style.ShortNamespaceLines);1321 EXPECT_EQ("namespace ShortNamespace {\n"1322 "int i;\n"1323 "}",1324 fixNamespaceEndComments("namespace ShortNamespace {\n"1325 "int i;\n"1326 "}"));1327 EXPECT_EQ("namespace LongNamespace {\n"1328 "int i;\n"1329 "int j;\n"1330 "} // namespace LongNamespace",1331 fixNamespaceEndComments("namespace LongNamespace {\n"1332 "int i;\n"1333 "int j;\n"1334 "}"));1335}1336 1337TEST_F(ShortNamespaceLinesTest, MultipleUnwrappedLine) {1338 auto Style = getLLVMStyle();1339 Style.ShortNamespaceLines = 2u;1340 1341 EXPECT_EQ("namespace ShortNamespace {\n"1342 "int i;\n"1343 "int j;\n"1344 "}",1345 fixNamespaceEndComments("namespace ShortNamespace {\n"1346 "int i;\n"1347 "int j;\n"1348 "}",1349 Style));1350 EXPECT_EQ("namespace LongNamespace {\n"1351 "int i;\n"1352 "int j;\n"1353 "int k;\n"1354 "} // namespace LongNamespace",1355 fixNamespaceEndComments("namespace LongNamespace {\n"1356 "int i;\n"1357 "int j;\n"1358 "int k;\n"1359 "}",1360 Style));1361 1362 // The namespace body has 5 unwrapped/annotated lines.1363 const std::string NestedLambdas{"namespace foo {\n"1364 "auto bar = [] {\n" // line 11365 " int i;\n" // line 21366 " return [] {\n" // line 31367 " int j;" // line 41368 " return 0;\n" // line 51369 " };\n" // part of line 31370 "};\n" // part of line 11371 "}"};1372 Style.ShortNamespaceLines = 4;1373 EXPECT_EQ(NestedLambdas + " // namespace foo",1374 fixNamespaceEndComments(NestedLambdas, Style));1375 ++Style.ShortNamespaceLines;1376 EXPECT_EQ(NestedLambdas, fixNamespaceEndComments(NestedLambdas, Style));1377}1378 1379TEST_F(ShortNamespaceLinesTest, NamespaceAlias) {1380 auto Style = getLLVMStyle();1381 1382 EXPECT_EQ("namespace n = nn;\n"1383 "{\n"1384 " int i;\n"1385 " int j;\n"1386 "}",1387 fixNamespaceEndComments("namespace n = nn;\n"1388 "{\n"1389 " int i;\n"1390 " int j;\n"1391 "}",1392 Style));1393 1394 EXPECT_EQ("namespace n = nn; // comment\n"1395 "{\n"1396 " int i;\n"1397 " int j;\n"1398 "}",1399 fixNamespaceEndComments("namespace n = nn; // comment\n"1400 "{\n"1401 " int i;\n"1402 " int j;\n"1403 "}",1404 Style));1405 1406 EXPECT_EQ("namespace n = nn; /* comment */\n"1407 "{\n"1408 " int i;\n"1409 " int j;\n"1410 "}",1411 fixNamespaceEndComments("namespace n = nn; /* comment */\n"1412 "{\n"1413 " int i;\n"1414 " int j;\n"1415 "}",1416 Style));1417 1418 EXPECT_EQ(1419 "namespace n = nn; /* comment */ /* comment2 */\n"1420 "{\n"1421 " int i;\n"1422 " int j;\n"1423 "}",1424 fixNamespaceEndComments("namespace n = nn; /* comment */ /* comment2 */\n"1425 "{\n"1426 " int i;\n"1427 " int j;\n"1428 "}",1429 Style));1430 1431 EXPECT_EQ("namespace n = nn; {\n"1432 " int i;\n"1433 " int j;\n"1434 "}",1435 fixNamespaceEndComments("namespace n = nn; {\n"1436 " int i;\n"1437 " int j;\n"1438 "}",1439 Style));1440 EXPECT_EQ("int foo;\n"1441 "namespace n\n"1442 "{\n"1443 " int i;\n"1444 " int j;\n"1445 "} // namespace n",1446 fixNamespaceEndComments("int foo;\n"1447 "namespace n\n"1448 "{\n"1449 " int i;\n"1450 " int j;\n"1451 "}",1452 Style));1453}1454} // end namespace1455} // end namespace format1456} // end namespace clang1457