FormatTestComments.cpp 89 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512
  1. //===- unittest/Format/FormatTestComments.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 "../Tooling/ReplacementTest.h"
  11. #include "FormatTestUtils.h"
  12. #include "clang/Frontend/TextDiagnosticPrinter.h"
  13. #include "llvm/Support/Debug.h"
  14. #include "llvm/Support/MemoryBuffer.h"
  15. #include "gtest/gtest.h"
  16. #define DEBUG_TYPE "format-test"
  17. using clang::tooling::ReplacementTest;
  18. namespace clang {
  19. namespace format {
  20. namespace {
  21. FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
  22. class FormatTestComments : public ::testing::Test {
  23. protected:
  24. enum StatusCheck {
  25. SC_ExpectComplete,
  26. SC_ExpectIncomplete,
  27. SC_DoNotCheck
  28. };
  29. std::string format(llvm::StringRef Code,
  30. const FormatStyle &Style = getLLVMStyle(),
  31. StatusCheck CheckComplete = SC_ExpectComplete) {
  32. DEBUG(llvm::errs() << "---\n");
  33. DEBUG(llvm::errs() << Code << "\n\n");
  34. std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
  35. FormattingAttemptStatus Status;
  36. tooling::Replacements Replaces =
  37. reformat(Style, Code, Ranges, "<stdin>", &Status);
  38. if (CheckComplete != SC_DoNotCheck) {
  39. bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
  40. EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
  41. << Code << "\n\n";
  42. }
  43. ReplacementCount = Replaces.size();
  44. auto Result = applyAllReplacements(Code, Replaces);
  45. EXPECT_TRUE(static_cast<bool>(Result));
  46. DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  47. return *Result;
  48. }
  49. FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
  50. FormatStyle Style = getLLVMStyle();
  51. Style.ColumnLimit = ColumnLimit;
  52. return Style;
  53. }
  54. void verifyFormat(llvm::StringRef Code,
  55. const FormatStyle &Style = getLLVMStyle()) {
  56. EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
  57. }
  58. void verifyGoogleFormat(llvm::StringRef Code) {
  59. verifyFormat(Code, getGoogleStyle());
  60. }
  61. /// \brief Verify that clang-format does not crash on the given input.
  62. void verifyNoCrash(llvm::StringRef Code,
  63. const FormatStyle &Style = getLLVMStyle()) {
  64. format(Code, Style, SC_DoNotCheck);
  65. }
  66. int ReplacementCount;
  67. };
  68. //===----------------------------------------------------------------------===//
  69. // Tests for comments.
  70. //===----------------------------------------------------------------------===//
  71. TEST_F(FormatTestComments, UnderstandsSingleLineComments) {
  72. verifyFormat("//* */");
  73. verifyFormat("// line 1\n"
  74. "// line 2\n"
  75. "void f() {}\n");
  76. verifyFormat("void f() {\n"
  77. " // Doesn't do anything\n"
  78. "}");
  79. verifyFormat("SomeObject\n"
  80. " // Calling someFunction on SomeObject\n"
  81. " .someFunction();");
  82. verifyFormat("auto result = SomeObject\n"
  83. " // Calling someFunction on SomeObject\n"
  84. " .someFunction();");
  85. verifyFormat("void f(int i, // some comment (probably for i)\n"
  86. " int j, // some comment (probably for j)\n"
  87. " int k); // some comment (probably for k)");
  88. verifyFormat("void f(int i,\n"
  89. " // some comment (probably for j)\n"
  90. " int j,\n"
  91. " // some comment (probably for k)\n"
  92. " int k);");
  93. verifyFormat("int i // This is a fancy variable\n"
  94. " = 5; // with nicely aligned comment.");
  95. verifyFormat("// Leading comment.\n"
  96. "int a; // Trailing comment.");
  97. verifyFormat("int a; // Trailing comment\n"
  98. " // on 2\n"
  99. " // or 3 lines.\n"
  100. "int b;");
  101. verifyFormat("int a; // Trailing comment\n"
  102. "\n"
  103. "// Leading comment.\n"
  104. "int b;");
  105. verifyFormat("int a; // Comment.\n"
  106. " // More details.\n"
  107. "int bbbb; // Another comment.");
  108. verifyFormat(
  109. "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
  110. "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
  111. "int cccccccccccccccccccccccccccccc; // comment\n"
  112. "int ddd; // looooooooooooooooooooooooong comment\n"
  113. "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
  114. "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
  115. "int ccccccccccccccccccc; // comment");
  116. verifyFormat("#include \"a\" // comment\n"
  117. "#include \"a/b/c\" // comment");
  118. verifyFormat("#include <a> // comment\n"
  119. "#include <a/b/c> // comment");
  120. EXPECT_EQ("#include \"a\" // comment\n"
  121. "#include \"a/b/c\" // comment",
  122. format("#include \\\n"
  123. " \"a\" // comment\n"
  124. "#include \"a/b/c\" // comment"));
  125. verifyFormat("enum E {\n"
  126. " // comment\n"
  127. " VAL_A, // comment\n"
  128. " VAL_B\n"
  129. "};");
  130. EXPECT_EQ("enum A {\n"
  131. " // line a\n"
  132. " a,\n"
  133. " b, // line b\n"
  134. "\n"
  135. " // line c\n"
  136. " c\n"
  137. "};",
  138. format("enum A {\n"
  139. " // line a\n"
  140. " a,\n"
  141. " b, // line b\n"
  142. "\n"
  143. " // line c\n"
  144. " c\n"
  145. "};",
  146. getLLVMStyleWithColumns(20)));
  147. EXPECT_EQ("enum A {\n"
  148. " a, // line 1\n"
  149. " // line 2\n"
  150. "};",
  151. format("enum A {\n"
  152. " a, // line 1\n"
  153. " // line 2\n"
  154. "};",
  155. getLLVMStyleWithColumns(20)));
  156. EXPECT_EQ("enum A {\n"
  157. " a, // line 1\n"
  158. " // line 2\n"
  159. "};",
  160. format("enum A {\n"
  161. " a, // line 1\n"
  162. " // line 2\n"
  163. "};",
  164. getLLVMStyleWithColumns(20)));
  165. EXPECT_EQ("enum A {\n"
  166. " a, // line 1\n"
  167. " // line 2\n"
  168. " b\n"
  169. "};",
  170. format("enum A {\n"
  171. " a, // line 1\n"
  172. " // line 2\n"
  173. " b\n"
  174. "};",
  175. getLLVMStyleWithColumns(20)));
  176. EXPECT_EQ("enum A {\n"
  177. " a, // line 1\n"
  178. " // line 2\n"
  179. " b\n"
  180. "};",
  181. format("enum A {\n"
  182. " a, // line 1\n"
  183. " // line 2\n"
  184. " b\n"
  185. "};",
  186. getLLVMStyleWithColumns(20)));
  187. verifyFormat(
  188. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
  189. " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
  190. verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
  191. " // Comment inside a statement.\n"
  192. " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
  193. verifyFormat("SomeFunction(a,\n"
  194. " // comment\n"
  195. " b + x);");
  196. verifyFormat("SomeFunction(a, a,\n"
  197. " // comment\n"
  198. " b + x);");
  199. verifyFormat(
  200. "bool aaaaaaaaaaaaa = // comment\n"
  201. " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
  202. " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
  203. verifyFormat("int aaaa; // aaaaa\n"
  204. "int aa; // aaaaaaa",
  205. getLLVMStyleWithColumns(20));
  206. EXPECT_EQ("void f() { // This does something ..\n"
  207. "}\n"
  208. "int a; // This is unrelated",
  209. format("void f() { // This does something ..\n"
  210. " }\n"
  211. "int a; // This is unrelated"));
  212. EXPECT_EQ("class C {\n"
  213. " void f() { // This does something ..\n"
  214. " } // awesome..\n"
  215. "\n"
  216. " int a; // This is unrelated\n"
  217. "};",
  218. format("class C{void f() { // This does something ..\n"
  219. " } // awesome..\n"
  220. " \n"
  221. "int a; // This is unrelated\n"
  222. "};"));
  223. EXPECT_EQ("int i; // single line trailing comment",
  224. format("int i;\\\n// single line trailing comment"));
  225. verifyGoogleFormat("int a; // Trailing comment.");
  226. verifyFormat("someFunction(anotherFunction( // Force break.\n"
  227. " parameter));");
  228. verifyGoogleFormat("#endif // HEADER_GUARD");
  229. verifyFormat("const char *test[] = {\n"
  230. " // A\n"
  231. " \"aaaa\",\n"
  232. " // B\n"
  233. " \"aaaaa\"};");
  234. verifyGoogleFormat(
  235. "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
  236. " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
  237. EXPECT_EQ("D(a, {\n"
  238. " // test\n"
  239. " int a;\n"
  240. "});",
  241. format("D(a, {\n"
  242. "// test\n"
  243. "int a;\n"
  244. "});"));
  245. EXPECT_EQ("lineWith(); // comment\n"
  246. "// at start\n"
  247. "otherLine();",
  248. format("lineWith(); // comment\n"
  249. "// at start\n"
  250. "otherLine();"));
  251. EXPECT_EQ("lineWith(); // comment\n"
  252. "/*\n"
  253. " * at start */\n"
  254. "otherLine();",
  255. format("lineWith(); // comment\n"
  256. "/*\n"
  257. " * at start */\n"
  258. "otherLine();"));
  259. EXPECT_EQ("lineWith(); // comment\n"
  260. " // at start\n"
  261. "otherLine();",
  262. format("lineWith(); // comment\n"
  263. " // at start\n"
  264. "otherLine();"));
  265. EXPECT_EQ("lineWith(); // comment\n"
  266. "// at start\n"
  267. "otherLine(); // comment",
  268. format("lineWith(); // comment\n"
  269. "// at start\n"
  270. "otherLine(); // comment"));
  271. EXPECT_EQ("lineWith();\n"
  272. "// at start\n"
  273. "otherLine(); // comment",
  274. format("lineWith();\n"
  275. " // at start\n"
  276. "otherLine(); // comment"));
  277. EXPECT_EQ("// first\n"
  278. "// at start\n"
  279. "otherLine(); // comment",
  280. format("// first\n"
  281. " // at start\n"
  282. "otherLine(); // comment"));
  283. EXPECT_EQ("f();\n"
  284. "// first\n"
  285. "// at start\n"
  286. "otherLine(); // comment",
  287. format("f();\n"
  288. "// first\n"
  289. " // at start\n"
  290. "otherLine(); // comment"));
  291. verifyFormat("f(); // comment\n"
  292. "// first\n"
  293. "// at start\n"
  294. "otherLine();");
  295. EXPECT_EQ("f(); // comment\n"
  296. "// first\n"
  297. "// at start\n"
  298. "otherLine();",
  299. format("f(); // comment\n"
  300. "// first\n"
  301. " // at start\n"
  302. "otherLine();"));
  303. EXPECT_EQ("f(); // comment\n"
  304. " // first\n"
  305. "// at start\n"
  306. "otherLine();",
  307. format("f(); // comment\n"
  308. " // first\n"
  309. "// at start\n"
  310. "otherLine();"));
  311. EXPECT_EQ("void f() {\n"
  312. " lineWith(); // comment\n"
  313. " // at start\n"
  314. "}",
  315. format("void f() {\n"
  316. " lineWith(); // comment\n"
  317. " // at start\n"
  318. "}"));
  319. EXPECT_EQ("int xy; // a\n"
  320. "int z; // b",
  321. format("int xy; // a\n"
  322. "int z; //b"));
  323. EXPECT_EQ("int xy; // a\n"
  324. "int z; // bb",
  325. format("int xy; // a\n"
  326. "int z; //bb",
  327. getLLVMStyleWithColumns(12)));
  328. verifyFormat("#define A \\\n"
  329. " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
  330. " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
  331. getLLVMStyleWithColumns(60));
  332. verifyFormat(
  333. "#define A \\\n"
  334. " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
  335. " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
  336. getLLVMStyleWithColumns(61));
  337. verifyFormat("if ( // This is some comment\n"
  338. " x + 3) {\n"
  339. "}");
  340. EXPECT_EQ("if ( // This is some comment\n"
  341. " // spanning two lines\n"
  342. " x + 3) {\n"
  343. "}",
  344. format("if( // This is some comment\n"
  345. " // spanning two lines\n"
  346. " x + 3) {\n"
  347. "}"));
  348. verifyNoCrash("/\\\n/");
  349. verifyNoCrash("/\\\n* */");
  350. // The 0-character somehow makes the lexer return a proper comment.
  351. verifyNoCrash(StringRef("/*\\\0\n/", 6));
  352. }
  353. TEST_F(FormatTestComments, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
  354. EXPECT_EQ("SomeFunction(a,\n"
  355. " b, // comment\n"
  356. " c);",
  357. format("SomeFunction(a,\n"
  358. " b, // comment\n"
  359. " c);"));
  360. EXPECT_EQ("SomeFunction(a, b,\n"
  361. " // comment\n"
  362. " c);",
  363. format("SomeFunction(a,\n"
  364. " b,\n"
  365. " // comment\n"
  366. " c);"));
  367. EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
  368. " c);",
  369. format("SomeFunction(a, b, // comment (unclear relation)\n"
  370. " c);"));
  371. EXPECT_EQ("SomeFunction(a, // comment\n"
  372. " b,\n"
  373. " c); // comment",
  374. format("SomeFunction(a, // comment\n"
  375. " b,\n"
  376. " c); // comment"));
  377. EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
  378. " aaaa), //\n"
  379. " aaaa, bbbbb);",
  380. format("aaaaaaaaaa(aaaa(aaaa,\n"
  381. "aaaa), //\n"
  382. "aaaa, bbbbb);"));
  383. }
  384. TEST_F(FormatTestComments, RemovesTrailingWhitespaceOfComments) {
  385. EXPECT_EQ("// comment", format("// comment "));
  386. EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
  387. format("int aaaaaaa, bbbbbbb; // comment ",
  388. getLLVMStyleWithColumns(33)));
  389. EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
  390. EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
  391. }
  392. TEST_F(FormatTestComments, UnderstandsBlockComments) {
  393. verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
  394. verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
  395. EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
  396. " bbbbbbbbbbbbbbbbbbbbbbbbb);",
  397. format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
  398. "/* Trailing comment for aa... */\n"
  399. " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
  400. EXPECT_EQ(
  401. "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
  402. " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
  403. format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
  404. "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
  405. EXPECT_EQ(
  406. "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
  407. " aaaaaaaaaaaaaaaaaa,\n"
  408. " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
  409. "}",
  410. format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
  411. " aaaaaaaaaaaaaaaaaa ,\n"
  412. " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
  413. "}"));
  414. verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
  415. " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
  416. FormatStyle NoBinPacking = getLLVMStyle();
  417. NoBinPacking.BinPackParameters = false;
  418. verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
  419. " /* parameter 2 */ aaaaaa,\n"
  420. " /* parameter 3 */ aaaaaa,\n"
  421. " /* parameter 4 */ aaaaaa);",
  422. NoBinPacking);
  423. // Aligning block comments in macros.
  424. verifyGoogleFormat("#define A \\\n"
  425. " int i; /*a*/ \\\n"
  426. " int jjj; /*b*/");
  427. }
  428. TEST_F(FormatTestComments, AlignsBlockComments) {
  429. EXPECT_EQ("/*\n"
  430. " * Really multi-line\n"
  431. " * comment.\n"
  432. " */\n"
  433. "void f() {}",
  434. format(" /*\n"
  435. " * Really multi-line\n"
  436. " * comment.\n"
  437. " */\n"
  438. " void f() {}"));
  439. EXPECT_EQ("class C {\n"
  440. " /*\n"
  441. " * Another multi-line\n"
  442. " * comment.\n"
  443. " */\n"
  444. " void f() {}\n"
  445. "};",
  446. format("class C {\n"
  447. "/*\n"
  448. " * Another multi-line\n"
  449. " * comment.\n"
  450. " */\n"
  451. "void f() {}\n"
  452. "};"));
  453. EXPECT_EQ("/*\n"
  454. " 1. This is a comment with non-trivial formatting.\n"
  455. " 1.1. We have to indent/outdent all lines equally\n"
  456. " 1.1.1. to keep the formatting.\n"
  457. " */",
  458. format(" /*\n"
  459. " 1. This is a comment with non-trivial formatting.\n"
  460. " 1.1. We have to indent/outdent all lines equally\n"
  461. " 1.1.1. to keep the formatting.\n"
  462. " */"));
  463. EXPECT_EQ("/*\n"
  464. "Don't try to outdent if there's not enough indentation.\n"
  465. "*/",
  466. format(" /*\n"
  467. " Don't try to outdent if there's not enough indentation.\n"
  468. " */"));
  469. EXPECT_EQ("int i; /* Comment with empty...\n"
  470. " *\n"
  471. " * line. */",
  472. format("int i; /* Comment with empty...\n"
  473. " *\n"
  474. " * line. */"));
  475. EXPECT_EQ("int foobar = 0; /* comment */\n"
  476. "int bar = 0; /* multiline\n"
  477. " comment 1 */\n"
  478. "int baz = 0; /* multiline\n"
  479. " comment 2 */\n"
  480. "int bzz = 0; /* multiline\n"
  481. " comment 3 */",
  482. format("int foobar = 0; /* comment */\n"
  483. "int bar = 0; /* multiline\n"
  484. " comment 1 */\n"
  485. "int baz = 0; /* multiline\n"
  486. " comment 2 */\n"
  487. "int bzz = 0; /* multiline\n"
  488. " comment 3 */"));
  489. EXPECT_EQ("int foobar = 0; /* comment */\n"
  490. "int bar = 0; /* multiline\n"
  491. " comment */\n"
  492. "int baz = 0; /* multiline\n"
  493. "comment */",
  494. format("int foobar = 0; /* comment */\n"
  495. "int bar = 0; /* multiline\n"
  496. "comment */\n"
  497. "int baz = 0; /* multiline\n"
  498. "comment */"));
  499. }
  500. TEST_F(FormatTestComments, CommentReflowingCanBeTurnedOff) {
  501. FormatStyle Style = getLLVMStyleWithColumns(20);
  502. Style.ReflowComments = false;
  503. verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
  504. verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
  505. }
  506. TEST_F(FormatTestComments, CorrectlyHandlesLengthOfBlockComments) {
  507. EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
  508. " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
  509. format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
  510. " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
  511. EXPECT_EQ(
  512. "void ffffffffffff(\n"
  513. " int aaaaaaaa, int bbbbbbbb,\n"
  514. " int cccccccccccc) { /*\n"
  515. " aaaaaaaaaa\n"
  516. " aaaaaaaaaaaaa\n"
  517. " bbbbbbbbbbbbbb\n"
  518. " bbbbbbbbbb\n"
  519. " */\n"
  520. "}",
  521. format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
  522. "{ /*\n"
  523. " aaaaaaaaaa aaaaaaaaaaaaa\n"
  524. " bbbbbbbbbbbbbb bbbbbbbbbb\n"
  525. " */\n"
  526. "}",
  527. getLLVMStyleWithColumns(40)));
  528. }
  529. TEST_F(FormatTestComments, DontBreakNonTrailingBlockComments) {
  530. EXPECT_EQ("void ffffffffff(\n"
  531. " int aaaaa /* test */);",
  532. format("void ffffffffff(int aaaaa /* test */);",
  533. getLLVMStyleWithColumns(35)));
  534. }
  535. TEST_F(FormatTestComments, SplitsLongCxxComments) {
  536. EXPECT_EQ("// A comment that\n"
  537. "// doesn't fit on\n"
  538. "// one line",
  539. format("// A comment that doesn't fit on one line",
  540. getLLVMStyleWithColumns(20)));
  541. EXPECT_EQ("/// A comment that\n"
  542. "/// doesn't fit on\n"
  543. "/// one line",
  544. format("/// A comment that doesn't fit on one line",
  545. getLLVMStyleWithColumns(20)));
  546. EXPECT_EQ("//! A comment that\n"
  547. "//! doesn't fit on\n"
  548. "//! one line",
  549. format("//! A comment that doesn't fit on one line",
  550. getLLVMStyleWithColumns(20)));
  551. EXPECT_EQ("// a b c d\n"
  552. "// e f g\n"
  553. "// h i j k",
  554. format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
  555. EXPECT_EQ(
  556. "// a b c d\n"
  557. "// e f g\n"
  558. "// h i j k",
  559. format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
  560. EXPECT_EQ("if (true) // A comment that\n"
  561. " // doesn't fit on\n"
  562. " // one line",
  563. format("if (true) // A comment that doesn't fit on one line ",
  564. getLLVMStyleWithColumns(30)));
  565. EXPECT_EQ("// Don't_touch_leading_whitespace",
  566. format("// Don't_touch_leading_whitespace",
  567. getLLVMStyleWithColumns(20)));
  568. EXPECT_EQ("// Add leading\n"
  569. "// whitespace",
  570. format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
  571. EXPECT_EQ("/// Add leading\n"
  572. "/// whitespace",
  573. format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
  574. EXPECT_EQ("//! Add leading\n"
  575. "//! whitespace",
  576. format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
  577. EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
  578. EXPECT_EQ("// Even if it makes the line exceed the column\n"
  579. "// limit",
  580. format("//Even if it makes the line exceed the column limit",
  581. getLLVMStyleWithColumns(51)));
  582. EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
  583. EXPECT_EQ("/// line 1\n"
  584. "// add leading whitespace",
  585. format("/// line 1\n"
  586. "//add leading whitespace",
  587. getLLVMStyleWithColumns(30)));
  588. EXPECT_EQ("/// line 1\n"
  589. "/// line 2\n"
  590. "//! line 3\n"
  591. "//! line 4\n"
  592. "//! line 5\n"
  593. "// line 6\n"
  594. "// line 7",
  595. format("///line 1\n"
  596. "///line 2\n"
  597. "//! line 3\n"
  598. "//!line 4\n"
  599. "//!line 5\n"
  600. "// line 6\n"
  601. "//line 7", getLLVMStyleWithColumns(20)));
  602. EXPECT_EQ("// aa bb cc dd",
  603. format("// aa bb cc dd ",
  604. getLLVMStyleWithColumns(15)));
  605. EXPECT_EQ("// A comment before\n"
  606. "// a macro\n"
  607. "// definition\n"
  608. "#define a b",
  609. format("// A comment before a macro definition\n"
  610. "#define a b",
  611. getLLVMStyleWithColumns(20)));
  612. EXPECT_EQ("void ffffff(\n"
  613. " int aaaaaaaaa, // wwww\n"
  614. " int bbbbbbbbbb, // xxxxxxx\n"
  615. " // yyyyyyyyyy\n"
  616. " int c, int d, int e) {}",
  617. format("void ffffff(\n"
  618. " int aaaaaaaaa, // wwww\n"
  619. " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
  620. " int c, int d, int e) {}",
  621. getLLVMStyleWithColumns(40)));
  622. EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  623. format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  624. getLLVMStyleWithColumns(20)));
  625. EXPECT_EQ(
  626. "#define XXX // a b c d\n"
  627. " // e f g h",
  628. format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
  629. EXPECT_EQ(
  630. "#define XXX // q w e r\n"
  631. " // t y u i",
  632. format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
  633. EXPECT_EQ("{\n"
  634. " //\n"
  635. " //\\\n"
  636. " // long 1 2 3 4\n"
  637. " // 5\n"
  638. "}",
  639. format("{\n"
  640. " //\n"
  641. " //\\\n"
  642. " // long 1 2 3 4 5\n"
  643. "}",
  644. getLLVMStyleWithColumns(20)));
  645. }
  646. TEST_F(FormatTestComments, PreservesHangingIndentInCxxComments) {
  647. EXPECT_EQ("// A comment\n"
  648. "// that doesn't\n"
  649. "// fit on one\n"
  650. "// line",
  651. format("// A comment that doesn't fit on one line",
  652. getLLVMStyleWithColumns(20)));
  653. EXPECT_EQ("/// A comment\n"
  654. "/// that doesn't\n"
  655. "/// fit on one\n"
  656. "/// line",
  657. format("/// A comment that doesn't fit on one line",
  658. getLLVMStyleWithColumns(20)));
  659. }
  660. TEST_F(FormatTestComments, DontSplitLineCommentsWithEscapedNewlines) {
  661. EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
  662. "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
  663. "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  664. format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
  665. "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
  666. "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
  667. EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
  668. " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
  669. " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
  670. format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
  671. " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
  672. " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
  673. getLLVMStyleWithColumns(50)));
  674. // FIXME: One day we might want to implement adjustment of leading whitespace
  675. // of the consecutive lines in this kind of comment:
  676. EXPECT_EQ("double\n"
  677. " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
  678. " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
  679. " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
  680. format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
  681. " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
  682. " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
  683. getLLVMStyleWithColumns(49)));
  684. }
  685. TEST_F(FormatTestComments, DontSplitLineCommentsWithPragmas) {
  686. FormatStyle Pragmas = getLLVMStyleWithColumns(30);
  687. Pragmas.CommentPragmas = "^ IWYU pragma:";
  688. EXPECT_EQ(
  689. "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
  690. format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
  691. EXPECT_EQ(
  692. "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
  693. format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
  694. }
  695. TEST_F(FormatTestComments, PriorityOfCommentBreaking) {
  696. EXPECT_EQ("if (xxx ==\n"
  697. " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
  698. " zzz)\n"
  699. " q();",
  700. format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
  701. " zzz) q();",
  702. getLLVMStyleWithColumns(40)));
  703. EXPECT_EQ("if (xxxxxxxxxx ==\n"
  704. " yyy && // aaaaaa bbbbbbbb cccc\n"
  705. " zzz)\n"
  706. " q();",
  707. format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
  708. " zzz) q();",
  709. getLLVMStyleWithColumns(40)));
  710. EXPECT_EQ("if (xxxxxxxxxx &&\n"
  711. " yyy || // aaaaaa bbbbbbbb cccc\n"
  712. " zzz)\n"
  713. " q();",
  714. format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
  715. " zzz) q();",
  716. getLLVMStyleWithColumns(40)));
  717. EXPECT_EQ("fffffffff(\n"
  718. " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
  719. " zzz);",
  720. format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
  721. " zzz);",
  722. getLLVMStyleWithColumns(40)));
  723. }
  724. TEST_F(FormatTestComments, MultiLineCommentsInDefines) {
  725. EXPECT_EQ("#define A(x) /* \\\n"
  726. " a comment \\\n"
  727. " inside */ \\\n"
  728. " f();",
  729. format("#define A(x) /* \\\n"
  730. " a comment \\\n"
  731. " inside */ \\\n"
  732. " f();",
  733. getLLVMStyleWithColumns(17)));
  734. EXPECT_EQ("#define A( \\\n"
  735. " x) /* \\\n"
  736. " a comment \\\n"
  737. " inside */ \\\n"
  738. " f();",
  739. format("#define A( \\\n"
  740. " x) /* \\\n"
  741. " a comment \\\n"
  742. " inside */ \\\n"
  743. " f();",
  744. getLLVMStyleWithColumns(17)));
  745. }
  746. TEST_F(FormatTestComments, ParsesCommentsAdjacentToPPDirectives) {
  747. EXPECT_EQ("namespace {}\n// Test\n#define A",
  748. format("namespace {}\n // Test\n#define A"));
  749. EXPECT_EQ("namespace {}\n/* Test */\n#define A",
  750. format("namespace {}\n /* Test */\n#define A"));
  751. EXPECT_EQ("namespace {}\n/* Test */ #define A",
  752. format("namespace {}\n /* Test */ #define A"));
  753. }
  754. TEST_F(FormatTestComments, SplitsLongLinesInComments) {
  755. EXPECT_EQ("/* This is a long\n"
  756. " * comment that\n"
  757. " * doesn't\n"
  758. " * fit on one line.\n"
  759. " */",
  760. format("/* "
  761. "This is a long "
  762. "comment that "
  763. "doesn't "
  764. "fit on one line. */",
  765. getLLVMStyleWithColumns(20)));
  766. EXPECT_EQ(
  767. "/* a b c d\n"
  768. " * e f g\n"
  769. " * h i j k\n"
  770. " */",
  771. format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
  772. EXPECT_EQ(
  773. "/* a b c d\n"
  774. " * e f g\n"
  775. " * h i j k\n"
  776. " */",
  777. format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
  778. EXPECT_EQ("/*\n"
  779. "This is a long\n"
  780. "comment that doesn't\n"
  781. "fit on one line.\n"
  782. "*/",
  783. format("/*\n"
  784. "This is a long "
  785. "comment that doesn't "
  786. "fit on one line. \n"
  787. "*/",
  788. getLLVMStyleWithColumns(20)));
  789. EXPECT_EQ("/*\n"
  790. " * This is a long\n"
  791. " * comment that\n"
  792. " * doesn't fit on\n"
  793. " * one line.\n"
  794. " */",
  795. format("/* \n"
  796. " * This is a long "
  797. " comment that "
  798. " doesn't fit on "
  799. " one line. \n"
  800. " */",
  801. getLLVMStyleWithColumns(20)));
  802. EXPECT_EQ("/*\n"
  803. " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
  804. " * so_it_should_be_broken\n"
  805. " * wherever_a_space_occurs\n"
  806. " */",
  807. format("/*\n"
  808. " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
  809. " so_it_should_be_broken "
  810. " wherever_a_space_occurs \n"
  811. " */",
  812. getLLVMStyleWithColumns(20)));
  813. EXPECT_EQ("/*\n"
  814. " * This_comment_can_not_be_broken_into_lines\n"
  815. " */",
  816. format("/*\n"
  817. " * This_comment_can_not_be_broken_into_lines\n"
  818. " */",
  819. getLLVMStyleWithColumns(20)));
  820. EXPECT_EQ("{\n"
  821. " /*\n"
  822. " This is another\n"
  823. " long comment that\n"
  824. " doesn't fit on one\n"
  825. " line 1234567890\n"
  826. " */\n"
  827. "}",
  828. format("{\n"
  829. "/*\n"
  830. "This is another "
  831. " long comment that "
  832. " doesn't fit on one"
  833. " line 1234567890\n"
  834. "*/\n"
  835. "}",
  836. getLLVMStyleWithColumns(20)));
  837. EXPECT_EQ("{\n"
  838. " /*\n"
  839. " * This i s\n"
  840. " * another comment\n"
  841. " * t hat doesn' t\n"
  842. " * fit on one l i\n"
  843. " * n e\n"
  844. " */\n"
  845. "}",
  846. format("{\n"
  847. "/*\n"
  848. " * This i s"
  849. " another comment"
  850. " t hat doesn' t"
  851. " fit on one l i"
  852. " n e\n"
  853. " */\n"
  854. "}",
  855. getLLVMStyleWithColumns(20)));
  856. EXPECT_EQ("/*\n"
  857. " * This is a long\n"
  858. " * comment that\n"
  859. " * doesn't fit on\n"
  860. " * one line\n"
  861. " */",
  862. format(" /*\n"
  863. " * This is a long comment that doesn't fit on one line\n"
  864. " */",
  865. getLLVMStyleWithColumns(20)));
  866. EXPECT_EQ("{\n"
  867. " if (something) /* This is a\n"
  868. " long\n"
  869. " comment */\n"
  870. " ;\n"
  871. "}",
  872. format("{\n"
  873. " if (something) /* This is a long comment */\n"
  874. " ;\n"
  875. "}",
  876. getLLVMStyleWithColumns(30)));
  877. EXPECT_EQ("/* A comment before\n"
  878. " * a macro\n"
  879. " * definition */\n"
  880. "#define a b",
  881. format("/* A comment before a macro definition */\n"
  882. "#define a b",
  883. getLLVMStyleWithColumns(20)));
  884. EXPECT_EQ("/* some comment\n"
  885. " * a comment that\n"
  886. " * we break another\n"
  887. " * comment we have\n"
  888. " * to break a left\n"
  889. " * comment\n"
  890. " */",
  891. format(" /* some comment\n"
  892. " * a comment that we break\n"
  893. " * another comment we have to break\n"
  894. "* a left comment\n"
  895. " */",
  896. getLLVMStyleWithColumns(20)));
  897. EXPECT_EQ("/**\n"
  898. " * multiline block\n"
  899. " * comment\n"
  900. " *\n"
  901. " */",
  902. format("/**\n"
  903. " * multiline block comment\n"
  904. " *\n"
  905. " */",
  906. getLLVMStyleWithColumns(20)));
  907. EXPECT_EQ("/*\n"
  908. "\n"
  909. "\n"
  910. " */\n",
  911. format(" /* \n"
  912. " \n"
  913. " \n"
  914. " */\n"));
  915. EXPECT_EQ("/* a a */",
  916. format("/* a a */", getLLVMStyleWithColumns(15)));
  917. EXPECT_EQ("/* a a bc */",
  918. format("/* a a bc */", getLLVMStyleWithColumns(15)));
  919. EXPECT_EQ("/* aaa aaa\n"
  920. " * aaaaa */",
  921. format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
  922. EXPECT_EQ("/* aaa aaa\n"
  923. " * aaaaa */",
  924. format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
  925. }
  926. TEST_F(FormatTestComments, SplitsLongLinesInCommentsInPreprocessor) {
  927. EXPECT_EQ("#define X \\\n"
  928. " /* \\\n"
  929. " Test \\\n"
  930. " Macro comment \\\n"
  931. " with a long \\\n"
  932. " line \\\n"
  933. " */ \\\n"
  934. " A + B",
  935. format("#define X \\\n"
  936. " /*\n"
  937. " Test\n"
  938. " Macro comment with a long line\n"
  939. " */ \\\n"
  940. " A + B",
  941. getLLVMStyleWithColumns(20)));
  942. EXPECT_EQ("#define X \\\n"
  943. " /* Macro comment \\\n"
  944. " with a long \\\n"
  945. " line */ \\\n"
  946. " A + B",
  947. format("#define X \\\n"
  948. " /* Macro comment with a long\n"
  949. " line */ \\\n"
  950. " A + B",
  951. getLLVMStyleWithColumns(20)));
  952. EXPECT_EQ("#define X \\\n"
  953. " /* Macro comment \\\n"
  954. " * with a long \\\n"
  955. " * line */ \\\n"
  956. " A + B",
  957. format("#define X \\\n"
  958. " /* Macro comment with a long line */ \\\n"
  959. " A + B",
  960. getLLVMStyleWithColumns(20)));
  961. }
  962. TEST_F(FormatTestComments, KeepsTrailingPPCommentsAndSectionCommentsSeparate) {
  963. verifyFormat("#ifdef A // line about A\n"
  964. "// section comment\n"
  965. "#endif",
  966. getLLVMStyleWithColumns(80));
  967. verifyFormat("#ifdef A // line 1 about A\n"
  968. " // line 2 about A\n"
  969. "// section comment\n"
  970. "#endif",
  971. getLLVMStyleWithColumns(80));
  972. EXPECT_EQ("#ifdef A // line 1 about A\n"
  973. " // line 2 about A\n"
  974. "// section comment\n"
  975. "#endif",
  976. format("#ifdef A // line 1 about A\n"
  977. " // line 2 about A\n"
  978. "// section comment\n"
  979. "#endif",
  980. getLLVMStyleWithColumns(80)));
  981. verifyFormat("int f() {\n"
  982. " int i;\n"
  983. "#ifdef A // comment about A\n"
  984. " // section comment 1\n"
  985. " // section comment 2\n"
  986. " i = 2;\n"
  987. "#else // comment about #else\n"
  988. " // section comment 3\n"
  989. " i = 4;\n"
  990. "#endif\n"
  991. "}", getLLVMStyleWithColumns(80));
  992. }
  993. TEST_F(FormatTestComments, AlignsPPElseEndifComments) {
  994. verifyFormat("#if A\n"
  995. "#else // A\n"
  996. "int iiii;\n"
  997. "#endif // B",
  998. getLLVMStyleWithColumns(20));
  999. verifyFormat("#if A\n"
  1000. "#else // A\n"
  1001. "int iiii; // CC\n"
  1002. "#endif // B",
  1003. getLLVMStyleWithColumns(20));
  1004. EXPECT_EQ("#if A\n"
  1005. "#else // A1\n"
  1006. " // A2\n"
  1007. "int ii;\n"
  1008. "#endif // B",
  1009. format("#if A\n"
  1010. "#else // A1\n"
  1011. " // A2\n"
  1012. "int ii;\n"
  1013. "#endif // B",
  1014. getLLVMStyleWithColumns(20)));
  1015. }
  1016. TEST_F(FormatTestComments, CommentsInStaticInitializers) {
  1017. EXPECT_EQ(
  1018. "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
  1019. " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
  1020. " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
  1021. " aaaaaaaaaaaaaaaaaaaa, // comment\n"
  1022. " aaaaaaaaaaaaaaaaaaaa};",
  1023. format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
  1024. " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
  1025. " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
  1026. " aaaaaaaaaaaaaaaaaaaa , // comment\n"
  1027. " aaaaaaaaaaaaaaaaaaaa };"));
  1028. verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
  1029. " bbbbbbbbbbb, ccccccccccc};");
  1030. verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
  1031. " // comment for bb....\n"
  1032. " bbbbbbbbbbb, ccccccccccc};");
  1033. verifyGoogleFormat(
  1034. "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
  1035. " bbbbbbbbbbb, ccccccccccc};");
  1036. verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
  1037. " // comment for bb....\n"
  1038. " bbbbbbbbbbb, ccccccccccc};");
  1039. verifyFormat("S s = {{a, b, c}, // Group #1\n"
  1040. " {d, e, f}, // Group #2\n"
  1041. " {g, h, i}}; // Group #3");
  1042. verifyFormat("S s = {{// Group #1\n"
  1043. " a, b, c},\n"
  1044. " {// Group #2\n"
  1045. " d, e, f},\n"
  1046. " {// Group #3\n"
  1047. " g, h, i}};");
  1048. EXPECT_EQ("S s = {\n"
  1049. " // Some comment\n"
  1050. " a,\n"
  1051. "\n"
  1052. " // Comment after empty line\n"
  1053. " b}",
  1054. format("S s = {\n"
  1055. " // Some comment\n"
  1056. " a,\n"
  1057. " \n"
  1058. " // Comment after empty line\n"
  1059. " b\n"
  1060. "}"));
  1061. EXPECT_EQ("S s = {\n"
  1062. " /* Some comment */\n"
  1063. " a,\n"
  1064. "\n"
  1065. " /* Comment after empty line */\n"
  1066. " b}",
  1067. format("S s = {\n"
  1068. " /* Some comment */\n"
  1069. " a,\n"
  1070. " \n"
  1071. " /* Comment after empty line */\n"
  1072. " b\n"
  1073. "}"));
  1074. verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
  1075. " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
  1076. " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
  1077. " 0x00, 0x00, 0x00, 0x00}; // comment\n");
  1078. }
  1079. TEST_F(FormatTestComments, LineCommentsAfterRightBrace) {
  1080. EXPECT_EQ("if (true) { // comment about branch\n"
  1081. " // comment about f\n"
  1082. " f();\n"
  1083. "}",
  1084. format("if (true) { // comment about branch\n"
  1085. " // comment about f\n"
  1086. " f();\n"
  1087. "}",
  1088. getLLVMStyleWithColumns(80)));
  1089. EXPECT_EQ("if (1) { // if line 1\n"
  1090. " // if line 2\n"
  1091. " // if line 3\n"
  1092. " // f line 1\n"
  1093. " // f line 2\n"
  1094. " f();\n"
  1095. "} else { // else line 1\n"
  1096. " // else line 2\n"
  1097. " // else line 3\n"
  1098. " // g line 1\n"
  1099. " g();\n"
  1100. "}",
  1101. format("if (1) { // if line 1\n"
  1102. " // if line 2\n"
  1103. " // if line 3\n"
  1104. " // f line 1\n"
  1105. " // f line 2\n"
  1106. " f();\n"
  1107. "} else { // else line 1\n"
  1108. " // else line 2\n"
  1109. " // else line 3\n"
  1110. " // g line 1\n"
  1111. " g();\n"
  1112. "}"));
  1113. EXPECT_EQ("do { // line 1\n"
  1114. " // line 2\n"
  1115. " // line 3\n"
  1116. " f();\n"
  1117. "} while (true);",
  1118. format("do { // line 1\n"
  1119. " // line 2\n"
  1120. " // line 3\n"
  1121. " f();\n"
  1122. "} while (true);",
  1123. getLLVMStyleWithColumns(80)));
  1124. EXPECT_EQ("while (a < b) { // line 1\n"
  1125. " // line 2\n"
  1126. " // line 3\n"
  1127. " f();\n"
  1128. "}",
  1129. format("while (a < b) {// line 1\n"
  1130. " // line 2\n"
  1131. " // line 3\n"
  1132. " f();\n"
  1133. "}",
  1134. getLLVMStyleWithColumns(80)));
  1135. }
  1136. TEST_F(FormatTestComments, ReflowsComments) {
  1137. // Break a long line and reflow with the full next line.
  1138. EXPECT_EQ("// long long long\n"
  1139. "// long long",
  1140. format("// long long long long\n"
  1141. "// long",
  1142. getLLVMStyleWithColumns(20)));
  1143. // Keep the trailing newline while reflowing.
  1144. EXPECT_EQ("// long long long\n"
  1145. "// long long\n",
  1146. format("// long long long long\n"
  1147. "// long\n",
  1148. getLLVMStyleWithColumns(20)));
  1149. // Break a long line and reflow with a part of the next line.
  1150. EXPECT_EQ("// long long long\n"
  1151. "// long long\n"
  1152. "// long_long",
  1153. format("// long long long long\n"
  1154. "// long long_long",
  1155. getLLVMStyleWithColumns(20)));
  1156. // Break but do not reflow if the first word from the next line is too long.
  1157. EXPECT_EQ("// long long long\n"
  1158. "// long\n"
  1159. "// long_long_long\n",
  1160. format("// long long long long\n"
  1161. "// long_long_long\n",
  1162. getLLVMStyleWithColumns(20)));
  1163. // Don't break or reflow short lines.
  1164. verifyFormat("// long\n"
  1165. "// long long long lo\n"
  1166. "// long long long lo\n"
  1167. "// long",
  1168. getLLVMStyleWithColumns(20));
  1169. // Keep prefixes and decorations while reflowing.
  1170. EXPECT_EQ("/// long long long\n"
  1171. "/// long long\n",
  1172. format("/// long long long long\n"
  1173. "/// long\n",
  1174. getLLVMStyleWithColumns(20)));
  1175. EXPECT_EQ("//! long long long\n"
  1176. "//! long long\n",
  1177. format("//! long long long long\n"
  1178. "//! long\n",
  1179. getLLVMStyleWithColumns(20)));
  1180. EXPECT_EQ("/* long long long\n"
  1181. " * long long */",
  1182. format("/* long long long long\n"
  1183. " * long */",
  1184. getLLVMStyleWithColumns(20)));
  1185. EXPECT_EQ("///< long long long\n"
  1186. "///< long long\n",
  1187. format("///< long long long long\n"
  1188. "///< long\n",
  1189. getLLVMStyleWithColumns(20)));
  1190. EXPECT_EQ("//!< long long long\n"
  1191. "//!< long long\n",
  1192. format("//!< long long long long\n"
  1193. "//!< long\n",
  1194. getLLVMStyleWithColumns(20)));
  1195. // Don't bring leading whitespace up while reflowing.
  1196. EXPECT_EQ("/* long long long\n"
  1197. " * long long long\n"
  1198. " */",
  1199. format("/* long long long long\n"
  1200. " * long long\n"
  1201. " */",
  1202. getLLVMStyleWithColumns(20)));
  1203. // Reflow the last line of a block comment with its trailing '*/'.
  1204. EXPECT_EQ("/* long long long\n"
  1205. " long long */",
  1206. format("/* long long long long\n"
  1207. " long */",
  1208. getLLVMStyleWithColumns(20)));
  1209. // Reflow two short lines; keep the postfix of the last one.
  1210. EXPECT_EQ("/* long long long\n"
  1211. " * long long long */",
  1212. format("/* long long long long\n"
  1213. " * long\n"
  1214. " * long */",
  1215. getLLVMStyleWithColumns(20)));
  1216. // Put the postfix of the last short reflow line on a newline if it doesn't
  1217. // fit.
  1218. EXPECT_EQ("/* long long long\n"
  1219. " * long long longg\n"
  1220. " */",
  1221. format("/* long long long long\n"
  1222. " * long\n"
  1223. " * longg */",
  1224. getLLVMStyleWithColumns(20)));
  1225. // Reflow lines with leading whitespace.
  1226. EXPECT_EQ("{\n"
  1227. " /*\n"
  1228. " * long long long\n"
  1229. " * long long long\n"
  1230. " * long long long\n"
  1231. " */\n"
  1232. "}",
  1233. format("{\n"
  1234. "/*\n"
  1235. " * long long long long\n"
  1236. " * long\n"
  1237. " * long long long long\n"
  1238. " */\n"
  1239. "}",
  1240. getLLVMStyleWithColumns(20)));
  1241. // Break single line block comments that are first in the line with ' *'
  1242. // decoration.
  1243. EXPECT_EQ("/* long long long\n"
  1244. " * long */",
  1245. format("/* long long long long */", getLLVMStyleWithColumns(20)));
  1246. // Break single line block comment that are not first in the line with ' '
  1247. // decoration.
  1248. EXPECT_EQ("int i; /* long long\n"
  1249. " long */",
  1250. format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
  1251. // Reflow a line that goes just over the column limit.
  1252. EXPECT_EQ("// long long long\n"
  1253. "// lon long",
  1254. format("// long long long lon\n"
  1255. "// long",
  1256. getLLVMStyleWithColumns(20)));
  1257. // Stop reflowing if the next line has a different indentation than the
  1258. // previous line.
  1259. EXPECT_EQ("// long long long\n"
  1260. "// long\n"
  1261. "// long long\n"
  1262. "// long",
  1263. format("// long long long long\n"
  1264. "// long long\n"
  1265. "// long",
  1266. getLLVMStyleWithColumns(20)));
  1267. // Reflow into the last part of a really long line that has been broken into
  1268. // multiple lines.
  1269. EXPECT_EQ("// long long long\n"
  1270. "// long long long\n"
  1271. "// long long long\n",
  1272. format("// long long long long long long long long\n"
  1273. "// long\n",
  1274. getLLVMStyleWithColumns(20)));
  1275. // Break the first line, then reflow the beginning of the second and third
  1276. // line up.
  1277. EXPECT_EQ("// long long long\n"
  1278. "// lon1 lon2 lon2\n"
  1279. "// lon2 lon3 lon3",
  1280. format("// long long long lon1\n"
  1281. "// lon2 lon2 lon2\n"
  1282. "// lon3 lon3",
  1283. getLLVMStyleWithColumns(20)));
  1284. // Reflow the beginning of the second line, then break the rest.
  1285. EXPECT_EQ("// long long long\n"
  1286. "// lon1 lon2 lon2\n"
  1287. "// lon2 lon2 lon2\n"
  1288. "// lon3",
  1289. format("// long long long lon1\n"
  1290. "// lon2 lon2 lon2 lon2 lon2 lon3",
  1291. getLLVMStyleWithColumns(20)));
  1292. // Shrink the first line, then reflow the second line up.
  1293. EXPECT_EQ("// long long long", format("// long long\n"
  1294. "// long",
  1295. getLLVMStyleWithColumns(20)));
  1296. // Don't shrink leading whitespace.
  1297. EXPECT_EQ("int i; /// a",
  1298. format("int i; /// a", getLLVMStyleWithColumns(20)));
  1299. // Shrink trailing whitespace if there is no postfix and reflow.
  1300. EXPECT_EQ("// long long long\n"
  1301. "// long long",
  1302. format("// long long long long \n"
  1303. "// long",
  1304. getLLVMStyleWithColumns(20)));
  1305. // Shrink trailing whitespace to a single one if there is postfix.
  1306. EXPECT_EQ("/* long long long */",
  1307. format("/* long long long */", getLLVMStyleWithColumns(20)));
  1308. // Break a block comment postfix if exceeding the line limit.
  1309. EXPECT_EQ("/* long\n"
  1310. " */",
  1311. format("/* long */", getLLVMStyleWithColumns(20)));
  1312. // Reflow indented comments.
  1313. EXPECT_EQ("{\n"
  1314. " // long long long\n"
  1315. " // long long\n"
  1316. " int i; /* long lon\n"
  1317. " g long\n"
  1318. " */\n"
  1319. "}",
  1320. format("{\n"
  1321. " // long long long long\n"
  1322. " // long\n"
  1323. " int i; /* long lon g\n"
  1324. " long */\n"
  1325. "}",
  1326. getLLVMStyleWithColumns(20)));
  1327. // Don't realign trailing comments after reflow has happened.
  1328. EXPECT_EQ("// long long long\n"
  1329. "// long long\n"
  1330. "long i; // long",
  1331. format("// long long long long\n"
  1332. "// long\n"
  1333. "long i; // long",
  1334. getLLVMStyleWithColumns(20)));
  1335. EXPECT_EQ("// long long long\n"
  1336. "// longng long long\n"
  1337. "// long lo",
  1338. format("// long long long longng\n"
  1339. "// long long long\n"
  1340. "// lo",
  1341. getLLVMStyleWithColumns(20)));
  1342. // Reflow lines after a broken line.
  1343. EXPECT_EQ("int a; // Trailing\n"
  1344. " // comment on\n"
  1345. " // 2 or 3\n"
  1346. " // lines.\n",
  1347. format("int a; // Trailing comment\n"
  1348. " // on 2\n"
  1349. " // or 3\n"
  1350. " // lines.\n",
  1351. getLLVMStyleWithColumns(20)));
  1352. EXPECT_EQ("/// This long line\n"
  1353. "/// gets reflown.\n",
  1354. format("/// This long line gets\n"
  1355. "/// reflown.\n",
  1356. getLLVMStyleWithColumns(20)));
  1357. EXPECT_EQ("//! This long line\n"
  1358. "//! gets reflown.\n",
  1359. format(" //! This long line gets\n"
  1360. " //! reflown.\n",
  1361. getLLVMStyleWithColumns(20)));
  1362. EXPECT_EQ("/* This long line\n"
  1363. " * gets reflown.\n"
  1364. " */\n",
  1365. format("/* This long line gets\n"
  1366. " * reflown.\n"
  1367. " */\n",
  1368. getLLVMStyleWithColumns(20)));
  1369. // Reflow after indentation makes a line too long.
  1370. EXPECT_EQ("{\n"
  1371. " // long long long\n"
  1372. " // lo long\n"
  1373. "}\n",
  1374. format("{\n"
  1375. "// long long long lo\n"
  1376. "// long\n"
  1377. "}\n",
  1378. getLLVMStyleWithColumns(20)));
  1379. // Break and reflow multiple lines.
  1380. EXPECT_EQ("/*\n"
  1381. " * Reflow the end of\n"
  1382. " * line by 11 22 33\n"
  1383. " * 4.\n"
  1384. " */\n",
  1385. format("/*\n"
  1386. " * Reflow the end of line\n"
  1387. " * by\n"
  1388. " * 11\n"
  1389. " * 22\n"
  1390. " * 33\n"
  1391. " * 4.\n"
  1392. " */\n",
  1393. getLLVMStyleWithColumns(20)));
  1394. EXPECT_EQ("/// First line gets\n"
  1395. "/// broken. Second\n"
  1396. "/// line gets\n"
  1397. "/// reflown and\n"
  1398. "/// broken. Third\n"
  1399. "/// gets reflown.\n",
  1400. format("/// First line gets broken.\n"
  1401. "/// Second line gets reflown and broken.\n"
  1402. "/// Third gets reflown.\n",
  1403. getLLVMStyleWithColumns(20)));
  1404. EXPECT_EQ("int i; // first long\n"
  1405. " // long snd\n"
  1406. " // long.\n",
  1407. format("int i; // first long long\n"
  1408. " // snd long.\n",
  1409. getLLVMStyleWithColumns(20)));
  1410. EXPECT_EQ("{\n"
  1411. " // first long line\n"
  1412. " // line second\n"
  1413. " // long line line\n"
  1414. " // third long line\n"
  1415. " // line\n"
  1416. "}\n",
  1417. format("{\n"
  1418. " // first long line line\n"
  1419. " // second long line line\n"
  1420. " // third long line line\n"
  1421. "}\n",
  1422. getLLVMStyleWithColumns(20)));
  1423. EXPECT_EQ("int i; /* first line\n"
  1424. " * second\n"
  1425. " * line third\n"
  1426. " * line\n"
  1427. " */",
  1428. format("int i; /* first line\n"
  1429. " * second line\n"
  1430. " * third line\n"
  1431. " */",
  1432. getLLVMStyleWithColumns(20)));
  1433. // Reflow the last two lines of a section that starts with a line having
  1434. // different indentation.
  1435. EXPECT_EQ(
  1436. "// long\n"
  1437. "// long long long\n"
  1438. "// long long",
  1439. format("// long\n"
  1440. "// long long long long\n"
  1441. "// long",
  1442. getLLVMStyleWithColumns(20)));
  1443. // Keep the block comment endling '*/' while reflowing.
  1444. EXPECT_EQ("/* Long long long\n"
  1445. " * line short */\n",
  1446. format("/* Long long long line\n"
  1447. " * short */\n",
  1448. getLLVMStyleWithColumns(20)));
  1449. // Don't reflow between separate blocks of comments.
  1450. EXPECT_EQ("/* First comment\n"
  1451. " * block will */\n"
  1452. "/* Snd\n"
  1453. " */\n",
  1454. format("/* First comment block\n"
  1455. " * will */\n"
  1456. "/* Snd\n"
  1457. " */\n",
  1458. getLLVMStyleWithColumns(20)));
  1459. // Don't reflow across blank comment lines.
  1460. EXPECT_EQ("int i; // This long\n"
  1461. " // line gets\n"
  1462. " // broken.\n"
  1463. " //\n"
  1464. " // keep.\n",
  1465. format("int i; // This long line gets broken.\n"
  1466. " // \n"
  1467. " // keep.\n",
  1468. getLLVMStyleWithColumns(20)));
  1469. EXPECT_EQ("{\n"
  1470. " /// long long long\n"
  1471. " /// long long\n"
  1472. " ///\n"
  1473. " /// long\n"
  1474. "}",
  1475. format("{\n"
  1476. " /// long long long long\n"
  1477. " /// long\n"
  1478. " ///\n"
  1479. " /// long\n"
  1480. "}",
  1481. getLLVMStyleWithColumns(20)));
  1482. EXPECT_EQ("//! long long long\n"
  1483. "//! long\n"
  1484. "\n"
  1485. "//! long",
  1486. format("//! long long long long\n"
  1487. "\n"
  1488. "//! long",
  1489. getLLVMStyleWithColumns(20)));
  1490. EXPECT_EQ("/* long long long\n"
  1491. " long\n"
  1492. "\n"
  1493. " long */",
  1494. format("/* long long long long\n"
  1495. "\n"
  1496. " long */",
  1497. getLLVMStyleWithColumns(20)));
  1498. EXPECT_EQ("/* long long long\n"
  1499. " * long\n"
  1500. " *\n"
  1501. " * long */",
  1502. format("/* long long long long\n"
  1503. " *\n"
  1504. " * long */",
  1505. getLLVMStyleWithColumns(20)));
  1506. // Don't reflow lines having content that is a single character.
  1507. EXPECT_EQ("// long long long\n"
  1508. "// long\n"
  1509. "// l",
  1510. format("// long long long long\n"
  1511. "// l",
  1512. getLLVMStyleWithColumns(20)));
  1513. // Don't reflow lines starting with two punctuation characters.
  1514. EXPECT_EQ("// long long long\n"
  1515. "// long\n"
  1516. "// ... --- ...",
  1517. format(
  1518. "// long long long long\n"
  1519. "// ... --- ...",
  1520. getLLVMStyleWithColumns(20)));
  1521. // Don't reflow lines starting with '@'.
  1522. EXPECT_EQ("// long long long\n"
  1523. "// long\n"
  1524. "// @param arg",
  1525. format("// long long long long\n"
  1526. "// @param arg",
  1527. getLLVMStyleWithColumns(20)));
  1528. // Don't reflow lines starting with 'TODO'.
  1529. EXPECT_EQ("// long long long\n"
  1530. "// long\n"
  1531. "// TODO: long",
  1532. format("// long long long long\n"
  1533. "// TODO: long",
  1534. getLLVMStyleWithColumns(20)));
  1535. // Don't reflow lines starting with 'FIXME'.
  1536. EXPECT_EQ("// long long long\n"
  1537. "// long\n"
  1538. "// FIXME: long",
  1539. format("// long long long long\n"
  1540. "// FIXME: long",
  1541. getLLVMStyleWithColumns(20)));
  1542. // Don't reflow lines starting with 'XXX'.
  1543. EXPECT_EQ("// long long long\n"
  1544. "// long\n"
  1545. "// XXX: long",
  1546. format("// long long long long\n"
  1547. "// XXX: long",
  1548. getLLVMStyleWithColumns(20)));
  1549. // Don't reflow comment pragmas.
  1550. EXPECT_EQ("// long long long\n"
  1551. "// long\n"
  1552. "// IWYU pragma:",
  1553. format("// long long long long\n"
  1554. "// IWYU pragma:",
  1555. getLLVMStyleWithColumns(20)));
  1556. EXPECT_EQ("/* long long long\n"
  1557. " * long\n"
  1558. " * IWYU pragma:\n"
  1559. " */",
  1560. format("/* long long long long\n"
  1561. " * IWYU pragma:\n"
  1562. " */",
  1563. getLLVMStyleWithColumns(20)));
  1564. // Reflow lines that have a non-punctuation character among their first 2
  1565. // characters.
  1566. EXPECT_EQ("// long long long\n"
  1567. "// long 'long'",
  1568. format(
  1569. "// long long long long\n"
  1570. "// 'long'",
  1571. getLLVMStyleWithColumns(20)));
  1572. // Don't reflow between separate blocks of comments.
  1573. EXPECT_EQ("/* First comment\n"
  1574. " * block will */\n"
  1575. "/* Snd\n"
  1576. " */\n",
  1577. format("/* First comment block\n"
  1578. " * will */\n"
  1579. "/* Snd\n"
  1580. " */\n",
  1581. getLLVMStyleWithColumns(20)));
  1582. // Don't reflow lines having different indentation.
  1583. EXPECT_EQ("// long long long\n"
  1584. "// long\n"
  1585. "// long",
  1586. format("// long long long long\n"
  1587. "// long",
  1588. getLLVMStyleWithColumns(20)));
  1589. // Don't reflow separate bullets in list
  1590. EXPECT_EQ("// - long long long\n"
  1591. "// long\n"
  1592. "// - long",
  1593. format("// - long long long long\n"
  1594. "// - long",
  1595. getLLVMStyleWithColumns(20)));
  1596. EXPECT_EQ("// * long long long\n"
  1597. "// long\n"
  1598. "// * long",
  1599. format("// * long long long long\n"
  1600. "// * long",
  1601. getLLVMStyleWithColumns(20)));
  1602. EXPECT_EQ("// + long long long\n"
  1603. "// long\n"
  1604. "// + long",
  1605. format("// + long long long long\n"
  1606. "// + long",
  1607. getLLVMStyleWithColumns(20)));
  1608. EXPECT_EQ("// 1. long long long\n"
  1609. "// long\n"
  1610. "// 2. long",
  1611. format("// 1. long long long long\n"
  1612. "// 2. long",
  1613. getLLVMStyleWithColumns(20)));
  1614. EXPECT_EQ("// -# long long long\n"
  1615. "// long\n"
  1616. "// -# long",
  1617. format("// -# long long long long\n"
  1618. "// -# long",
  1619. getLLVMStyleWithColumns(20)));
  1620. EXPECT_EQ("// - long long long\n"
  1621. "// long long long\n"
  1622. "// - long",
  1623. format("// - long long long long\n"
  1624. "// long long\n"
  1625. "// - long",
  1626. getLLVMStyleWithColumns(20)));
  1627. EXPECT_EQ("// - long long long\n"
  1628. "// long long long\n"
  1629. "// long\n"
  1630. "// - long",
  1631. format("// - long long long long\n"
  1632. "// long long long\n"
  1633. "// - long",
  1634. getLLVMStyleWithColumns(20)));
  1635. // Large number (>2 digits) are not list items
  1636. EXPECT_EQ("// long long long\n"
  1637. "// long 1024. long.",
  1638. format("// long long long long\n"
  1639. "// 1024. long.",
  1640. getLLVMStyleWithColumns(20)));
  1641. // Do not break before number, to avoid introducing a non-reflowable doxygen
  1642. // list item.
  1643. EXPECT_EQ("// long long\n"
  1644. "// long 10. long.",
  1645. format("// long long long 10.\n"
  1646. "// long.",
  1647. getLLVMStyleWithColumns(20)));
  1648. // Don't break or reflow after implicit string literals.
  1649. verifyFormat("#include <t> // l l l\n"
  1650. " // l",
  1651. getLLVMStyleWithColumns(20));
  1652. // Don't break or reflow comments on import lines.
  1653. EXPECT_EQ("#include \"t\" /* l l l\n"
  1654. " * l */",
  1655. format("#include \"t\" /* l l l\n"
  1656. " * l */",
  1657. getLLVMStyleWithColumns(20)));
  1658. // Don't reflow between different trailing comment sections.
  1659. EXPECT_EQ("int i; // long long\n"
  1660. " // long\n"
  1661. "int j; // long long\n"
  1662. " // long\n",
  1663. format("int i; // long long long\n"
  1664. "int j; // long long long\n",
  1665. getLLVMStyleWithColumns(20)));
  1666. // Don't reflow if the first word on the next line is longer than the
  1667. // available space at current line.
  1668. EXPECT_EQ("int i; // trigger\n"
  1669. " // reflow\n"
  1670. " // longsec\n",
  1671. format("int i; // trigger reflow\n"
  1672. " // longsec\n",
  1673. getLLVMStyleWithColumns(20)));
  1674. // Keep empty comment lines.
  1675. EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
  1676. EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
  1677. EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
  1678. EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
  1679. EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
  1680. }
  1681. TEST_F(FormatTestComments, IgnoresIf0Contents) {
  1682. EXPECT_EQ("#if 0\n"
  1683. "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
  1684. "#endif\n"
  1685. "void f() {}",
  1686. format("#if 0\n"
  1687. "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
  1688. "#endif\n"
  1689. "void f( ) { }"));
  1690. EXPECT_EQ("#if false\n"
  1691. "void f( ) { }\n"
  1692. "#endif\n"
  1693. "void g() {}\n",
  1694. format("#if false\n"
  1695. "void f( ) { }\n"
  1696. "#endif\n"
  1697. "void g( ) { }\n"));
  1698. EXPECT_EQ("enum E {\n"
  1699. " One,\n"
  1700. " Two,\n"
  1701. "#if 0\n"
  1702. "Three,\n"
  1703. " Four,\n"
  1704. "#endif\n"
  1705. " Five\n"
  1706. "};",
  1707. format("enum E {\n"
  1708. " One,Two,\n"
  1709. "#if 0\n"
  1710. "Three,\n"
  1711. " Four,\n"
  1712. "#endif\n"
  1713. " Five};"));
  1714. EXPECT_EQ("enum F {\n"
  1715. " One,\n"
  1716. "#if 1\n"
  1717. " Two,\n"
  1718. "#if 0\n"
  1719. "Three,\n"
  1720. " Four,\n"
  1721. "#endif\n"
  1722. " Five\n"
  1723. "#endif\n"
  1724. "};",
  1725. format("enum F {\n"
  1726. "One,\n"
  1727. "#if 1\n"
  1728. "Two,\n"
  1729. "#if 0\n"
  1730. "Three,\n"
  1731. " Four,\n"
  1732. "#endif\n"
  1733. "Five\n"
  1734. "#endif\n"
  1735. "};"));
  1736. EXPECT_EQ("enum G {\n"
  1737. " One,\n"
  1738. "#if 0\n"
  1739. "Two,\n"
  1740. "#else\n"
  1741. " Three,\n"
  1742. "#endif\n"
  1743. " Four\n"
  1744. "};",
  1745. format("enum G {\n"
  1746. "One,\n"
  1747. "#if 0\n"
  1748. "Two,\n"
  1749. "#else\n"
  1750. "Three,\n"
  1751. "#endif\n"
  1752. "Four\n"
  1753. "};"));
  1754. EXPECT_EQ("enum H {\n"
  1755. " One,\n"
  1756. "#if 0\n"
  1757. "#ifdef Q\n"
  1758. "Two,\n"
  1759. "#else\n"
  1760. "Three,\n"
  1761. "#endif\n"
  1762. "#endif\n"
  1763. " Four\n"
  1764. "};",
  1765. format("enum H {\n"
  1766. "One,\n"
  1767. "#if 0\n"
  1768. "#ifdef Q\n"
  1769. "Two,\n"
  1770. "#else\n"
  1771. "Three,\n"
  1772. "#endif\n"
  1773. "#endif\n"
  1774. "Four\n"
  1775. "};"));
  1776. EXPECT_EQ("enum I {\n"
  1777. " One,\n"
  1778. "#if /* test */ 0 || 1\n"
  1779. "Two,\n"
  1780. "Three,\n"
  1781. "#endif\n"
  1782. " Four\n"
  1783. "};",
  1784. format("enum I {\n"
  1785. "One,\n"
  1786. "#if /* test */ 0 || 1\n"
  1787. "Two,\n"
  1788. "Three,\n"
  1789. "#endif\n"
  1790. "Four\n"
  1791. "};"));
  1792. EXPECT_EQ("enum J {\n"
  1793. " One,\n"
  1794. "#if 0\n"
  1795. "#if 0\n"
  1796. "Two,\n"
  1797. "#else\n"
  1798. "Three,\n"
  1799. "#endif\n"
  1800. "Four,\n"
  1801. "#endif\n"
  1802. " Five\n"
  1803. "};",
  1804. format("enum J {\n"
  1805. "One,\n"
  1806. "#if 0\n"
  1807. "#if 0\n"
  1808. "Two,\n"
  1809. "#else\n"
  1810. "Three,\n"
  1811. "#endif\n"
  1812. "Four,\n"
  1813. "#endif\n"
  1814. "Five\n"
  1815. "};"));
  1816. // Ignore stuff in SWIG-blocks.
  1817. EXPECT_EQ("#ifdef SWIG\n"
  1818. "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
  1819. "#endif\n"
  1820. "void f() {}",
  1821. format("#ifdef SWIG\n"
  1822. "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
  1823. "#endif\n"
  1824. "void f( ) { }"));
  1825. EXPECT_EQ("#ifndef SWIG\n"
  1826. "void f() {}\n"
  1827. "#endif",
  1828. format("#ifndef SWIG\n"
  1829. "void f( ) { }\n"
  1830. "#endif"));
  1831. }
  1832. TEST_F(FormatTestComments, DontCrashOnBlockComments) {
  1833. EXPECT_EQ(
  1834. "int xxxxxxxxx; /* "
  1835. "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
  1836. "zzzzzz\n"
  1837. "0*/",
  1838. format("int xxxxxxxxx; /* "
  1839. "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
  1840. "0*/"));
  1841. }
  1842. TEST_F(FormatTestComments, BlockCommentsInControlLoops) {
  1843. verifyFormat("if (0) /* a comment in a strange place */ {\n"
  1844. " f();\n"
  1845. "}");
  1846. verifyFormat("if (0) /* a comment in a strange place */ {\n"
  1847. " f();\n"
  1848. "} /* another comment */ else /* comment #3 */ {\n"
  1849. " g();\n"
  1850. "}");
  1851. verifyFormat("while (0) /* a comment in a strange place */ {\n"
  1852. " f();\n"
  1853. "}");
  1854. verifyFormat("for (;;) /* a comment in a strange place */ {\n"
  1855. " f();\n"
  1856. "}");
  1857. verifyFormat("do /* a comment in a strange place */ {\n"
  1858. " f();\n"
  1859. "} /* another comment */ while (0);");
  1860. }
  1861. TEST_F(FormatTestComments, BlockComments) {
  1862. EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
  1863. format("/* *//* */ /* */\n/* *//* */ /* */"));
  1864. EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
  1865. EXPECT_EQ("#define A /*123*/ \\\n"
  1866. " b\n"
  1867. "/* */\n"
  1868. "someCall(\n"
  1869. " parameter);",
  1870. format("#define A /*123*/ b\n"
  1871. "/* */\n"
  1872. "someCall(parameter);",
  1873. getLLVMStyleWithColumns(15)));
  1874. EXPECT_EQ("#define A\n"
  1875. "/* */ someCall(\n"
  1876. " parameter);",
  1877. format("#define A\n"
  1878. "/* */someCall(parameter);",
  1879. getLLVMStyleWithColumns(15)));
  1880. EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
  1881. EXPECT_EQ("/*\n"
  1882. " *\n"
  1883. " * aaaaaa\n"
  1884. " * aaaaaa\n"
  1885. " */",
  1886. format("/*\n"
  1887. "*\n"
  1888. " * aaaaaa aaaaaa\n"
  1889. "*/",
  1890. getLLVMStyleWithColumns(10)));
  1891. EXPECT_EQ("/*\n"
  1892. "**\n"
  1893. "* aaaaaa\n"
  1894. "*aaaaaa\n"
  1895. "*/",
  1896. format("/*\n"
  1897. "**\n"
  1898. "* aaaaaa aaaaaa\n"
  1899. "*/",
  1900. getLLVMStyleWithColumns(10)));
  1901. EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
  1902. " /* line 1\n"
  1903. " bbbbbbbbbbbb */\n"
  1904. " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
  1905. format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
  1906. " /* line 1\n"
  1907. " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
  1908. getLLVMStyleWithColumns(50)));
  1909. FormatStyle NoBinPacking = getLLVMStyle();
  1910. NoBinPacking.BinPackParameters = false;
  1911. EXPECT_EQ("someFunction(1, /* comment 1 */\n"
  1912. " 2, /* comment 2 */\n"
  1913. " 3, /* comment 3 */\n"
  1914. " aaaa,\n"
  1915. " bbbb);",
  1916. format("someFunction (1, /* comment 1 */\n"
  1917. " 2, /* comment 2 */ \n"
  1918. " 3, /* comment 3 */\n"
  1919. "aaaa, bbbb );",
  1920. NoBinPacking));
  1921. verifyFormat(
  1922. "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
  1923. " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
  1924. EXPECT_EQ(
  1925. "bool aaaaaaaaaaaaa = /* trailing comment */\n"
  1926. " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
  1927. " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
  1928. format(
  1929. "bool aaaaaaaaaaaaa = /* trailing comment */\n"
  1930. " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
  1931. " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
  1932. EXPECT_EQ(
  1933. "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
  1934. "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
  1935. "int cccccccccccccccccccccccccccccc; /* comment */\n",
  1936. format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
  1937. "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
  1938. "int cccccccccccccccccccccccccccccc; /* comment */\n"));
  1939. verifyFormat("void f(int * /* unused */) {}");
  1940. EXPECT_EQ("/*\n"
  1941. " **\n"
  1942. " */",
  1943. format("/*\n"
  1944. " **\n"
  1945. " */"));
  1946. EXPECT_EQ("/*\n"
  1947. " *q\n"
  1948. " */",
  1949. format("/*\n"
  1950. " *q\n"
  1951. " */"));
  1952. EXPECT_EQ("/*\n"
  1953. " * q\n"
  1954. " */",
  1955. format("/*\n"
  1956. " * q\n"
  1957. " */"));
  1958. EXPECT_EQ("/*\n"
  1959. " **/",
  1960. format("/*\n"
  1961. " **/"));
  1962. EXPECT_EQ("/*\n"
  1963. " ***/",
  1964. format("/*\n"
  1965. " ***/"));
  1966. }
  1967. TEST_F(FormatTestComments, BlockCommentsInMacros) {
  1968. EXPECT_EQ("#define A \\\n"
  1969. " { \\\n"
  1970. " /* one line */ \\\n"
  1971. " someCall();",
  1972. format("#define A { \\\n"
  1973. " /* one line */ \\\n"
  1974. " someCall();",
  1975. getLLVMStyleWithColumns(20)));
  1976. EXPECT_EQ("#define A \\\n"
  1977. " { \\\n"
  1978. " /* previous */ \\\n"
  1979. " /* one line */ \\\n"
  1980. " someCall();",
  1981. format("#define A { \\\n"
  1982. " /* previous */ \\\n"
  1983. " /* one line */ \\\n"
  1984. " someCall();",
  1985. getLLVMStyleWithColumns(20)));
  1986. }
  1987. TEST_F(FormatTestComments, BlockCommentsAtEndOfLine) {
  1988. EXPECT_EQ("a = {\n"
  1989. " 1111 /* */\n"
  1990. "};",
  1991. format("a = {1111 /* */\n"
  1992. "};",
  1993. getLLVMStyleWithColumns(15)));
  1994. EXPECT_EQ("a = {\n"
  1995. " 1111 /* */\n"
  1996. "};",
  1997. format("a = {1111 /* */\n"
  1998. "};",
  1999. getLLVMStyleWithColumns(15)));
  2000. EXPECT_EQ("a = {\n"
  2001. " 1111 /* a\n"
  2002. " */\n"
  2003. "};",
  2004. format("a = {1111 /* a */\n"
  2005. "};",
  2006. getLLVMStyleWithColumns(15)));
  2007. }
  2008. TEST_F(FormatTestComments, IndentLineCommentsInStartOfBlockAtEndOfFile) {
  2009. verifyFormat("{\n"
  2010. " // a\n"
  2011. " // b");
  2012. }
  2013. TEST_F(FormatTestComments, AlignTrailingComments) {
  2014. EXPECT_EQ("#define MACRO(V) \\\n"
  2015. " V(Rt2) /* one more char */ \\\n"
  2016. " V(Rs) /* than here */ \\\n"
  2017. "/* comment 3 */\n",
  2018. format("#define MACRO(V)\\\n"
  2019. "V(Rt2) /* one more char */ \\\n"
  2020. "V(Rs) /* than here */ \\\n"
  2021. "/* comment 3 */\n",
  2022. getLLVMStyleWithColumns(40)));
  2023. EXPECT_EQ("int i = f(abc, // line 1\n"
  2024. " d, // line 2\n"
  2025. " // line 3\n"
  2026. " b);",
  2027. format("int i = f(abc, // line 1\n"
  2028. " d, // line 2\n"
  2029. " // line 3\n"
  2030. " b);",
  2031. getLLVMStyleWithColumns(40)));
  2032. // Align newly broken trailing comments.
  2033. EXPECT_EQ("int ab; // line\n"
  2034. "int a; // long\n"
  2035. " // long\n",
  2036. format("int ab; // line\n"
  2037. "int a; // long long\n",
  2038. getLLVMStyleWithColumns(15)));
  2039. EXPECT_EQ("int ab; // line\n"
  2040. "int a; // long\n"
  2041. " // long\n"
  2042. " // long",
  2043. format("int ab; // line\n"
  2044. "int a; // long long\n"
  2045. " // long",
  2046. getLLVMStyleWithColumns(15)));
  2047. EXPECT_EQ("int ab; // line\n"
  2048. "int a; // long\n"
  2049. " // long\n"
  2050. "pt c; // long",
  2051. format("int ab; // line\n"
  2052. "int a; // long long\n"
  2053. "pt c; // long",
  2054. getLLVMStyleWithColumns(15)));
  2055. EXPECT_EQ("int ab; // line\n"
  2056. "int a; // long\n"
  2057. " // long\n"
  2058. "\n"
  2059. "// long",
  2060. format("int ab; // line\n"
  2061. "int a; // long long\n"
  2062. "\n"
  2063. "// long",
  2064. getLLVMStyleWithColumns(15)));
  2065. // Don't align newly broken trailing comments if that would put them over the
  2066. // column limit.
  2067. EXPECT_EQ("int i, j; // line 1\n"
  2068. "int k; // line longg\n"
  2069. " // long",
  2070. format("int i, j; // line 1\n"
  2071. "int k; // line longg long",
  2072. getLLVMStyleWithColumns(20)));
  2073. // Align comment line sections aligned with the next token with the next
  2074. // token.
  2075. EXPECT_EQ("class A {\n"
  2076. "public: // public comment\n"
  2077. " // comment about a\n"
  2078. " int a;\n"
  2079. "};",
  2080. format("class A {\n"
  2081. "public: // public comment\n"
  2082. " // comment about a\n"
  2083. " int a;\n"
  2084. "};",
  2085. getLLVMStyleWithColumns(40)));
  2086. EXPECT_EQ("class A {\n"
  2087. "public: // public comment 1\n"
  2088. " // public comment 2\n"
  2089. " // comment 1 about a\n"
  2090. " // comment 2 about a\n"
  2091. " int a;\n"
  2092. "};",
  2093. format("class A {\n"
  2094. "public: // public comment 1\n"
  2095. " // public comment 2\n"
  2096. " // comment 1 about a\n"
  2097. " // comment 2 about a\n"
  2098. " int a;\n"
  2099. "};",
  2100. getLLVMStyleWithColumns(40)));
  2101. EXPECT_EQ("int f(int n) { // comment line 1 on f\n"
  2102. " // comment line 2 on f\n"
  2103. " // comment line 1 before return\n"
  2104. " // comment line 2 before return\n"
  2105. " return n; // comment line 1 on return\n"
  2106. " // comment line 2 on return\n"
  2107. " // comment line 1 after return\n"
  2108. "}",
  2109. format("int f(int n) { // comment line 1 on f\n"
  2110. " // comment line 2 on f\n"
  2111. " // comment line 1 before return\n"
  2112. " // comment line 2 before return\n"
  2113. " return n; // comment line 1 on return\n"
  2114. " // comment line 2 on return\n"
  2115. " // comment line 1 after return\n"
  2116. "}",
  2117. getLLVMStyleWithColumns(40)));
  2118. EXPECT_EQ("int f(int n) {\n"
  2119. " switch (n) { // comment line 1 on switch\n"
  2120. " // comment line 2 on switch\n"
  2121. " // comment line 1 before case 1\n"
  2122. " // comment line 2 before case 1\n"
  2123. " case 1: // comment line 1 on case 1\n"
  2124. " // comment line 2 on case 1\n"
  2125. " // comment line 1 before return 1\n"
  2126. " // comment line 2 before return 1\n"
  2127. " return 1; // comment line 1 on return 1\n"
  2128. " // comment line 2 on return 1\n"
  2129. " // comment line 1 before default\n"
  2130. " // comment line 2 before default\n"
  2131. " default: // comment line 1 on default\n"
  2132. " // comment line 2 on default\n"
  2133. " // comment line 1 before return 2\n"
  2134. " return 2 * f(n - 1); // comment line 1 on return 2\n"
  2135. " // comment line 2 on return 2\n"
  2136. " // comment line 1 after return\n"
  2137. " // comment line 2 after return\n"
  2138. " }\n"
  2139. "}",
  2140. format("int f(int n) {\n"
  2141. " switch (n) { // comment line 1 on switch\n"
  2142. " // comment line 2 on switch\n"
  2143. " // comment line 1 before case 1\n"
  2144. " // comment line 2 before case 1\n"
  2145. " case 1: // comment line 1 on case 1\n"
  2146. " // comment line 2 on case 1\n"
  2147. " // comment line 1 before return 1\n"
  2148. " // comment line 2 before return 1\n"
  2149. " return 1; // comment line 1 on return 1\n"
  2150. " // comment line 2 on return 1\n"
  2151. " // comment line 1 before default\n"
  2152. " // comment line 2 before default\n"
  2153. " default: // comment line 1 on default\n"
  2154. " // comment line 2 on default\n"
  2155. " // comment line 1 before return 2\n"
  2156. " return 2 * f(n - 1); // comment line 1 on return 2\n"
  2157. " // comment line 2 on return 2\n"
  2158. " // comment line 1 after return\n"
  2159. " // comment line 2 after return\n"
  2160. " }\n"
  2161. "}",
  2162. getLLVMStyleWithColumns(80)));
  2163. // If all the lines in a sequence of line comments are aligned with the next
  2164. // token, the first line belongs to the previous token and the other lines
  2165. // belong to the next token.
  2166. EXPECT_EQ("int a; // line about a\n"
  2167. "long b;",
  2168. format("int a; // line about a\n"
  2169. " long b;",
  2170. getLLVMStyleWithColumns(80)));
  2171. EXPECT_EQ("int a; // line about a\n"
  2172. "// line about b\n"
  2173. "long b;",
  2174. format("int a; // line about a\n"
  2175. " // line about b\n"
  2176. " long b;",
  2177. getLLVMStyleWithColumns(80)));
  2178. EXPECT_EQ("int a; // line about a\n"
  2179. "// line 1 about b\n"
  2180. "// line 2 about b\n"
  2181. "long b;",
  2182. format("int a; // line about a\n"
  2183. " // line 1 about b\n"
  2184. " // line 2 about b\n"
  2185. " long b;",
  2186. getLLVMStyleWithColumns(80)));
  2187. }
  2188. TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {
  2189. EXPECT_EQ("/*\n"
  2190. " */",
  2191. format("/*\n"
  2192. "*/", getLLVMStyle()));
  2193. EXPECT_EQ("/*\n"
  2194. " */",
  2195. format("/*\n"
  2196. " */", getLLVMStyle()));
  2197. EXPECT_EQ("/*\n"
  2198. " */",
  2199. format("/*\n"
  2200. " */", getLLVMStyle()));
  2201. // Align a single line.
  2202. EXPECT_EQ("/*\n"
  2203. " * line */",
  2204. format("/*\n"
  2205. "* line */",
  2206. getLLVMStyle()));
  2207. EXPECT_EQ("/*\n"
  2208. " * line */",
  2209. format("/*\n"
  2210. " * line */",
  2211. getLLVMStyle()));
  2212. EXPECT_EQ("/*\n"
  2213. " * line */",
  2214. format("/*\n"
  2215. " * line */",
  2216. getLLVMStyle()));
  2217. EXPECT_EQ("/*\n"
  2218. " * line */",
  2219. format("/*\n"
  2220. " * line */",
  2221. getLLVMStyle()));
  2222. EXPECT_EQ("/**\n"
  2223. " * line */",
  2224. format("/**\n"
  2225. "* line */",
  2226. getLLVMStyle()));
  2227. EXPECT_EQ("/**\n"
  2228. " * line */",
  2229. format("/**\n"
  2230. " * line */",
  2231. getLLVMStyle()));
  2232. EXPECT_EQ("/**\n"
  2233. " * line */",
  2234. format("/**\n"
  2235. " * line */",
  2236. getLLVMStyle()));
  2237. EXPECT_EQ("/**\n"
  2238. " * line */",
  2239. format("/**\n"
  2240. " * line */",
  2241. getLLVMStyle()));
  2242. EXPECT_EQ("/**\n"
  2243. " * line */",
  2244. format("/**\n"
  2245. " * line */",
  2246. getLLVMStyle()));
  2247. // Align the end '*/' after a line.
  2248. EXPECT_EQ("/*\n"
  2249. " * line\n"
  2250. " */",
  2251. format("/*\n"
  2252. "* line\n"
  2253. "*/", getLLVMStyle()));
  2254. EXPECT_EQ("/*\n"
  2255. " * line\n"
  2256. " */",
  2257. format("/*\n"
  2258. " * line\n"
  2259. " */", getLLVMStyle()));
  2260. EXPECT_EQ("/*\n"
  2261. " * line\n"
  2262. " */",
  2263. format("/*\n"
  2264. " * line\n"
  2265. " */", getLLVMStyle()));
  2266. // Align two lines.
  2267. EXPECT_EQ("/* line 1\n"
  2268. " * line 2 */",
  2269. format("/* line 1\n"
  2270. " * line 2 */",
  2271. getLLVMStyle()));
  2272. EXPECT_EQ("/* line 1\n"
  2273. " * line 2 */",
  2274. format("/* line 1\n"
  2275. "* line 2 */",
  2276. getLLVMStyle()));
  2277. EXPECT_EQ("/* line 1\n"
  2278. " * line 2 */",
  2279. format("/* line 1\n"
  2280. " * line 2 */",
  2281. getLLVMStyle()));
  2282. EXPECT_EQ("/* line 1\n"
  2283. " * line 2 */",
  2284. format("/* line 1\n"
  2285. " * line 2 */",
  2286. getLLVMStyle()));
  2287. EXPECT_EQ("/* line 1\n"
  2288. " * line 2 */",
  2289. format("/* line 1\n"
  2290. " * line 2 */",
  2291. getLLVMStyle()));
  2292. EXPECT_EQ("int i; /* line 1\n"
  2293. " * line 2 */",
  2294. format("int i; /* line 1\n"
  2295. "* line 2 */",
  2296. getLLVMStyle()));
  2297. EXPECT_EQ("int i; /* line 1\n"
  2298. " * line 2 */",
  2299. format("int i; /* line 1\n"
  2300. " * line 2 */",
  2301. getLLVMStyle()));
  2302. EXPECT_EQ("int i; /* line 1\n"
  2303. " * line 2 */",
  2304. format("int i; /* line 1\n"
  2305. " * line 2 */",
  2306. getLLVMStyle()));
  2307. // Align several lines.
  2308. EXPECT_EQ("/* line 1\n"
  2309. " * line 2\n"
  2310. " * line 3 */",
  2311. format("/* line 1\n"
  2312. " * line 2\n"
  2313. "* line 3 */",
  2314. getLLVMStyle()));
  2315. EXPECT_EQ("/* line 1\n"
  2316. " * line 2\n"
  2317. " * line 3 */",
  2318. format("/* line 1\n"
  2319. " * line 2\n"
  2320. "* line 3 */",
  2321. getLLVMStyle()));
  2322. EXPECT_EQ("/*\n"
  2323. "** line 1\n"
  2324. "** line 2\n"
  2325. "*/",
  2326. format("/*\n"
  2327. "** line 1\n"
  2328. " ** line 2\n"
  2329. "*/",
  2330. getLLVMStyle()));
  2331. // Align with different indent after the decorations.
  2332. EXPECT_EQ("/*\n"
  2333. " * line 1\n"
  2334. " * line 2\n"
  2335. " * line 3\n"
  2336. " * line 4\n"
  2337. " */",
  2338. format("/*\n"
  2339. "* line 1\n"
  2340. " * line 2\n"
  2341. " * line 3\n"
  2342. "* line 4\n"
  2343. "*/", getLLVMStyle()));
  2344. // Align empty or blank lines.
  2345. EXPECT_EQ("/**\n"
  2346. " *\n"
  2347. " *\n"
  2348. " *\n"
  2349. " */",
  2350. format("/**\n"
  2351. "* \n"
  2352. " * \n"
  2353. " *\n"
  2354. "*/", getLLVMStyle()));
  2355. // Align while breaking and reflowing.
  2356. EXPECT_EQ("/*\n"
  2357. " * long long long\n"
  2358. " * long long\n"
  2359. " *\n"
  2360. " * long */",
  2361. format("/*\n"
  2362. " * long long long long\n"
  2363. " * long\n"
  2364. " *\n"
  2365. "* long */",
  2366. getLLVMStyleWithColumns(20)));
  2367. }
  2368. } // end namespace
  2369. } // end namespace format
  2370. } // end namespace clang