NamespaceEndCommentsFixerTest.cpp 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  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. #include "clang/Format/Format.h"
  9. #include "clang/Frontend/TextDiagnosticPrinter.h"
  10. #include "llvm/Support/Debug.h"
  11. #include "gtest/gtest.h"
  12. #define DEBUG_TYPE "namespace-end-comments-fixer-test"
  13. namespace clang {
  14. namespace format {
  15. namespace {
  16. class NamespaceEndCommentsFixerTest : public ::testing::Test {
  17. protected:
  18. std::string
  19. fixNamespaceEndComments(llvm::StringRef Code,
  20. const std::vector<tooling::Range> &Ranges,
  21. const FormatStyle &Style = getLLVMStyle()) {
  22. LLVM_DEBUG(llvm::errs() << "---\n");
  23. LLVM_DEBUG(llvm::errs() << Code << "\n\n");
  24. tooling::Replacements Replaces =
  25. clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>");
  26. auto Result = applyAllReplacements(Code, Replaces);
  27. EXPECT_TRUE(static_cast<bool>(Result));
  28. LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  29. return *Result;
  30. }
  31. std::string
  32. fixNamespaceEndComments(llvm::StringRef Code,
  33. const FormatStyle &Style = getLLVMStyle()) {
  34. return fixNamespaceEndComments(
  35. Code,
  36. /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style);
  37. }
  38. };
  39. TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
  40. EXPECT_EQ("namespace {\n"
  41. "int i;\n"
  42. "int j;\n"
  43. "}// namespace",
  44. fixNamespaceEndComments("namespace {\n"
  45. "int i;\n"
  46. "int j;\n"
  47. "}"));
  48. EXPECT_EQ("namespace {\n"
  49. "int i;\n"
  50. "int j;\n"
  51. "}// namespace\n",
  52. fixNamespaceEndComments("namespace {\n"
  53. "int i;\n"
  54. "int j;\n"
  55. "}\n"));
  56. EXPECT_EQ("namespace A {\n"
  57. "int i;\n"
  58. "int j;\n"
  59. "}// namespace A",
  60. fixNamespaceEndComments("namespace A {\n"
  61. "int i;\n"
  62. "int j;\n"
  63. "}"));
  64. EXPECT_EQ("inline namespace A {\n"
  65. "int i;\n"
  66. "int j;\n"
  67. "}// namespace A",
  68. fixNamespaceEndComments("inline namespace A {\n"
  69. "int i;\n"
  70. "int j;\n"
  71. "}"));
  72. EXPECT_EQ("namespace [[deprecated(\"foo\")]] A::B {\n"
  73. "int i;\n"
  74. "int j;\n"
  75. "}// namespace A::B",
  76. fixNamespaceEndComments("namespace [[deprecated(\"foo\")]] A::B {\n"
  77. "int i;\n"
  78. "int j;\n"
  79. "}"));
  80. EXPECT_EQ("namespace [[deprecated(\"foo\")]] A::inline B::inline C {\n"
  81. "int i;\n"
  82. "int j;\n"
  83. "}// namespace A::inline B::inline C",
  84. fixNamespaceEndComments(
  85. "namespace [[deprecated(\"foo\")]] A::inline B::inline C {\n"
  86. "int i;\n"
  87. "int j;\n"
  88. "}"));
  89. EXPECT_EQ("namespace DEPRECATED A::B {\n"
  90. "int i;\n"
  91. "int j;\n"
  92. "}// namespace A::B",
  93. fixNamespaceEndComments("namespace DEPRECATED A::B {\n"
  94. "int i;\n"
  95. "int j;\n"
  96. "}"));
  97. EXPECT_EQ("inline namespace [[deprecated]] A {\n"
  98. "int i;\n"
  99. "int j;\n"
  100. "}// namespace A",
  101. fixNamespaceEndComments("inline namespace [[deprecated]] A {\n"
  102. "int i;\n"
  103. "int j;\n"
  104. "}"));
  105. EXPECT_EQ("namespace ::A {\n"
  106. "int i;\n"
  107. "int j;\n"
  108. "}// namespace ::A",
  109. fixNamespaceEndComments("namespace ::A {\n"
  110. "int i;\n"
  111. "int j;\n"
  112. "}"));
  113. EXPECT_EQ("namespace ::A::B {\n"
  114. "int i;\n"
  115. "int j;\n"
  116. "}// namespace ::A::B",
  117. fixNamespaceEndComments("namespace ::A::B {\n"
  118. "int i;\n"
  119. "int j;\n"
  120. "}"));
  121. EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
  122. "int i;\n"
  123. "int j;\n"
  124. "}// namespace ::A::B",
  125. fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
  126. "int i;\n"
  127. "int j;\n"
  128. "}"));
  129. EXPECT_EQ("namespace A {\n"
  130. "namespace B {\n"
  131. "int i;\n"
  132. "}\n"
  133. "}// namespace A",
  134. fixNamespaceEndComments("namespace A {\n"
  135. "namespace B {\n"
  136. "int i;\n"
  137. "}\n"
  138. "}"));
  139. EXPECT_EQ("namespace A {\n"
  140. "namespace B {\n"
  141. "int i;\n"
  142. "int j;\n"
  143. "}// namespace B\n"
  144. "}// namespace A",
  145. fixNamespaceEndComments("namespace A {\n"
  146. "namespace B {\n"
  147. "int i;\n"
  148. "int j;\n"
  149. "}\n"
  150. "}"));
  151. EXPECT_EQ("namespace A {\n"
  152. "int a;\n"
  153. "int b;\n"
  154. "}// namespace A\n"
  155. "namespace B {\n"
  156. "int b;\n"
  157. "int a;\n"
  158. "}// namespace B",
  159. fixNamespaceEndComments("namespace A {\n"
  160. "int a;\n"
  161. "int b;\n"
  162. "}\n"
  163. "namespace B {\n"
  164. "int b;\n"
  165. "int a;\n"
  166. "}"));
  167. EXPECT_EQ("namespace A {\n"
  168. "int a1;\n"
  169. "int a2;\n"
  170. "}// namespace A\n"
  171. "namespace A {\n"
  172. "int a2;\n"
  173. "int a1;\n"
  174. "}// namespace A",
  175. fixNamespaceEndComments("namespace A {\n"
  176. "int a1;\n"
  177. "int a2;\n"
  178. "}\n"
  179. "namespace A {\n"
  180. "int a2;\n"
  181. "int a1;\n"
  182. "}"));
  183. EXPECT_EQ("namespace A {\n"
  184. "int a;\n"
  185. "int b;\n"
  186. "}// namespace A\n"
  187. "// comment about b\n"
  188. "int b;",
  189. fixNamespaceEndComments("namespace A {\n"
  190. "int a;\n"
  191. "int b;\n"
  192. "}\n"
  193. "// comment about b\n"
  194. "int b;"));
  195. EXPECT_EQ("namespace A {\n"
  196. "namespace B {\n"
  197. "namespace C {\n"
  198. "namespace D {\n"
  199. "}\n"
  200. "}// namespace C\n"
  201. "}// namespace B\n"
  202. "}// namespace A",
  203. fixNamespaceEndComments("namespace A {\n"
  204. "namespace B {\n"
  205. "namespace C {\n"
  206. "namespace D {\n"
  207. "}\n"
  208. "}\n"
  209. "}\n"
  210. "}"));
  211. // Add comment for namespaces which will be 'compacted'
  212. FormatStyle CompactNamespacesStyle = getLLVMStyle();
  213. CompactNamespacesStyle.CompactNamespaces = true;
  214. EXPECT_EQ("namespace out { namespace in {\n"
  215. "int i;\n"
  216. "int j;\n"
  217. "}}// namespace out::in",
  218. fixNamespaceEndComments("namespace out { namespace in {\n"
  219. "int i;\n"
  220. "int j;\n"
  221. "}}",
  222. CompactNamespacesStyle));
  223. EXPECT_EQ("namespace out {\n"
  224. "namespace in {\n"
  225. "int i;\n"
  226. "int j;\n"
  227. "}\n"
  228. "}// namespace out::in",
  229. fixNamespaceEndComments("namespace out {\n"
  230. "namespace in {\n"
  231. "int i;\n"
  232. "int j;\n"
  233. "}\n"
  234. "}",
  235. CompactNamespacesStyle));
  236. EXPECT_EQ("namespace out { namespace in {\n"
  237. "int i;\n"
  238. "int j;\n"
  239. "};}// namespace out::in",
  240. fixNamespaceEndComments("namespace out { namespace in {\n"
  241. "int i;\n"
  242. "int j;\n"
  243. "};}",
  244. CompactNamespacesStyle));
  245. // Adds an end comment after a semicolon.
  246. EXPECT_EQ("namespace {\n"
  247. "int i;\n"
  248. "int j;\n"
  249. "};// namespace",
  250. fixNamespaceEndComments("namespace {\n"
  251. "int i;\n"
  252. "int j;\n"
  253. "};"));
  254. EXPECT_EQ("namespace A {\n"
  255. "int i;\n"
  256. "int j;\n"
  257. "};// namespace A",
  258. fixNamespaceEndComments("namespace A {\n"
  259. "int i;\n"
  260. "int j;\n"
  261. "};"));
  262. EXPECT_EQ("namespace A {\n"
  263. "int i;\n"
  264. "int j;\n"
  265. "};// namespace A\n"
  266. "// unrelated",
  267. fixNamespaceEndComments("namespace A {\n"
  268. "int i;\n"
  269. "int j;\n"
  270. "};\n"
  271. "// unrelated"));
  272. }
  273. TEST_F(NamespaceEndCommentsFixerTest, AddsMacroEndComment) {
  274. FormatStyle Style = getLLVMStyle();
  275. Style.NamespaceMacros.push_back("TESTSUITE");
  276. EXPECT_EQ("TESTSUITE() {\n"
  277. "int i;\n"
  278. "int j;\n"
  279. "}// TESTSUITE()",
  280. fixNamespaceEndComments("TESTSUITE() {\n"
  281. "int i;\n"
  282. "int j;\n"
  283. "}",
  284. Style));
  285. EXPECT_EQ("TESTSUITE(A) {\n"
  286. "int i;\n"
  287. "int j;\n"
  288. "}// TESTSUITE(A)",
  289. fixNamespaceEndComments("TESTSUITE(A) {\n"
  290. "int i;\n"
  291. "int j;\n"
  292. "}",
  293. Style));
  294. EXPECT_EQ("inline TESTSUITE(A) {\n"
  295. "int i;\n"
  296. "int j;\n"
  297. "}// TESTSUITE(A)",
  298. fixNamespaceEndComments("inline TESTSUITE(A) {\n"
  299. "int i;\n"
  300. "int j;\n"
  301. "}",
  302. Style));
  303. EXPECT_EQ("TESTSUITE(::A) {\n"
  304. "int i;\n"
  305. "int j;\n"
  306. "}// TESTSUITE(::A)",
  307. fixNamespaceEndComments("TESTSUITE(::A) {\n"
  308. "int i;\n"
  309. "int j;\n"
  310. "}",
  311. Style));
  312. EXPECT_EQ("TESTSUITE(::A::B) {\n"
  313. "int i;\n"
  314. "int j;\n"
  315. "}// TESTSUITE(::A::B)",
  316. fixNamespaceEndComments("TESTSUITE(::A::B) {\n"
  317. "int i;\n"
  318. "int j;\n"
  319. "}",
  320. Style));
  321. EXPECT_EQ("TESTSUITE(/**/::/**/A/**/::/**/B/**/) {\n"
  322. "int i;\n"
  323. "int j;\n"
  324. "}// TESTSUITE(::A::B)",
  325. fixNamespaceEndComments("TESTSUITE(/**/::/**/A/**/::/**/B/**/) {\n"
  326. "int i;\n"
  327. "int j;\n"
  328. "}",
  329. Style));
  330. EXPECT_EQ("TESTSUITE(A, B) {\n"
  331. "int i;\n"
  332. "int j;\n"
  333. "}// TESTSUITE(A)",
  334. fixNamespaceEndComments("TESTSUITE(A, B) {\n"
  335. "int i;\n"
  336. "int j;\n"
  337. "}",
  338. Style));
  339. EXPECT_EQ("TESTSUITE(\"Test1\") {\n"
  340. "int i;\n"
  341. "int j;\n"
  342. "}// TESTSUITE(\"Test1\")",
  343. fixNamespaceEndComments("TESTSUITE(\"Test1\") {\n"
  344. "int i;\n"
  345. "int j;\n"
  346. "}",
  347. Style));
  348. }
  349. TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
  350. EXPECT_EQ("namespace A {\n"
  351. "int i;\n"
  352. "int j;\n"
  353. "}// namespace A\n"
  354. " int k;",
  355. fixNamespaceEndComments("namespace A {\n"
  356. "int i;\n"
  357. "int j;\n"
  358. "} int k;"));
  359. EXPECT_EQ("namespace {\n"
  360. "int i;\n"
  361. "int j;\n"
  362. "}// namespace\n"
  363. " int k;",
  364. fixNamespaceEndComments("namespace {\n"
  365. "int i;\n"
  366. "int j;\n"
  367. "} int k;"));
  368. EXPECT_EQ("namespace A {\n"
  369. "int i;\n"
  370. "int j;\n"
  371. "}// namespace A\n"
  372. " namespace B {\n"
  373. "int j;\n"
  374. "int k;\n"
  375. "}// namespace B",
  376. fixNamespaceEndComments("namespace A {\n"
  377. "int i;\n"
  378. "int j;\n"
  379. "} namespace B {\n"
  380. "int j;\n"
  381. "int k;\n"
  382. "}"));
  383. EXPECT_EQ("namespace {\n"
  384. "int i;\n"
  385. "int j;\n"
  386. "};// namespace\n"
  387. "int k;",
  388. fixNamespaceEndComments("namespace {\n"
  389. "int i;\n"
  390. "int j;\n"
  391. "};int k;"));
  392. EXPECT_EQ("namespace {\n"
  393. "int i;\n"
  394. "int j;\n"
  395. "};// namespace\n"
  396. ";",
  397. fixNamespaceEndComments("namespace {\n"
  398. "int i;\n"
  399. "int j;\n"
  400. "};;"));
  401. }
  402. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
  403. EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
  404. EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
  405. EXPECT_EQ("namespace A { a }",
  406. fixNamespaceEndComments("namespace A { a }"));
  407. EXPECT_EQ("namespace A { a };",
  408. fixNamespaceEndComments("namespace A { a };"));
  409. }
  410. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
  411. EXPECT_EQ("namespace A {\n"
  412. "int i;\n"
  413. "}",
  414. fixNamespaceEndComments("namespace A {\n"
  415. "int i;\n"
  416. "}",
  417. // The range (16, 3) spans the 'int' above.
  418. /*Ranges=*/{1, tooling::Range(16, 3)}));
  419. EXPECT_EQ("namespace A {\n"
  420. "int i;\n"
  421. "};",
  422. fixNamespaceEndComments("namespace A {\n"
  423. "int i;\n"
  424. "};",
  425. // The range (16, 3) spans the 'int' above.
  426. /*Ranges=*/{1, tooling::Range(16, 3)}));
  427. }
  428. TEST_F(NamespaceEndCommentsFixerTest,
  429. DoesNotAddCommentAfterRBraceInPPDirective) {
  430. EXPECT_EQ("#define SAD \\\n"
  431. "namespace A { \\\n"
  432. "int i; \\\n"
  433. "}",
  434. fixNamespaceEndComments("#define SAD \\\n"
  435. "namespace A { \\\n"
  436. "int i; \\\n"
  437. "}"));
  438. }
  439. TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
  440. EXPECT_EQ("namespace {\n"
  441. "int i;\n"
  442. "} // end anonymous namespace",
  443. fixNamespaceEndComments("namespace {\n"
  444. "int i;\n"
  445. "} // end anonymous namespace"));
  446. EXPECT_EQ("namespace A {\n"
  447. "int i;\n"
  448. "} /* end of namespace A */",
  449. fixNamespaceEndComments("namespace A {\n"
  450. "int i;\n"
  451. "} /* end of namespace A */"));
  452. EXPECT_EQ("namespace A {\n"
  453. "int i;\n"
  454. "} // namespace A",
  455. fixNamespaceEndComments("namespace A {\n"
  456. "int i;\n"
  457. "} // namespace A"));
  458. EXPECT_EQ("namespace A::B {\n"
  459. "int i;\n"
  460. "} // end namespace A::B",
  461. fixNamespaceEndComments("namespace A::B {\n"
  462. "int i;\n"
  463. "} // end namespace A::B"));
  464. EXPECT_EQ("namespace A {\n"
  465. "int i;\n"
  466. "}; // end namespace A",
  467. fixNamespaceEndComments("namespace A {\n"
  468. "int i;\n"
  469. "}; // end namespace A"));
  470. EXPECT_EQ("namespace {\n"
  471. "int i;\n"
  472. "}; /* unnamed namespace */",
  473. fixNamespaceEndComments("namespace {\n"
  474. "int i;\n"
  475. "}; /* unnamed namespace */"));
  476. }
  477. TEST_F(NamespaceEndCommentsFixerTest, KeepsValidMacroEndComment) {
  478. FormatStyle Style = getLLVMStyle();
  479. Style.NamespaceMacros.push_back("TESTSUITE");
  480. EXPECT_EQ("TESTSUITE() {\n"
  481. "int i;\n"
  482. "} // end anonymous TESTSUITE()",
  483. fixNamespaceEndComments("TESTSUITE() {\n"
  484. "int i;\n"
  485. "} // end anonymous TESTSUITE()",
  486. Style));
  487. EXPECT_EQ("TESTSUITE(A) {\n"
  488. "int i;\n"
  489. "} /* end of TESTSUITE(A) */",
  490. fixNamespaceEndComments("TESTSUITE(A) {\n"
  491. "int i;\n"
  492. "} /* end of TESTSUITE(A) */",
  493. Style));
  494. EXPECT_EQ("TESTSUITE(A) {\n"
  495. "int i;\n"
  496. "} // TESTSUITE(A)",
  497. fixNamespaceEndComments("TESTSUITE(A) {\n"
  498. "int i;\n"
  499. "} // TESTSUITE(A)",
  500. Style));
  501. EXPECT_EQ("TESTSUITE(A::B) {\n"
  502. "int i;\n"
  503. "} // end TESTSUITE(A::B)",
  504. fixNamespaceEndComments("TESTSUITE(A::B) {\n"
  505. "int i;\n"
  506. "} // end TESTSUITE(A::B)",
  507. Style));
  508. EXPECT_EQ("TESTSUITE(A) {\n"
  509. "int i;\n"
  510. "}; // end TESTSUITE(A)",
  511. fixNamespaceEndComments("TESTSUITE(A) {\n"
  512. "int i;\n"
  513. "}; // end TESTSUITE(A)",
  514. Style));
  515. EXPECT_EQ("TESTSUITE() {\n"
  516. "int i;\n"
  517. "}; /* unnamed TESTSUITE() */",
  518. fixNamespaceEndComments("TESTSUITE() {\n"
  519. "int i;\n"
  520. "}; /* unnamed TESTSUITE() */",
  521. Style));
  522. }
  523. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
  524. EXPECT_EQ("namespace {\n"
  525. "int i;\n"
  526. "} // namespace",
  527. fixNamespaceEndComments("namespace {\n"
  528. "int i;\n"
  529. "} // namespace A"));
  530. EXPECT_EQ("namespace A {\n"
  531. "int i;\n"
  532. "} // namespace A",
  533. fixNamespaceEndComments("namespace A {\n"
  534. "int i;\n"
  535. "} // namespace"));
  536. EXPECT_EQ("namespace A {\n"
  537. "int i;\n"
  538. "} // namespace A",
  539. fixNamespaceEndComments("namespace A {\n"
  540. "int i;\n"
  541. "} //"));
  542. EXPECT_EQ("namespace A {\n"
  543. "int i;\n"
  544. "}; // namespace A",
  545. fixNamespaceEndComments("namespace A {\n"
  546. "int i;\n"
  547. "}; //"));
  548. EXPECT_EQ("namespace A {\n"
  549. "int i;\n"
  550. "} // namespace A",
  551. fixNamespaceEndComments("namespace A {\n"
  552. "int i;\n"
  553. "} // banamespace A"));
  554. EXPECT_EQ("namespace A {\n"
  555. "int i;\n"
  556. "}; // namespace A",
  557. fixNamespaceEndComments("namespace A {\n"
  558. "int i;\n"
  559. "}; // banamespace A"));
  560. // Updates invalid line comments even for short namespaces.
  561. EXPECT_EQ("namespace A {} // namespace A",
  562. fixNamespaceEndComments("namespace A {} // namespace"));
  563. EXPECT_EQ("namespace A {}; // namespace A",
  564. fixNamespaceEndComments("namespace A {}; // namespace"));
  565. // Update invalid comments for compacted namespaces.
  566. FormatStyle CompactNamespacesStyle = getLLVMStyle();
  567. CompactNamespacesStyle.CompactNamespaces = true;
  568. EXPECT_EQ("namespace out { namespace in {\n"
  569. "}} // namespace out::in",
  570. fixNamespaceEndComments("namespace out { namespace in {\n"
  571. "}} // namespace out",
  572. CompactNamespacesStyle));
  573. EXPECT_EQ("namespace out { namespace in {\n"
  574. "}} // namespace out::in",
  575. fixNamespaceEndComments("namespace out { namespace in {\n"
  576. "}} // namespace in",
  577. CompactNamespacesStyle));
  578. EXPECT_EQ("namespace out { namespace in {\n"
  579. "}\n"
  580. "} // namespace out::in",
  581. fixNamespaceEndComments("namespace out { namespace in {\n"
  582. "}// banamespace in\n"
  583. "} // namespace out",
  584. CompactNamespacesStyle));
  585. }
  586. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidMacroEndLineComment) {
  587. FormatStyle Style = getLLVMStyle();
  588. Style.NamespaceMacros.push_back("TESTSUITE");
  589. EXPECT_EQ("TESTSUITE() {\n"
  590. "int i;\n"
  591. "} // TESTSUITE()",
  592. fixNamespaceEndComments("TESTSUITE() {\n"
  593. "int i;\n"
  594. "} // TESTSUITE(A)",
  595. Style));
  596. EXPECT_EQ("TESTSUITE(A) {\n"
  597. "int i;\n"
  598. "} // TESTSUITE(A)",
  599. fixNamespaceEndComments("TESTSUITE(A) {\n"
  600. "int i;\n"
  601. "} // TESTSUITE()",
  602. Style));
  603. EXPECT_EQ("TESTSUITE(A) {\n"
  604. "int i;\n"
  605. "} // TESTSUITE(A)",
  606. fixNamespaceEndComments("TESTSUITE(A) {\n"
  607. "int i;\n"
  608. "} //",
  609. Style));
  610. EXPECT_EQ("TESTSUITE(A) {\n"
  611. "int i;\n"
  612. "}; // TESTSUITE(A)",
  613. fixNamespaceEndComments("TESTSUITE(A) {\n"
  614. "int i;\n"
  615. "}; //",
  616. Style));
  617. EXPECT_EQ("TESTSUITE(A) {\n"
  618. "int i;\n"
  619. "} // TESTSUITE(A)",
  620. fixNamespaceEndComments("TESTSUITE(A) {\n"
  621. "int i;\n"
  622. "} // TESTSUITE A",
  623. Style));
  624. EXPECT_EQ("TESTSUITE() {\n"
  625. "int i;\n"
  626. "} // TESTSUITE()",
  627. fixNamespaceEndComments("TESTSUITE() {\n"
  628. "int i;\n"
  629. "} // TESTSUITE",
  630. Style));
  631. EXPECT_EQ("TESTSUITE(A) {\n"
  632. "int i;\n"
  633. "} // TESTSUITE(A)",
  634. fixNamespaceEndComments("TESTSUITE(A) {\n"
  635. "int i;\n"
  636. "} // TOASTSUITE(A)",
  637. Style));
  638. EXPECT_EQ("TESTSUITE(A) {\n"
  639. "int i;\n"
  640. "}; // TESTSUITE(A)",
  641. fixNamespaceEndComments("TESTSUITE(A) {\n"
  642. "int i;\n"
  643. "}; // TOASTSUITE(A)",
  644. Style));
  645. // Updates invalid line comments even for short namespaces.
  646. EXPECT_EQ("TESTSUITE(A) {} // TESTSUITE(A)",
  647. fixNamespaceEndComments("TESTSUITE(A) {} // TESTSUITE()", Style));
  648. EXPECT_EQ("TESTSUITE(A) {}; // TESTSUITE(A)",
  649. fixNamespaceEndComments("TESTSUITE(A) {}; // TESTSUITE()", Style));
  650. // Update invalid comments for compacted namespaces.
  651. FormatStyle CompactNamespacesStyle = getLLVMStyle();
  652. CompactNamespacesStyle.CompactNamespaces = true;
  653. CompactNamespacesStyle.NamespaceMacros.push_back("TESTSUITE");
  654. EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
  655. "}} // TESTSUITE(out::in)",
  656. fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"
  657. "}} // TESTSUITE(out)",
  658. CompactNamespacesStyle));
  659. EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
  660. "}} // TESTSUITE(out::in)",
  661. fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"
  662. "}} // TESTSUITE(in)",
  663. CompactNamespacesStyle));
  664. EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
  665. "}\n"
  666. "} // TESTSUITE(out::in)",
  667. fixNamespaceEndComments("TESTSUITE(out) { TESTSUITE(in) {\n"
  668. "}// TAOSTSUITE(in)\n"
  669. "} // TESTSUITE(out)",
  670. CompactNamespacesStyle));
  671. }
  672. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
  673. EXPECT_EQ("namespace {\n"
  674. "int i;\n"
  675. "} // namespace",
  676. fixNamespaceEndComments("namespace {\n"
  677. "int i;\n"
  678. "} /* namespace A */"));
  679. EXPECT_EQ("namespace A {\n"
  680. "int i;\n"
  681. "} // namespace A",
  682. fixNamespaceEndComments("namespace A {\n"
  683. "int i;\n"
  684. "} /* end namespace */"));
  685. EXPECT_EQ("namespace A {\n"
  686. "int i;\n"
  687. "} // namespace A",
  688. fixNamespaceEndComments("namespace A {\n"
  689. "int i;\n"
  690. "} /**/"));
  691. EXPECT_EQ("namespace A {\n"
  692. "int i;\n"
  693. "} // namespace A",
  694. fixNamespaceEndComments("namespace A {\n"
  695. "int i;\n"
  696. "} /* end unnamed namespace */"));
  697. EXPECT_EQ("namespace A {\n"
  698. "int i;\n"
  699. "} // namespace A",
  700. fixNamespaceEndComments("namespace A {\n"
  701. "int i;\n"
  702. "} /* banamespace A */"));
  703. EXPECT_EQ("namespace A {\n"
  704. "int i;\n"
  705. "}; // namespace A",
  706. fixNamespaceEndComments("namespace A {\n"
  707. "int i;\n"
  708. "}; /* banamespace A */"));
  709. EXPECT_EQ("namespace A {} // namespace A",
  710. fixNamespaceEndComments("namespace A {} /**/"));
  711. EXPECT_EQ("namespace A {}; // namespace A",
  712. fixNamespaceEndComments("namespace A {}; /**/"));
  713. }
  714. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidMacroEndBlockComment) {
  715. FormatStyle Style = getLLVMStyle();
  716. Style.NamespaceMacros.push_back("TESTSUITE");
  717. EXPECT_EQ("TESTSUITE() {\n"
  718. "int i;\n"
  719. "} // TESTSUITE()",
  720. fixNamespaceEndComments("TESTSUITE() {\n"
  721. "int i;\n"
  722. "} /* TESTSUITE(A) */",
  723. Style));
  724. EXPECT_EQ("TESTSUITE(A) {\n"
  725. "int i;\n"
  726. "} // TESTSUITE(A)",
  727. fixNamespaceEndComments("TESTSUITE(A) {\n"
  728. "int i;\n"
  729. "} /* end TESTSUITE() */",
  730. Style));
  731. EXPECT_EQ("TESTSUITE(A) {\n"
  732. "int i;\n"
  733. "} // TESTSUITE(A)",
  734. fixNamespaceEndComments("TESTSUITE(A) {\n"
  735. "int i;\n"
  736. "} /**/",
  737. Style));
  738. EXPECT_EQ("TESTSUITE(A) {\n"
  739. "int i;\n"
  740. "} // TESTSUITE(A)",
  741. fixNamespaceEndComments("TESTSUITE(A) {\n"
  742. "int i;\n"
  743. "} /* end unnamed TESTSUITE() */",
  744. Style));
  745. EXPECT_EQ("TESTSUITE(A) {\n"
  746. "int i;\n"
  747. "} // TESTSUITE(A)",
  748. fixNamespaceEndComments("TESTSUITE(A) {\n"
  749. "int i;\n"
  750. "} /* TOASTSUITE(A) */",
  751. Style));
  752. EXPECT_EQ("TESTSUITE(A) {\n"
  753. "int i;\n"
  754. "}; // TESTSUITE(A)",
  755. fixNamespaceEndComments("TESTSUITE(A) {\n"
  756. "int i;\n"
  757. "}; /* TAOSTSUITE(A) */",
  758. Style));
  759. EXPECT_EQ("TESTSUITE(A) {} // TESTSUITE(A)",
  760. fixNamespaceEndComments("TESTSUITE(A) {} /**/", Style));
  761. EXPECT_EQ("TESTSUITE(A) {}; // TESTSUITE(A)",
  762. fixNamespaceEndComments("TESTSUITE(A) {}; /**/", Style));
  763. }
  764. TEST_F(NamespaceEndCommentsFixerTest,
  765. DoesNotAddEndCommentForNamespacesControlledByMacros) {
  766. EXPECT_EQ("#ifdef 1\n"
  767. "namespace A {\n"
  768. "#elseif\n"
  769. "namespace B {\n"
  770. "#endif\n"
  771. "int i;\n"
  772. "}\n"
  773. "}\n",
  774. fixNamespaceEndComments("#ifdef 1\n"
  775. "namespace A {\n"
  776. "#elseif\n"
  777. "namespace B {\n"
  778. "#endif\n"
  779. "int i;\n"
  780. "}\n"
  781. "}\n"));
  782. }
  783. TEST_F(NamespaceEndCommentsFixerTest, AddEndCommentForNamespacesAroundMacros) {
  784. // Conditional blocks around are fine
  785. EXPECT_EQ("namespace A {\n"
  786. "#if 1\n"
  787. "int i;\n"
  788. "#endif\n"
  789. "}// namespace A",
  790. fixNamespaceEndComments("namespace A {\n"
  791. "#if 1\n"
  792. "int i;\n"
  793. "#endif\n"
  794. "}"));
  795. EXPECT_EQ("#if 1\n"
  796. "#endif\n"
  797. "namespace A {\n"
  798. "int i;\n"
  799. "int j;\n"
  800. "}// namespace A",
  801. fixNamespaceEndComments("#if 1\n"
  802. "#endif\n"
  803. "namespace A {\n"
  804. "int i;\n"
  805. "int j;\n"
  806. "}"));
  807. EXPECT_EQ("namespace A {\n"
  808. "int i;\n"
  809. "int j;\n"
  810. "}// namespace A\n"
  811. "#if 1\n"
  812. "#endif",
  813. fixNamespaceEndComments("namespace A {\n"
  814. "int i;\n"
  815. "int j;\n"
  816. "}\n"
  817. "#if 1\n"
  818. "#endif"));
  819. EXPECT_EQ("#if 1\n"
  820. "namespace A {\n"
  821. "int i;\n"
  822. "int j;\n"
  823. "}// namespace A\n"
  824. "#endif",
  825. fixNamespaceEndComments("#if 1\n"
  826. "namespace A {\n"
  827. "int i;\n"
  828. "int j;\n"
  829. "}\n"
  830. "#endif"));
  831. // Macro definition has no impact
  832. EXPECT_EQ("namespace A {\n"
  833. "#define FOO\n"
  834. "int i;\n"
  835. "}// namespace A",
  836. fixNamespaceEndComments("namespace A {\n"
  837. "#define FOO\n"
  838. "int i;\n"
  839. "}"));
  840. EXPECT_EQ("#define FOO\n"
  841. "namespace A {\n"
  842. "int i;\n"
  843. "int j;\n"
  844. "}// namespace A",
  845. fixNamespaceEndComments("#define FOO\n"
  846. "namespace A {\n"
  847. "int i;\n"
  848. "int j;\n"
  849. "}"));
  850. EXPECT_EQ("namespace A {\n"
  851. "int i;\n"
  852. "int j;\n"
  853. "}// namespace A\n"
  854. "#define FOO\n",
  855. fixNamespaceEndComments("namespace A {\n"
  856. "int i;\n"
  857. "int j;\n"
  858. "}\n"
  859. "#define FOO\n"));
  860. // No replacement if open & close in different conditional blocks
  861. EXPECT_EQ("#if 1\n"
  862. "namespace A {\n"
  863. "#endif\n"
  864. "int i;\n"
  865. "int j;\n"
  866. "#if 1\n"
  867. "}\n"
  868. "#endif",
  869. fixNamespaceEndComments("#if 1\n"
  870. "namespace A {\n"
  871. "#endif\n"
  872. "int i;\n"
  873. "int j;\n"
  874. "#if 1\n"
  875. "}\n"
  876. "#endif"));
  877. EXPECT_EQ("#ifdef A\n"
  878. "namespace A {\n"
  879. "#endif\n"
  880. "int i;\n"
  881. "int j;\n"
  882. "#ifdef B\n"
  883. "}\n"
  884. "#endif",
  885. fixNamespaceEndComments("#ifdef A\n"
  886. "namespace A {\n"
  887. "#endif\n"
  888. "int i;\n"
  889. "int j;\n"
  890. "#ifdef B\n"
  891. "}\n"
  892. "#endif"));
  893. // No replacement inside unreachable conditional block
  894. EXPECT_EQ("#if 0\n"
  895. "namespace A {\n"
  896. "int i;\n"
  897. "int j;\n"
  898. "}\n"
  899. "#endif",
  900. fixNamespaceEndComments("#if 0\n"
  901. "namespace A {\n"
  902. "int i;\n"
  903. "int j;\n"
  904. "}\n"
  905. "#endif"));
  906. }
  907. TEST_F(NamespaceEndCommentsFixerTest,
  908. DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
  909. EXPECT_EQ("#ifdef 1\n"
  910. "namespace A {\n"
  911. "#elseif\n"
  912. "namespace B {\n"
  913. "#endif\n"
  914. "int i;\n"
  915. "}\n"
  916. "}\n",
  917. fixNamespaceEndComments("#ifdef 1\n"
  918. "namespace A {\n"
  919. "#elseif\n"
  920. "namespace B {\n"
  921. "#endif\n"
  922. "int i;\n"
  923. "}\n"
  924. "}\n"));
  925. EXPECT_EQ("namespace {\n"
  926. "int i;\n"
  927. "int j;\n"
  928. "}// namespace\n"
  929. "#if A\n"
  930. "int i;\n"
  931. "#else\n"
  932. "int j;\n"
  933. "#endif",
  934. fixNamespaceEndComments("namespace {\n"
  935. "int i;\n"
  936. "int j;\n"
  937. "}\n"
  938. "#if A\n"
  939. "int i;\n"
  940. "#else\n"
  941. "int j;\n"
  942. "#endif"));
  943. EXPECT_EQ("#if A\n"
  944. "namespace A {\n"
  945. "#else\n"
  946. "namespace B {\n"
  947. "#endif\n"
  948. "int i;\n"
  949. "int j;\n"
  950. "}",
  951. fixNamespaceEndComments("#if A\n"
  952. "namespace A {\n"
  953. "#else\n"
  954. "namespace B {\n"
  955. "#endif\n"
  956. "int i;\n"
  957. "int j;\n"
  958. "}"));
  959. EXPECT_EQ("#if A\n"
  960. "namespace A {\n"
  961. "#else\n"
  962. "namespace B {\n"
  963. "#endif\n"
  964. "int i;\n"
  965. "int j;\n"
  966. "} // namespace A",
  967. fixNamespaceEndComments("#if A\n"
  968. "namespace A {\n"
  969. "#else\n"
  970. "namespace B {\n"
  971. "#endif\n"
  972. "int i;\n"
  973. "int j;\n"
  974. "} // namespace A"));
  975. EXPECT_EQ("#if A\n"
  976. "namespace A {\n"
  977. "#else\n"
  978. "namespace B {\n"
  979. "#endif\n"
  980. "int i;\n"
  981. "int j;\n"
  982. "} // namespace B",
  983. fixNamespaceEndComments("#if A\n"
  984. "namespace A {\n"
  985. "#else\n"
  986. "namespace B {\n"
  987. "#endif\n"
  988. "int i;\n"
  989. "int j;\n"
  990. "} // namespace B"));
  991. EXPECT_EQ("namespace A\n"
  992. "int i;\n"
  993. "int j;\n"
  994. "#if A\n"
  995. "}\n"
  996. "#else\n"
  997. "}\n"
  998. "#endif",
  999. fixNamespaceEndComments("namespace A\n"
  1000. "int i;\n"
  1001. "int j;\n"
  1002. "#if A\n"
  1003. "}\n"
  1004. "#else\n"
  1005. "}\n"
  1006. "#endif"));
  1007. EXPECT_EQ("namespace A\n"
  1008. "int i;\n"
  1009. "int j;\n"
  1010. "#if A\n"
  1011. "} // namespace A\n"
  1012. "#else\n"
  1013. "} // namespace A\n"
  1014. "#endif",
  1015. fixNamespaceEndComments("namespace A\n"
  1016. "int i;\n"
  1017. "int j;\n"
  1018. "#if A\n"
  1019. "} // namespace A\n"
  1020. "#else\n"
  1021. "} // namespace A\n"
  1022. "#endif"));
  1023. }
  1024. TEST_F(NamespaceEndCommentsFixerTest,
  1025. DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
  1026. EXPECT_EQ("namespace {\n"
  1027. "int i;\n"
  1028. "} // namespace\n"
  1029. "}",
  1030. fixNamespaceEndComments("namespace {\n"
  1031. "int i;\n"
  1032. "} // namespace\n"
  1033. "}"));
  1034. }
  1035. TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) {
  1036. EXPECT_EQ("template <int> struct a {};\n"
  1037. "struct a<bool{}> b() {\n"
  1038. "}\n"
  1039. "#define c inline\n"
  1040. "void d() {\n"
  1041. "}\n",
  1042. fixNamespaceEndComments("template <int> struct a {};\n"
  1043. "struct a<bool{}> b() {\n"
  1044. "}\n"
  1045. "#define c inline\n"
  1046. "void d() {\n"
  1047. "}\n"));
  1048. }
  1049. } // end namespace
  1050. } // end namespace format
  1051. } // end namespace clang