NamespaceEndCommentsFixerTest.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. //===- NamespaceEndCommentsFixerTest.cpp - Formatting unit tests ----------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "clang/Format/Format.h"
  10. #include "clang/Frontend/TextDiagnosticPrinter.h"
  11. #include "llvm/Support/Debug.h"
  12. #include "gtest/gtest.h"
  13. #define DEBUG_TYPE "namespace-end-comments-fixer-test"
  14. namespace clang {
  15. namespace format {
  16. namespace {
  17. class NamespaceEndCommentsFixerTest : public ::testing::Test {
  18. protected:
  19. std::string
  20. fixNamespaceEndComments(llvm::StringRef Code,
  21. const std::vector<tooling::Range> &Ranges,
  22. const FormatStyle &Style = getLLVMStyle()) {
  23. DEBUG(llvm::errs() << "---\n");
  24. DEBUG(llvm::errs() << Code << "\n\n");
  25. tooling::Replacements Replaces =
  26. clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>");
  27. auto Result = applyAllReplacements(Code, Replaces);
  28. EXPECT_TRUE(static_cast<bool>(Result));
  29. DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  30. return *Result;
  31. }
  32. std::string
  33. fixNamespaceEndComments(llvm::StringRef Code,
  34. const FormatStyle &Style = getLLVMStyle()) {
  35. return fixNamespaceEndComments(
  36. Code,
  37. /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style);
  38. }
  39. };
  40. TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
  41. EXPECT_EQ("namespace {\n"
  42. " int i;\n"
  43. " int j;\n"
  44. "}// namespace",
  45. fixNamespaceEndComments("namespace {\n"
  46. " int i;\n"
  47. " int j;\n"
  48. "}"));
  49. EXPECT_EQ("namespace {\n"
  50. " int i;\n"
  51. " int j;\n"
  52. "}// namespace\n",
  53. fixNamespaceEndComments("namespace {\n"
  54. " int i;\n"
  55. " int j;\n"
  56. "}\n"));
  57. EXPECT_EQ("namespace A {\n"
  58. " int i;\n"
  59. " int j;\n"
  60. "}// namespace A",
  61. fixNamespaceEndComments("namespace A {\n"
  62. " int i;\n"
  63. " int j;\n"
  64. "}"));
  65. EXPECT_EQ("inline namespace A {\n"
  66. " int i;\n"
  67. " int j;\n"
  68. "}// namespace A",
  69. fixNamespaceEndComments("inline namespace A {\n"
  70. " int i;\n"
  71. " int j;\n"
  72. "}"));
  73. EXPECT_EQ("namespace ::A {\n"
  74. " int i;\n"
  75. " int j;\n"
  76. "}// namespace ::A",
  77. fixNamespaceEndComments("namespace ::A {\n"
  78. " int i;\n"
  79. " int j;\n"
  80. "}"));
  81. EXPECT_EQ("namespace ::A::B {\n"
  82. " int i;\n"
  83. " int j;\n"
  84. "}// namespace ::A::B",
  85. fixNamespaceEndComments("namespace ::A::B {\n"
  86. " int i;\n"
  87. " int j;\n"
  88. "}"));
  89. EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
  90. " int i;\n"
  91. " int j;\n"
  92. "}// namespace ::A::B",
  93. fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
  94. " int i;\n"
  95. " int j;\n"
  96. "}"));
  97. EXPECT_EQ("namespace A {\n"
  98. "namespace B {\n"
  99. " int i;\n"
  100. "}\n"
  101. "}// namespace A",
  102. fixNamespaceEndComments("namespace A {\n"
  103. "namespace B {\n"
  104. " int i;\n"
  105. "}\n"
  106. "}"));
  107. EXPECT_EQ("namespace A {\n"
  108. "namespace B {\n"
  109. " int i;\n"
  110. " int j;\n"
  111. "}// namespace B\n"
  112. "}// namespace A",
  113. fixNamespaceEndComments("namespace A {\n"
  114. "namespace B {\n"
  115. " int i;\n"
  116. " int j;\n"
  117. "}\n"
  118. "}"));
  119. EXPECT_EQ("namespace A {\n"
  120. " int a;\n"
  121. " int b;\n"
  122. "}// namespace A\n"
  123. "namespace B {\n"
  124. " int b;\n"
  125. " int a;\n"
  126. "}// namespace B",
  127. fixNamespaceEndComments("namespace A {\n"
  128. " int a;\n"
  129. " int b;\n"
  130. "}\n"
  131. "namespace B {\n"
  132. " int b;\n"
  133. " int a;\n"
  134. "}"));
  135. EXPECT_EQ("namespace A {\n"
  136. " int a1;\n"
  137. " int a2;\n"
  138. "}// namespace A\n"
  139. "namespace A {\n"
  140. " int a2;\n"
  141. " int a1;\n"
  142. "}// namespace A",
  143. fixNamespaceEndComments("namespace A {\n"
  144. " int a1;\n"
  145. " int a2;\n"
  146. "}\n"
  147. "namespace A {\n"
  148. " int a2;\n"
  149. " int a1;\n"
  150. "}"));
  151. EXPECT_EQ("namespace A {\n"
  152. " int a;\n"
  153. " int b;\n"
  154. "}// namespace A\n"
  155. "// comment about b\n"
  156. "int b;",
  157. fixNamespaceEndComments("namespace A {\n"
  158. " int a;\n"
  159. " int b;\n"
  160. "}\n"
  161. "// comment about b\n"
  162. "int b;"));
  163. EXPECT_EQ("namespace A {\n"
  164. "namespace B {\n"
  165. "namespace C {\n"
  166. "namespace D {\n"
  167. "}\n"
  168. "}// namespace C\n"
  169. "}// namespace B\n"
  170. "}// namespace A",
  171. fixNamespaceEndComments("namespace A {\n"
  172. "namespace B {\n"
  173. "namespace C {\n"
  174. "namespace D {\n"
  175. "}\n"
  176. "}\n"
  177. "}\n"
  178. "}"));
  179. // Adds an end comment after a semicolon.
  180. EXPECT_EQ("namespace {\n"
  181. " int i;\n"
  182. " int j;\n"
  183. "};// namespace",
  184. fixNamespaceEndComments("namespace {\n"
  185. " int i;\n"
  186. " int j;\n"
  187. "};"));
  188. EXPECT_EQ("namespace A {\n"
  189. " int i;\n"
  190. " int j;\n"
  191. "};// namespace A",
  192. fixNamespaceEndComments("namespace A {\n"
  193. " int i;\n"
  194. " int j;\n"
  195. "};"));
  196. EXPECT_EQ("namespace A {\n"
  197. " int i;\n"
  198. " int j;\n"
  199. "};// namespace A\n"
  200. "// unrelated",
  201. fixNamespaceEndComments("namespace A {\n"
  202. " int i;\n"
  203. " int j;\n"
  204. "};\n"
  205. "// unrelated"));
  206. }
  207. TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
  208. EXPECT_EQ("namespace A {\n"
  209. " int i;\n"
  210. " int j;\n"
  211. "}// namespace A\n"
  212. " int k;",
  213. fixNamespaceEndComments("namespace A {\n"
  214. " int i;\n"
  215. " int j;\n"
  216. "} int k;"));
  217. EXPECT_EQ("namespace {\n"
  218. " int i;\n"
  219. " int j;\n"
  220. "}// namespace\n"
  221. " int k;",
  222. fixNamespaceEndComments("namespace {\n"
  223. " int i;\n"
  224. " int j;\n"
  225. "} int k;"));
  226. EXPECT_EQ("namespace A {\n"
  227. " int i;\n"
  228. " int j;\n"
  229. "}// namespace A\n"
  230. " namespace B {\n"
  231. " int j;\n"
  232. " int k;\n"
  233. "}// namespace B",
  234. fixNamespaceEndComments("namespace A {\n"
  235. " int i;\n"
  236. " int j;\n"
  237. "} namespace B {\n"
  238. " int j;\n"
  239. " int k;\n"
  240. "}"));
  241. EXPECT_EQ("namespace {\n"
  242. " int i;\n"
  243. " int j;\n"
  244. "};// namespace\n"
  245. "int k;",
  246. fixNamespaceEndComments("namespace {\n"
  247. " int i;\n"
  248. " int j;\n"
  249. "};int k;"));
  250. EXPECT_EQ("namespace {\n"
  251. " int i;\n"
  252. " int j;\n"
  253. "};// namespace\n"
  254. ";",
  255. fixNamespaceEndComments("namespace {\n"
  256. " int i;\n"
  257. " int j;\n"
  258. "};;"));
  259. }
  260. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
  261. EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
  262. EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
  263. EXPECT_EQ("namespace A { a }",
  264. fixNamespaceEndComments("namespace A { a }"));
  265. EXPECT_EQ("namespace A { a };",
  266. fixNamespaceEndComments("namespace A { a };"));
  267. }
  268. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
  269. EXPECT_EQ("namespace A {\n"
  270. " int i;\n"
  271. "}",
  272. fixNamespaceEndComments("namespace A {\n"
  273. " int i;\n"
  274. "}",
  275. // The range (16, 3) spans the 'int' above.
  276. /*Ranges=*/{1, tooling::Range(16, 3)}));
  277. EXPECT_EQ("namespace A {\n"
  278. " int i;\n"
  279. "};",
  280. fixNamespaceEndComments("namespace A {\n"
  281. " int i;\n"
  282. "};",
  283. // The range (16, 3) spans the 'int' above.
  284. /*Ranges=*/{1, tooling::Range(16, 3)}));
  285. }
  286. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
  287. EXPECT_EQ("#define SAD \\\n"
  288. "namespace A { \\\n"
  289. " int i; \\\n"
  290. "}",
  291. fixNamespaceEndComments("#define SAD \\\n"
  292. "namespace A { \\\n"
  293. " int i; \\\n"
  294. "}"));
  295. }
  296. TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
  297. EXPECT_EQ("namespace {\n"
  298. " int i;\n"
  299. "} // end anonymous namespace",
  300. fixNamespaceEndComments("namespace {\n"
  301. " int i;\n"
  302. "} // end anonymous namespace"));
  303. EXPECT_EQ("namespace A {\n"
  304. " int i;\n"
  305. "} /* end of namespace A */",
  306. fixNamespaceEndComments("namespace A {\n"
  307. " int i;\n"
  308. "} /* end of namespace A */"));
  309. EXPECT_EQ("namespace A {\n"
  310. " int i;\n"
  311. "} // namespace A",
  312. fixNamespaceEndComments("namespace A {\n"
  313. " int i;\n"
  314. "} // namespace A"));
  315. EXPECT_EQ("namespace A::B {\n"
  316. " int i;\n"
  317. "} // end namespace A::B",
  318. fixNamespaceEndComments("namespace A::B {\n"
  319. " int i;\n"
  320. "} // end namespace A::B"));
  321. EXPECT_EQ("namespace A {\n"
  322. " int i;\n"
  323. "}; // end namespace A",
  324. fixNamespaceEndComments("namespace A {\n"
  325. " int i;\n"
  326. "}; // end namespace A"));
  327. EXPECT_EQ("namespace {\n"
  328. " int i;\n"
  329. "}; /* unnamed namespace */",
  330. fixNamespaceEndComments("namespace {\n"
  331. " int i;\n"
  332. "}; /* unnamed namespace */"));
  333. }
  334. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
  335. EXPECT_EQ("namespace {\n"
  336. " int i;\n"
  337. "} // namespace",
  338. fixNamespaceEndComments("namespace {\n"
  339. " int i;\n"
  340. "} // namespace A"));
  341. EXPECT_EQ("namespace A {\n"
  342. " int i;\n"
  343. "} // namespace A",
  344. fixNamespaceEndComments("namespace A {\n"
  345. " int i;\n"
  346. "} // namespace"));
  347. EXPECT_EQ("namespace A {\n"
  348. " int i;\n"
  349. "} // namespace A",
  350. fixNamespaceEndComments("namespace A {\n"
  351. " int i;\n"
  352. "} //"));
  353. EXPECT_EQ("namespace A {\n"
  354. " int i;\n"
  355. "} // namespace A",
  356. fixNamespaceEndComments("namespace A {\n"
  357. " int i;\n"
  358. "} //"));
  359. EXPECT_EQ("namespace A {\n"
  360. " int i;\n"
  361. "} // namespace A",
  362. fixNamespaceEndComments("namespace A {\n"
  363. " int i;\n"
  364. "} // banamespace A"));
  365. EXPECT_EQ("namespace A {\n"
  366. " int i;\n"
  367. "}; // namespace A",
  368. fixNamespaceEndComments("namespace A {\n"
  369. " int i;\n"
  370. "}; // banamespace A"));
  371. // Updates invalid line comments even for short namespaces.
  372. EXPECT_EQ("namespace A {} // namespace A",
  373. fixNamespaceEndComments("namespace A {} // namespace"));
  374. EXPECT_EQ("namespace A {}; // namespace A",
  375. fixNamespaceEndComments("namespace A {}; // namespace"));
  376. }
  377. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
  378. EXPECT_EQ("namespace {\n"
  379. " int i;\n"
  380. "} // namespace",
  381. fixNamespaceEndComments("namespace {\n"
  382. " int i;\n"
  383. "} /* namespace A */"));
  384. EXPECT_EQ("namespace A {\n"
  385. " int i;\n"
  386. "} // namespace A",
  387. fixNamespaceEndComments("namespace A {\n"
  388. " int i;\n"
  389. "} /* end namespace */"));
  390. EXPECT_EQ("namespace A {\n"
  391. " int i;\n"
  392. "} // namespace A",
  393. fixNamespaceEndComments("namespace A {\n"
  394. " int i;\n"
  395. "} /**/"));
  396. EXPECT_EQ("namespace A {\n"
  397. " int i;\n"
  398. "} // namespace A",
  399. fixNamespaceEndComments("namespace A {\n"
  400. " int i;\n"
  401. "} /* end unnamed namespace */"));
  402. EXPECT_EQ("namespace A {\n"
  403. " int i;\n"
  404. "} // namespace A",
  405. fixNamespaceEndComments("namespace A {\n"
  406. " int i;\n"
  407. "} /* banamespace A */"));
  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 {} // namespace A",
  415. fixNamespaceEndComments("namespace A {} /**/"));
  416. EXPECT_EQ("namespace A {}; // namespace A",
  417. fixNamespaceEndComments("namespace A {}; /**/"));
  418. }
  419. TEST_F(NamespaceEndCommentsFixerTest,
  420. DoesNotAddEndCommentForNamespacesControlledByMacros) {
  421. EXPECT_EQ("#ifdef 1\n"
  422. "namespace A {\n"
  423. "#elseif\n"
  424. "namespace B {\n"
  425. "#endif\n"
  426. " int i;\n"
  427. "}\n"
  428. "}\n",
  429. fixNamespaceEndComments("#ifdef 1\n"
  430. "namespace A {\n"
  431. "#elseif\n"
  432. "namespace B {\n"
  433. "#endif\n"
  434. " int i;\n"
  435. "}\n"
  436. "}\n"));
  437. }
  438. TEST_F(NamespaceEndCommentsFixerTest,
  439. DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
  440. EXPECT_EQ("#ifdef 1\n"
  441. "namespace A {\n"
  442. "#elseif\n"
  443. "namespace B {\n"
  444. "#endif\n"
  445. " int i;\n"
  446. "}\n"
  447. "}\n",
  448. fixNamespaceEndComments("#ifdef 1\n"
  449. "namespace A {\n"
  450. "#elseif\n"
  451. "namespace B {\n"
  452. "#endif\n"
  453. " int i;\n"
  454. "}\n"
  455. "}\n"));
  456. EXPECT_EQ("namespace {\n"
  457. " int i;\n"
  458. " int j;\n"
  459. "}// namespace\n"
  460. "#if A\n"
  461. " int i;\n"
  462. "#else\n"
  463. " int j;\n"
  464. "#endif",
  465. fixNamespaceEndComments("namespace {\n"
  466. " int i;\n"
  467. " int j;\n"
  468. "}\n"
  469. "#if A\n"
  470. " int i;\n"
  471. "#else\n"
  472. " int j;\n"
  473. "#endif"));
  474. EXPECT_EQ("#if A\n"
  475. "namespace A {\n"
  476. "#else\n"
  477. "namespace B {\n"
  478. "#endif\n"
  479. "int i;\n"
  480. "int j;\n"
  481. "}",
  482. fixNamespaceEndComments("#if A\n"
  483. "namespace A {\n"
  484. "#else\n"
  485. "namespace B {\n"
  486. "#endif\n"
  487. "int i;\n"
  488. "int j;\n"
  489. "}"));
  490. EXPECT_EQ("#if A\n"
  491. "namespace A {\n"
  492. "#else\n"
  493. "namespace B {\n"
  494. "#endif\n"
  495. "int i;\n"
  496. "int j;\n"
  497. "} // namespace A",
  498. fixNamespaceEndComments("#if A\n"
  499. "namespace A {\n"
  500. "#else\n"
  501. "namespace B {\n"
  502. "#endif\n"
  503. "int i;\n"
  504. "int j;\n"
  505. "} // namespace A"));
  506. EXPECT_EQ("#if A\n"
  507. "namespace A {\n"
  508. "#else\n"
  509. "namespace B {\n"
  510. "#endif\n"
  511. "int i;\n"
  512. "int j;\n"
  513. "} // namespace B",
  514. fixNamespaceEndComments("#if A\n"
  515. "namespace A {\n"
  516. "#else\n"
  517. "namespace B {\n"
  518. "#endif\n"
  519. "int i;\n"
  520. "int j;\n"
  521. "} // namespace B"));
  522. EXPECT_EQ("namespace A\n"
  523. "int i;\n"
  524. "int j;\n"
  525. "#if A\n"
  526. "}\n"
  527. "#else\n"
  528. "}\n"
  529. "#endif",
  530. fixNamespaceEndComments("namespace A\n"
  531. "int i;\n"
  532. "int j;\n"
  533. "#if A\n"
  534. "}\n"
  535. "#else\n"
  536. "}\n"
  537. "#endif"));
  538. EXPECT_EQ("namespace A\n"
  539. "int i;\n"
  540. "int j;\n"
  541. "#if A\n"
  542. "} // namespace A\n"
  543. "#else\n"
  544. "} // namespace A\n"
  545. "#endif",
  546. fixNamespaceEndComments("namespace A\n"
  547. "int i;\n"
  548. "int j;\n"
  549. "#if A\n"
  550. "} // namespace A\n"
  551. "#else\n"
  552. "} // namespace A\n"
  553. "#endif"));
  554. }
  555. TEST_F(NamespaceEndCommentsFixerTest,
  556. DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
  557. EXPECT_EQ("namespace {\n"
  558. " int i;\n"
  559. "} // namespace\n"
  560. "}",
  561. fixNamespaceEndComments("namespace {\n"
  562. " int i;\n"
  563. "} // namespace\n"
  564. "}"));
  565. }
  566. TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) {
  567. EXPECT_EQ("template <int> struct a {};\n"
  568. "struct a<bool{}> b() {\n"
  569. "}\n"
  570. "#define c inline\n"
  571. "void d() {\n"
  572. "}\n",
  573. fixNamespaceEndComments("template <int> struct a {};\n"
  574. "struct a<bool{}> b() {\n"
  575. "}\n"
  576. "#define c inline\n"
  577. "void d() {\n"
  578. "}\n"));
  579. }
  580. } // end namespace
  581. } // end namespace format
  582. } // end namespace clang