FormatTestComments.cpp 97 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808
  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, KeepsLevelOfCommentBeforePPDirective) {
  755. // Keep the current level if the comment was originally not aligned with
  756. // the preprocessor directive.
  757. EXPECT_EQ("void f() {\n"
  758. " int i;\n"
  759. " /* comment */\n"
  760. "#ifdef A\n"
  761. " int j;\n"
  762. "}",
  763. format("void f() {\n"
  764. " int i;\n"
  765. " /* comment */\n"
  766. "#ifdef A\n"
  767. " int j;\n"
  768. "}"));
  769. EXPECT_EQ("void f() {\n"
  770. " int i;\n"
  771. " /* comment */\n"
  772. "\n"
  773. "#ifdef A\n"
  774. " int j;\n"
  775. "}",
  776. format("void f() {\n"
  777. " int i;\n"
  778. " /* comment */\n"
  779. "\n"
  780. "#ifdef A\n"
  781. " int j;\n"
  782. "}"));
  783. EXPECT_EQ("int f(int i) {\n"
  784. " if (true) {\n"
  785. " ++i;\n"
  786. " }\n"
  787. " // comment\n"
  788. "#ifdef A\n"
  789. " int j;\n"
  790. "#endif\n"
  791. "}",
  792. format("int f(int i) {\n"
  793. " if (true) {\n"
  794. " ++i;\n"
  795. " }\n"
  796. " // comment\n"
  797. "#ifdef A\n"
  798. "int j;\n"
  799. "#endif\n"
  800. "}"));
  801. EXPECT_EQ("int f(int i) {\n"
  802. " if (true) {\n"
  803. " i++;\n"
  804. " } else {\n"
  805. " // comment in else\n"
  806. "#ifdef A\n"
  807. " j++;\n"
  808. "#endif\n"
  809. " }\n"
  810. "}",
  811. format("int f(int i) {\n"
  812. " if (true) {\n"
  813. " i++;\n"
  814. " } else {\n"
  815. " // comment in else\n"
  816. "#ifdef A\n"
  817. " j++;\n"
  818. "#endif\n"
  819. " }\n"
  820. "}"));
  821. EXPECT_EQ("int f(int i) {\n"
  822. " if (true) {\n"
  823. " i++;\n"
  824. " } else {\n"
  825. " /* comment in else */\n"
  826. "#ifdef A\n"
  827. " j++;\n"
  828. "#endif\n"
  829. " }\n"
  830. "}",
  831. format("int f(int i) {\n"
  832. " if (true) {\n"
  833. " i++;\n"
  834. " } else {\n"
  835. " /* comment in else */\n"
  836. "#ifdef A\n"
  837. " j++;\n"
  838. "#endif\n"
  839. " }\n"
  840. "}"));
  841. // Keep the current level if there is an empty line between the comment and
  842. // the preprocessor directive.
  843. EXPECT_EQ("void f() {\n"
  844. " int i;\n"
  845. " /* comment */\n"
  846. "\n"
  847. "#ifdef A\n"
  848. " int j;\n"
  849. "}",
  850. format("void f() {\n"
  851. " int i;\n"
  852. "/* comment */\n"
  853. "\n"
  854. "#ifdef A\n"
  855. " int j;\n"
  856. "}"));
  857. EXPECT_EQ("void f() {\n"
  858. " int i;\n"
  859. " return i;\n"
  860. "}\n"
  861. "// comment\n"
  862. "\n"
  863. "#ifdef A\n"
  864. "int i;\n"
  865. "#endif // A",
  866. format("void f() {\n"
  867. " int i;\n"
  868. " return i;\n"
  869. "}\n"
  870. "// comment\n"
  871. "\n"
  872. "#ifdef A\n"
  873. "int i;\n"
  874. "#endif // A"));
  875. EXPECT_EQ("int f(int i) {\n"
  876. " if (true) {\n"
  877. " ++i;\n"
  878. " }\n"
  879. " // comment\n"
  880. "\n"
  881. "#ifdef A\n"
  882. " int j;\n"
  883. "#endif\n"
  884. "}",
  885. format("int f(int i) {\n"
  886. " if (true) {\n"
  887. " ++i;\n"
  888. " }\n"
  889. " // comment\n"
  890. "\n"
  891. "#ifdef A\n"
  892. " int j;\n"
  893. "#endif\n"
  894. "}"));
  895. EXPECT_EQ("int f(int i) {\n"
  896. " if (true) {\n"
  897. " i++;\n"
  898. " } else {\n"
  899. " // comment in else\n"
  900. "\n"
  901. "#ifdef A\n"
  902. " j++;\n"
  903. "#endif\n"
  904. " }\n"
  905. "}",
  906. format("int f(int i) {\n"
  907. " if (true) {\n"
  908. " i++;\n"
  909. " } else {\n"
  910. "// comment in else\n"
  911. "\n"
  912. "#ifdef A\n"
  913. " j++;\n"
  914. "#endif\n"
  915. " }\n"
  916. "}"));
  917. EXPECT_EQ("int f(int i) {\n"
  918. " if (true) {\n"
  919. " i++;\n"
  920. " } else {\n"
  921. " /* comment in else */\n"
  922. "\n"
  923. "#ifdef A\n"
  924. " j++;\n"
  925. "#endif\n"
  926. " }\n"
  927. "}",
  928. format("int f(int i) {\n"
  929. " if (true) {\n"
  930. " i++;\n"
  931. " } else {\n"
  932. "/* comment in else */\n"
  933. "\n"
  934. "#ifdef A\n"
  935. " j++;\n"
  936. "#endif\n"
  937. " }\n"
  938. "}"));
  939. // Align with the preprocessor directive if the comment was originally aligned
  940. // with the preprocessor directive and there is no newline between the comment
  941. // and the preprocessor directive.
  942. EXPECT_EQ("void f() {\n"
  943. " int i;\n"
  944. "/* comment */\n"
  945. "#ifdef A\n"
  946. " int j;\n"
  947. "}",
  948. format("void f() {\n"
  949. " int i;\n"
  950. "/* comment */\n"
  951. "#ifdef A\n"
  952. " int j;\n"
  953. "}"));
  954. EXPECT_EQ("int f(int i) {\n"
  955. " if (true) {\n"
  956. " ++i;\n"
  957. " }\n"
  958. "// comment\n"
  959. "#ifdef A\n"
  960. " int j;\n"
  961. "#endif\n"
  962. "}",
  963. format("int f(int i) {\n"
  964. " if (true) {\n"
  965. " ++i;\n"
  966. " }\n"
  967. "// comment\n"
  968. "#ifdef A\n"
  969. " int j;\n"
  970. "#endif\n"
  971. "}"));
  972. EXPECT_EQ("int f(int i) {\n"
  973. " if (true) {\n"
  974. " i++;\n"
  975. " } else {\n"
  976. "// comment in else\n"
  977. "#ifdef A\n"
  978. " j++;\n"
  979. "#endif\n"
  980. " }\n"
  981. "}",
  982. format("int f(int i) {\n"
  983. " if (true) {\n"
  984. " i++;\n"
  985. " } else {\n"
  986. " // comment in else\n"
  987. " #ifdef A\n"
  988. " j++;\n"
  989. "#endif\n"
  990. " }\n"
  991. "}"));
  992. EXPECT_EQ("int f(int i) {\n"
  993. " if (true) {\n"
  994. " i++;\n"
  995. " } else {\n"
  996. "/* comment in else */\n"
  997. "#ifdef A\n"
  998. " j++;\n"
  999. "#endif\n"
  1000. " }\n"
  1001. "}",
  1002. format("int f(int i) {\n"
  1003. " if (true) {\n"
  1004. " i++;\n"
  1005. " } else {\n"
  1006. " /* comment in else */\n"
  1007. " #ifdef A\n"
  1008. " j++;\n"
  1009. "#endif\n"
  1010. " }\n"
  1011. "}"));
  1012. }
  1013. TEST_F(FormatTestComments, SplitsLongLinesInComments) {
  1014. EXPECT_EQ("/* This is a long\n"
  1015. " * comment that\n"
  1016. " * doesn't\n"
  1017. " * fit on one line.\n"
  1018. " */",
  1019. format("/* "
  1020. "This is a long "
  1021. "comment that "
  1022. "doesn't "
  1023. "fit on one line. */",
  1024. getLLVMStyleWithColumns(20)));
  1025. EXPECT_EQ(
  1026. "/* a b c d\n"
  1027. " * e f g\n"
  1028. " * h i j k\n"
  1029. " */",
  1030. format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
  1031. EXPECT_EQ(
  1032. "/* a b c d\n"
  1033. " * e f g\n"
  1034. " * h i j k\n"
  1035. " */",
  1036. format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
  1037. EXPECT_EQ("/*\n"
  1038. "This is a long\n"
  1039. "comment that doesn't\n"
  1040. "fit on one line.\n"
  1041. "*/",
  1042. format("/*\n"
  1043. "This is a long "
  1044. "comment that doesn't "
  1045. "fit on one line. \n"
  1046. "*/",
  1047. getLLVMStyleWithColumns(20)));
  1048. EXPECT_EQ("/*\n"
  1049. " * This is a long\n"
  1050. " * comment that\n"
  1051. " * doesn't fit on\n"
  1052. " * one line.\n"
  1053. " */",
  1054. format("/* \n"
  1055. " * This is a long "
  1056. " comment that "
  1057. " doesn't fit on "
  1058. " one line. \n"
  1059. " */",
  1060. getLLVMStyleWithColumns(20)));
  1061. EXPECT_EQ("/*\n"
  1062. " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
  1063. " * so_it_should_be_broken\n"
  1064. " * wherever_a_space_occurs\n"
  1065. " */",
  1066. format("/*\n"
  1067. " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
  1068. " so_it_should_be_broken "
  1069. " wherever_a_space_occurs \n"
  1070. " */",
  1071. getLLVMStyleWithColumns(20)));
  1072. EXPECT_EQ("/*\n"
  1073. " * This_comment_can_not_be_broken_into_lines\n"
  1074. " */",
  1075. format("/*\n"
  1076. " * This_comment_can_not_be_broken_into_lines\n"
  1077. " */",
  1078. getLLVMStyleWithColumns(20)));
  1079. EXPECT_EQ("{\n"
  1080. " /*\n"
  1081. " This is another\n"
  1082. " long comment that\n"
  1083. " doesn't fit on one\n"
  1084. " line 1234567890\n"
  1085. " */\n"
  1086. "}",
  1087. format("{\n"
  1088. "/*\n"
  1089. "This is another "
  1090. " long comment that "
  1091. " doesn't fit on one"
  1092. " line 1234567890\n"
  1093. "*/\n"
  1094. "}",
  1095. getLLVMStyleWithColumns(20)));
  1096. EXPECT_EQ("{\n"
  1097. " /*\n"
  1098. " * This i s\n"
  1099. " * another comment\n"
  1100. " * t hat doesn' t\n"
  1101. " * fit on one l i\n"
  1102. " * n e\n"
  1103. " */\n"
  1104. "}",
  1105. format("{\n"
  1106. "/*\n"
  1107. " * This i s"
  1108. " another comment"
  1109. " t hat doesn' t"
  1110. " fit on one l i"
  1111. " n e\n"
  1112. " */\n"
  1113. "}",
  1114. getLLVMStyleWithColumns(20)));
  1115. EXPECT_EQ("/*\n"
  1116. " * This is a long\n"
  1117. " * comment that\n"
  1118. " * doesn't fit on\n"
  1119. " * one line\n"
  1120. " */",
  1121. format(" /*\n"
  1122. " * This is a long comment that doesn't fit on one line\n"
  1123. " */",
  1124. getLLVMStyleWithColumns(20)));
  1125. EXPECT_EQ("{\n"
  1126. " if (something) /* This is a\n"
  1127. " long\n"
  1128. " comment */\n"
  1129. " ;\n"
  1130. "}",
  1131. format("{\n"
  1132. " if (something) /* This is a long comment */\n"
  1133. " ;\n"
  1134. "}",
  1135. getLLVMStyleWithColumns(30)));
  1136. EXPECT_EQ("/* A comment before\n"
  1137. " * a macro\n"
  1138. " * definition */\n"
  1139. "#define a b",
  1140. format("/* A comment before a macro definition */\n"
  1141. "#define a b",
  1142. getLLVMStyleWithColumns(20)));
  1143. EXPECT_EQ("/* some comment\n"
  1144. " * a comment that\n"
  1145. " * we break another\n"
  1146. " * comment we have\n"
  1147. " * to break a left\n"
  1148. " * comment\n"
  1149. " */",
  1150. format(" /* some comment\n"
  1151. " * a comment that we break\n"
  1152. " * another comment we have to break\n"
  1153. "* a left comment\n"
  1154. " */",
  1155. getLLVMStyleWithColumns(20)));
  1156. EXPECT_EQ("/**\n"
  1157. " * multiline block\n"
  1158. " * comment\n"
  1159. " *\n"
  1160. " */",
  1161. format("/**\n"
  1162. " * multiline block comment\n"
  1163. " *\n"
  1164. " */",
  1165. getLLVMStyleWithColumns(20)));
  1166. EXPECT_EQ("/*\n"
  1167. "\n"
  1168. "\n"
  1169. " */\n",
  1170. format(" /* \n"
  1171. " \n"
  1172. " \n"
  1173. " */\n"));
  1174. EXPECT_EQ("/* a a */",
  1175. format("/* a a */", getLLVMStyleWithColumns(15)));
  1176. EXPECT_EQ("/* a a bc */",
  1177. format("/* a a bc */", getLLVMStyleWithColumns(15)));
  1178. EXPECT_EQ("/* aaa aaa\n"
  1179. " * aaaaa */",
  1180. format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
  1181. EXPECT_EQ("/* aaa aaa\n"
  1182. " * aaaaa */",
  1183. format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
  1184. }
  1185. TEST_F(FormatTestComments, SplitsLongLinesInCommentsInPreprocessor) {
  1186. EXPECT_EQ("#define X \\\n"
  1187. " /* \\\n"
  1188. " Test \\\n"
  1189. " Macro comment \\\n"
  1190. " with a long \\\n"
  1191. " line \\\n"
  1192. " */ \\\n"
  1193. " A + B",
  1194. format("#define X \\\n"
  1195. " /*\n"
  1196. " Test\n"
  1197. " Macro comment with a long line\n"
  1198. " */ \\\n"
  1199. " A + B",
  1200. getLLVMStyleWithColumns(20)));
  1201. EXPECT_EQ("#define X \\\n"
  1202. " /* Macro comment \\\n"
  1203. " with a long \\\n"
  1204. " line */ \\\n"
  1205. " A + B",
  1206. format("#define X \\\n"
  1207. " /* Macro comment with a long\n"
  1208. " line */ \\\n"
  1209. " A + B",
  1210. getLLVMStyleWithColumns(20)));
  1211. EXPECT_EQ("#define X \\\n"
  1212. " /* Macro comment \\\n"
  1213. " * with a long \\\n"
  1214. " * line */ \\\n"
  1215. " A + B",
  1216. format("#define X \\\n"
  1217. " /* Macro comment with a long line */ \\\n"
  1218. " A + B",
  1219. getLLVMStyleWithColumns(20)));
  1220. }
  1221. TEST_F(FormatTestComments, KeepsTrailingPPCommentsAndSectionCommentsSeparate) {
  1222. verifyFormat("#ifdef A // line about A\n"
  1223. "// section comment\n"
  1224. "#endif",
  1225. getLLVMStyleWithColumns(80));
  1226. verifyFormat("#ifdef A // line 1 about A\n"
  1227. " // line 2 about A\n"
  1228. "// section comment\n"
  1229. "#endif",
  1230. getLLVMStyleWithColumns(80));
  1231. EXPECT_EQ("#ifdef A // line 1 about A\n"
  1232. " // line 2 about A\n"
  1233. "// section comment\n"
  1234. "#endif",
  1235. format("#ifdef A // line 1 about A\n"
  1236. " // line 2 about A\n"
  1237. "// section comment\n"
  1238. "#endif",
  1239. getLLVMStyleWithColumns(80)));
  1240. verifyFormat("int f() {\n"
  1241. " int i;\n"
  1242. "#ifdef A // comment about A\n"
  1243. " // section comment 1\n"
  1244. " // section comment 2\n"
  1245. " i = 2;\n"
  1246. "#else // comment about #else\n"
  1247. " // section comment 3\n"
  1248. " i = 4;\n"
  1249. "#endif\n"
  1250. "}", getLLVMStyleWithColumns(80));
  1251. }
  1252. TEST_F(FormatTestComments, AlignsPPElseEndifComments) {
  1253. verifyFormat("#if A\n"
  1254. "#else // A\n"
  1255. "int iiii;\n"
  1256. "#endif // B",
  1257. getLLVMStyleWithColumns(20));
  1258. verifyFormat("#if A\n"
  1259. "#else // A\n"
  1260. "int iiii; // CC\n"
  1261. "#endif // B",
  1262. getLLVMStyleWithColumns(20));
  1263. EXPECT_EQ("#if A\n"
  1264. "#else // A1\n"
  1265. " // A2\n"
  1266. "int ii;\n"
  1267. "#endif // B",
  1268. format("#if A\n"
  1269. "#else // A1\n"
  1270. " // A2\n"
  1271. "int ii;\n"
  1272. "#endif // B",
  1273. getLLVMStyleWithColumns(20)));
  1274. }
  1275. TEST_F(FormatTestComments, CommentsInStaticInitializers) {
  1276. EXPECT_EQ(
  1277. "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
  1278. " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
  1279. " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
  1280. " aaaaaaaaaaaaaaaaaaaa, // comment\n"
  1281. " aaaaaaaaaaaaaaaaaaaa};",
  1282. format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
  1283. " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
  1284. " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
  1285. " aaaaaaaaaaaaaaaaaaaa , // comment\n"
  1286. " aaaaaaaaaaaaaaaaaaaa };"));
  1287. verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
  1288. " bbbbbbbbbbb, ccccccccccc};");
  1289. verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
  1290. " // comment for bb....\n"
  1291. " bbbbbbbbbbb, ccccccccccc};");
  1292. verifyGoogleFormat(
  1293. "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
  1294. " bbbbbbbbbbb, ccccccccccc};");
  1295. verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
  1296. " // comment for bb....\n"
  1297. " bbbbbbbbbbb, ccccccccccc};");
  1298. verifyFormat("S s = {{a, b, c}, // Group #1\n"
  1299. " {d, e, f}, // Group #2\n"
  1300. " {g, h, i}}; // Group #3");
  1301. verifyFormat("S s = {{// Group #1\n"
  1302. " a, b, c},\n"
  1303. " {// Group #2\n"
  1304. " d, e, f},\n"
  1305. " {// Group #3\n"
  1306. " g, h, i}};");
  1307. EXPECT_EQ("S s = {\n"
  1308. " // Some comment\n"
  1309. " a,\n"
  1310. "\n"
  1311. " // Comment after empty line\n"
  1312. " b}",
  1313. format("S s = {\n"
  1314. " // Some comment\n"
  1315. " a,\n"
  1316. " \n"
  1317. " // Comment after empty line\n"
  1318. " b\n"
  1319. "}"));
  1320. EXPECT_EQ("S s = {\n"
  1321. " /* Some comment */\n"
  1322. " a,\n"
  1323. "\n"
  1324. " /* Comment after empty line */\n"
  1325. " b}",
  1326. format("S s = {\n"
  1327. " /* Some comment */\n"
  1328. " a,\n"
  1329. " \n"
  1330. " /* Comment after empty line */\n"
  1331. " b\n"
  1332. "}"));
  1333. verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
  1334. " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
  1335. " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
  1336. " 0x00, 0x00, 0x00, 0x00}; // comment\n");
  1337. }
  1338. TEST_F(FormatTestComments, LineCommentsAfterRightBrace) {
  1339. EXPECT_EQ("if (true) { // comment about branch\n"
  1340. " // comment about f\n"
  1341. " f();\n"
  1342. "}",
  1343. format("if (true) { // comment about branch\n"
  1344. " // comment about f\n"
  1345. " f();\n"
  1346. "}",
  1347. getLLVMStyleWithColumns(80)));
  1348. EXPECT_EQ("if (1) { // if line 1\n"
  1349. " // if line 2\n"
  1350. " // if line 3\n"
  1351. " // f line 1\n"
  1352. " // f line 2\n"
  1353. " f();\n"
  1354. "} else { // else line 1\n"
  1355. " // else line 2\n"
  1356. " // else line 3\n"
  1357. " // g line 1\n"
  1358. " g();\n"
  1359. "}",
  1360. format("if (1) { // if line 1\n"
  1361. " // if line 2\n"
  1362. " // if line 3\n"
  1363. " // f line 1\n"
  1364. " // f line 2\n"
  1365. " f();\n"
  1366. "} else { // else line 1\n"
  1367. " // else line 2\n"
  1368. " // else line 3\n"
  1369. " // g line 1\n"
  1370. " g();\n"
  1371. "}"));
  1372. EXPECT_EQ("do { // line 1\n"
  1373. " // line 2\n"
  1374. " // line 3\n"
  1375. " f();\n"
  1376. "} while (true);",
  1377. format("do { // line 1\n"
  1378. " // line 2\n"
  1379. " // line 3\n"
  1380. " f();\n"
  1381. "} while (true);",
  1382. getLLVMStyleWithColumns(80)));
  1383. EXPECT_EQ("while (a < b) { // line 1\n"
  1384. " // line 2\n"
  1385. " // line 3\n"
  1386. " f();\n"
  1387. "}",
  1388. format("while (a < b) {// line 1\n"
  1389. " // line 2\n"
  1390. " // line 3\n"
  1391. " f();\n"
  1392. "}",
  1393. getLLVMStyleWithColumns(80)));
  1394. }
  1395. TEST_F(FormatTestComments, ReflowsComments) {
  1396. // Break a long line and reflow with the full next line.
  1397. EXPECT_EQ("// long long long\n"
  1398. "// long long",
  1399. format("// long long long long\n"
  1400. "// long",
  1401. getLLVMStyleWithColumns(20)));
  1402. // Keep the trailing newline while reflowing.
  1403. EXPECT_EQ("// long long long\n"
  1404. "// long long\n",
  1405. format("// long long long long\n"
  1406. "// long\n",
  1407. getLLVMStyleWithColumns(20)));
  1408. // Break a long line and reflow with a part of the next line.
  1409. EXPECT_EQ("// long long long\n"
  1410. "// long long\n"
  1411. "// long_long",
  1412. format("// long long long long\n"
  1413. "// long long_long",
  1414. getLLVMStyleWithColumns(20)));
  1415. // Break but do not reflow if the first word from the next line is too long.
  1416. EXPECT_EQ("// long long long\n"
  1417. "// long\n"
  1418. "// long_long_long\n",
  1419. format("// long long long long\n"
  1420. "// long_long_long\n",
  1421. getLLVMStyleWithColumns(20)));
  1422. // Don't break or reflow short lines.
  1423. verifyFormat("// long\n"
  1424. "// long long long lo\n"
  1425. "// long long long lo\n"
  1426. "// long",
  1427. getLLVMStyleWithColumns(20));
  1428. // Keep prefixes and decorations while reflowing.
  1429. EXPECT_EQ("/// long long long\n"
  1430. "/// long long\n",
  1431. format("/// long long long long\n"
  1432. "/// long\n",
  1433. getLLVMStyleWithColumns(20)));
  1434. EXPECT_EQ("//! long long long\n"
  1435. "//! long long\n",
  1436. format("//! long long long long\n"
  1437. "//! long\n",
  1438. getLLVMStyleWithColumns(20)));
  1439. EXPECT_EQ("/* long long long\n"
  1440. " * long long */",
  1441. format("/* long long long long\n"
  1442. " * long */",
  1443. getLLVMStyleWithColumns(20)));
  1444. EXPECT_EQ("///< long long long\n"
  1445. "///< long long\n",
  1446. format("///< long long long long\n"
  1447. "///< long\n",
  1448. getLLVMStyleWithColumns(20)));
  1449. EXPECT_EQ("//!< long long long\n"
  1450. "//!< long long\n",
  1451. format("//!< long long long long\n"
  1452. "//!< long\n",
  1453. getLLVMStyleWithColumns(20)));
  1454. // Don't bring leading whitespace up while reflowing.
  1455. EXPECT_EQ("/* long long long\n"
  1456. " * long long long\n"
  1457. " */",
  1458. format("/* long long long long\n"
  1459. " * long long\n"
  1460. " */",
  1461. getLLVMStyleWithColumns(20)));
  1462. // Reflow the last line of a block comment with its trailing '*/'.
  1463. EXPECT_EQ("/* long long long\n"
  1464. " long long */",
  1465. format("/* long long long long\n"
  1466. " long */",
  1467. getLLVMStyleWithColumns(20)));
  1468. // Reflow two short lines; keep the postfix of the last one.
  1469. EXPECT_EQ("/* long long long\n"
  1470. " * long long long */",
  1471. format("/* long long long long\n"
  1472. " * long\n"
  1473. " * long */",
  1474. getLLVMStyleWithColumns(20)));
  1475. // Put the postfix of the last short reflow line on a newline if it doesn't
  1476. // fit.
  1477. EXPECT_EQ("/* long long long\n"
  1478. " * long long longg\n"
  1479. " */",
  1480. format("/* long long long long\n"
  1481. " * long\n"
  1482. " * longg */",
  1483. getLLVMStyleWithColumns(20)));
  1484. // Reflow lines with leading whitespace.
  1485. EXPECT_EQ("{\n"
  1486. " /*\n"
  1487. " * long long long\n"
  1488. " * long long long\n"
  1489. " * long long long\n"
  1490. " */\n"
  1491. "}",
  1492. format("{\n"
  1493. "/*\n"
  1494. " * long long long long\n"
  1495. " * long\n"
  1496. " * long long long long\n"
  1497. " */\n"
  1498. "}",
  1499. getLLVMStyleWithColumns(20)));
  1500. // Break single line block comments that are first in the line with ' *'
  1501. // decoration.
  1502. EXPECT_EQ("/* long long long\n"
  1503. " * long */",
  1504. format("/* long long long long */", getLLVMStyleWithColumns(20)));
  1505. // Break single line block comment that are not first in the line with ' '
  1506. // decoration.
  1507. EXPECT_EQ("int i; /* long long\n"
  1508. " long */",
  1509. format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
  1510. // Reflow a line that goes just over the column limit.
  1511. EXPECT_EQ("// long long long\n"
  1512. "// lon long",
  1513. format("// long long long lon\n"
  1514. "// long",
  1515. getLLVMStyleWithColumns(20)));
  1516. // Stop reflowing if the next line has a different indentation than the
  1517. // previous line.
  1518. EXPECT_EQ("// long long long\n"
  1519. "// long\n"
  1520. "// long long\n"
  1521. "// long",
  1522. format("// long long long long\n"
  1523. "// long long\n"
  1524. "// long",
  1525. getLLVMStyleWithColumns(20)));
  1526. // Reflow into the last part of a really long line that has been broken into
  1527. // multiple lines.
  1528. EXPECT_EQ("// long long long\n"
  1529. "// long long long\n"
  1530. "// long long long\n",
  1531. format("// long long long long long long long long\n"
  1532. "// long\n",
  1533. getLLVMStyleWithColumns(20)));
  1534. // Break the first line, then reflow the beginning of the second and third
  1535. // line up.
  1536. EXPECT_EQ("// long long long\n"
  1537. "// lon1 lon2 lon2\n"
  1538. "// lon2 lon3 lon3",
  1539. format("// long long long lon1\n"
  1540. "// lon2 lon2 lon2\n"
  1541. "// lon3 lon3",
  1542. getLLVMStyleWithColumns(20)));
  1543. // Reflow the beginning of the second line, then break the rest.
  1544. EXPECT_EQ("// long long long\n"
  1545. "// lon1 lon2 lon2\n"
  1546. "// lon2 lon2 lon2\n"
  1547. "// lon3",
  1548. format("// long long long lon1\n"
  1549. "// lon2 lon2 lon2 lon2 lon2 lon3",
  1550. getLLVMStyleWithColumns(20)));
  1551. // Shrink the first line, then reflow the second line up.
  1552. EXPECT_EQ("// long long long", format("// long long\n"
  1553. "// long",
  1554. getLLVMStyleWithColumns(20)));
  1555. // Don't shrink leading whitespace.
  1556. EXPECT_EQ("int i; /// a",
  1557. format("int i; /// a", getLLVMStyleWithColumns(20)));
  1558. // Shrink trailing whitespace if there is no postfix and reflow.
  1559. EXPECT_EQ("// long long long\n"
  1560. "// long long",
  1561. format("// long long long long \n"
  1562. "// long",
  1563. getLLVMStyleWithColumns(20)));
  1564. // Shrink trailing whitespace to a single one if there is postfix.
  1565. EXPECT_EQ("/* long long long */",
  1566. format("/* long long long */", getLLVMStyleWithColumns(20)));
  1567. // Break a block comment postfix if exceeding the line limit.
  1568. EXPECT_EQ("/* long\n"
  1569. " */",
  1570. format("/* long */", getLLVMStyleWithColumns(20)));
  1571. // Reflow indented comments.
  1572. EXPECT_EQ("{\n"
  1573. " // long long long\n"
  1574. " // long long\n"
  1575. " int i; /* long lon\n"
  1576. " g long\n"
  1577. " */\n"
  1578. "}",
  1579. format("{\n"
  1580. " // long long long long\n"
  1581. " // long\n"
  1582. " int i; /* long lon g\n"
  1583. " long */\n"
  1584. "}",
  1585. getLLVMStyleWithColumns(20)));
  1586. // Don't realign trailing comments after reflow has happened.
  1587. EXPECT_EQ("// long long long\n"
  1588. "// long long\n"
  1589. "long i; // long",
  1590. format("// long long long long\n"
  1591. "// long\n"
  1592. "long i; // long",
  1593. getLLVMStyleWithColumns(20)));
  1594. EXPECT_EQ("// long long long\n"
  1595. "// longng long long\n"
  1596. "// long lo",
  1597. format("// long long long longng\n"
  1598. "// long long long\n"
  1599. "// lo",
  1600. getLLVMStyleWithColumns(20)));
  1601. // Reflow lines after a broken line.
  1602. EXPECT_EQ("int a; // Trailing\n"
  1603. " // comment on\n"
  1604. " // 2 or 3\n"
  1605. " // lines.\n",
  1606. format("int a; // Trailing comment\n"
  1607. " // on 2\n"
  1608. " // or 3\n"
  1609. " // lines.\n",
  1610. getLLVMStyleWithColumns(20)));
  1611. EXPECT_EQ("/// This long line\n"
  1612. "/// gets reflown.\n",
  1613. format("/// This long line gets\n"
  1614. "/// reflown.\n",
  1615. getLLVMStyleWithColumns(20)));
  1616. EXPECT_EQ("//! This long line\n"
  1617. "//! gets reflown.\n",
  1618. format(" //! This long line gets\n"
  1619. " //! reflown.\n",
  1620. getLLVMStyleWithColumns(20)));
  1621. EXPECT_EQ("/* This long line\n"
  1622. " * gets reflown.\n"
  1623. " */\n",
  1624. format("/* This long line gets\n"
  1625. " * reflown.\n"
  1626. " */\n",
  1627. getLLVMStyleWithColumns(20)));
  1628. // Reflow after indentation makes a line too long.
  1629. EXPECT_EQ("{\n"
  1630. " // long long long\n"
  1631. " // lo long\n"
  1632. "}\n",
  1633. format("{\n"
  1634. "// long long long lo\n"
  1635. "// long\n"
  1636. "}\n",
  1637. getLLVMStyleWithColumns(20)));
  1638. // Break and reflow multiple lines.
  1639. EXPECT_EQ("/*\n"
  1640. " * Reflow the end of\n"
  1641. " * line by 11 22 33\n"
  1642. " * 4.\n"
  1643. " */\n",
  1644. format("/*\n"
  1645. " * Reflow the end of line\n"
  1646. " * by\n"
  1647. " * 11\n"
  1648. " * 22\n"
  1649. " * 33\n"
  1650. " * 4.\n"
  1651. " */\n",
  1652. getLLVMStyleWithColumns(20)));
  1653. EXPECT_EQ("/// First line gets\n"
  1654. "/// broken. Second\n"
  1655. "/// line gets\n"
  1656. "/// reflown and\n"
  1657. "/// broken. Third\n"
  1658. "/// gets reflown.\n",
  1659. format("/// First line gets broken.\n"
  1660. "/// Second line gets reflown and broken.\n"
  1661. "/// Third gets reflown.\n",
  1662. getLLVMStyleWithColumns(20)));
  1663. EXPECT_EQ("int i; // first long\n"
  1664. " // long snd\n"
  1665. " // long.\n",
  1666. format("int i; // first long long\n"
  1667. " // snd long.\n",
  1668. getLLVMStyleWithColumns(20)));
  1669. EXPECT_EQ("{\n"
  1670. " // first long line\n"
  1671. " // line second\n"
  1672. " // long line line\n"
  1673. " // third long line\n"
  1674. " // line\n"
  1675. "}\n",
  1676. format("{\n"
  1677. " // first long line line\n"
  1678. " // second long line line\n"
  1679. " // third long line line\n"
  1680. "}\n",
  1681. getLLVMStyleWithColumns(20)));
  1682. EXPECT_EQ("int i; /* first line\n"
  1683. " * second\n"
  1684. " * line third\n"
  1685. " * line\n"
  1686. " */",
  1687. format("int i; /* first line\n"
  1688. " * second line\n"
  1689. " * third line\n"
  1690. " */",
  1691. getLLVMStyleWithColumns(20)));
  1692. // Reflow the last two lines of a section that starts with a line having
  1693. // different indentation.
  1694. EXPECT_EQ(
  1695. "// long\n"
  1696. "// long long long\n"
  1697. "// long long",
  1698. format("// long\n"
  1699. "// long long long long\n"
  1700. "// long",
  1701. getLLVMStyleWithColumns(20)));
  1702. // Keep the block comment endling '*/' while reflowing.
  1703. EXPECT_EQ("/* Long long long\n"
  1704. " * line short */\n",
  1705. format("/* Long long long line\n"
  1706. " * short */\n",
  1707. getLLVMStyleWithColumns(20)));
  1708. // Don't reflow between separate blocks of comments.
  1709. EXPECT_EQ("/* First comment\n"
  1710. " * block will */\n"
  1711. "/* Snd\n"
  1712. " */\n",
  1713. format("/* First comment block\n"
  1714. " * will */\n"
  1715. "/* Snd\n"
  1716. " */\n",
  1717. getLLVMStyleWithColumns(20)));
  1718. // Don't reflow across blank comment lines.
  1719. EXPECT_EQ("int i; // This long\n"
  1720. " // line gets\n"
  1721. " // broken.\n"
  1722. " //\n"
  1723. " // keep.\n",
  1724. format("int i; // This long line gets broken.\n"
  1725. " // \n"
  1726. " // keep.\n",
  1727. getLLVMStyleWithColumns(20)));
  1728. EXPECT_EQ("{\n"
  1729. " /// long long long\n"
  1730. " /// long long\n"
  1731. " ///\n"
  1732. " /// long\n"
  1733. "}",
  1734. format("{\n"
  1735. " /// long long long long\n"
  1736. " /// long\n"
  1737. " ///\n"
  1738. " /// long\n"
  1739. "}",
  1740. getLLVMStyleWithColumns(20)));
  1741. EXPECT_EQ("//! long long long\n"
  1742. "//! long\n"
  1743. "\n"
  1744. "//! long",
  1745. format("//! long long long long\n"
  1746. "\n"
  1747. "//! long",
  1748. getLLVMStyleWithColumns(20)));
  1749. EXPECT_EQ("/* long long long\n"
  1750. " long\n"
  1751. "\n"
  1752. " long */",
  1753. format("/* long long long long\n"
  1754. "\n"
  1755. " long */",
  1756. getLLVMStyleWithColumns(20)));
  1757. EXPECT_EQ("/* long long long\n"
  1758. " * long\n"
  1759. " *\n"
  1760. " * long */",
  1761. format("/* long long long long\n"
  1762. " *\n"
  1763. " * long */",
  1764. getLLVMStyleWithColumns(20)));
  1765. // Don't reflow lines having content that is a single character.
  1766. EXPECT_EQ("// long long long\n"
  1767. "// long\n"
  1768. "// l",
  1769. format("// long long long long\n"
  1770. "// l",
  1771. getLLVMStyleWithColumns(20)));
  1772. // Don't reflow lines starting with two punctuation characters.
  1773. EXPECT_EQ("// long long long\n"
  1774. "// long\n"
  1775. "// ... --- ...",
  1776. format(
  1777. "// long long long long\n"
  1778. "// ... --- ...",
  1779. getLLVMStyleWithColumns(20)));
  1780. // Don't reflow lines starting with '@'.
  1781. EXPECT_EQ("// long long long\n"
  1782. "// long\n"
  1783. "// @param arg",
  1784. format("// long long long long\n"
  1785. "// @param arg",
  1786. getLLVMStyleWithColumns(20)));
  1787. // Don't reflow lines starting with 'TODO'.
  1788. EXPECT_EQ("// long long long\n"
  1789. "// long\n"
  1790. "// TODO: long",
  1791. format("// long long long long\n"
  1792. "// TODO: long",
  1793. getLLVMStyleWithColumns(20)));
  1794. // Don't reflow lines starting with 'FIXME'.
  1795. EXPECT_EQ("// long long long\n"
  1796. "// long\n"
  1797. "// FIXME: long",
  1798. format("// long long long long\n"
  1799. "// FIXME: long",
  1800. getLLVMStyleWithColumns(20)));
  1801. // Don't reflow lines starting with 'XXX'.
  1802. EXPECT_EQ("// long long long\n"
  1803. "// long\n"
  1804. "// XXX: long",
  1805. format("// long long long long\n"
  1806. "// XXX: long",
  1807. getLLVMStyleWithColumns(20)));
  1808. // Don't reflow comment pragmas.
  1809. EXPECT_EQ("// long long long\n"
  1810. "// long\n"
  1811. "// IWYU pragma:",
  1812. format("// long long long long\n"
  1813. "// IWYU pragma:",
  1814. getLLVMStyleWithColumns(20)));
  1815. EXPECT_EQ("/* long long long\n"
  1816. " * long\n"
  1817. " * IWYU pragma:\n"
  1818. " */",
  1819. format("/* long long long long\n"
  1820. " * IWYU pragma:\n"
  1821. " */",
  1822. getLLVMStyleWithColumns(20)));
  1823. // Reflow lines that have a non-punctuation character among their first 2
  1824. // characters.
  1825. EXPECT_EQ("// long long long\n"
  1826. "// long 'long'",
  1827. format(
  1828. "// long long long long\n"
  1829. "// 'long'",
  1830. getLLVMStyleWithColumns(20)));
  1831. // Don't reflow between separate blocks of comments.
  1832. EXPECT_EQ("/* First comment\n"
  1833. " * block will */\n"
  1834. "/* Snd\n"
  1835. " */\n",
  1836. format("/* First comment block\n"
  1837. " * will */\n"
  1838. "/* Snd\n"
  1839. " */\n",
  1840. getLLVMStyleWithColumns(20)));
  1841. // Don't reflow lines having different indentation.
  1842. EXPECT_EQ("// long long long\n"
  1843. "// long\n"
  1844. "// long",
  1845. format("// long long long long\n"
  1846. "// long",
  1847. getLLVMStyleWithColumns(20)));
  1848. // Don't reflow separate bullets in list
  1849. EXPECT_EQ("// - long long long\n"
  1850. "// long\n"
  1851. "// - long",
  1852. format("// - long long long long\n"
  1853. "// - long",
  1854. getLLVMStyleWithColumns(20)));
  1855. EXPECT_EQ("// * long long long\n"
  1856. "// long\n"
  1857. "// * long",
  1858. format("// * long long long long\n"
  1859. "// * long",
  1860. getLLVMStyleWithColumns(20)));
  1861. EXPECT_EQ("// + long long long\n"
  1862. "// long\n"
  1863. "// + long",
  1864. format("// + long long long long\n"
  1865. "// + long",
  1866. getLLVMStyleWithColumns(20)));
  1867. EXPECT_EQ("// 1. long long long\n"
  1868. "// long\n"
  1869. "// 2. long",
  1870. format("// 1. long long long long\n"
  1871. "// 2. long",
  1872. getLLVMStyleWithColumns(20)));
  1873. EXPECT_EQ("// -# long long long\n"
  1874. "// long\n"
  1875. "// -# long",
  1876. format("// -# long long long long\n"
  1877. "// -# long",
  1878. getLLVMStyleWithColumns(20)));
  1879. EXPECT_EQ("// - long long long\n"
  1880. "// long long long\n"
  1881. "// - long",
  1882. format("// - long long long long\n"
  1883. "// long long\n"
  1884. "// - long",
  1885. getLLVMStyleWithColumns(20)));
  1886. EXPECT_EQ("// - long long long\n"
  1887. "// long long long\n"
  1888. "// long\n"
  1889. "// - long",
  1890. format("// - long long long long\n"
  1891. "// long long long\n"
  1892. "// - long",
  1893. getLLVMStyleWithColumns(20)));
  1894. // Large number (>2 digits) are not list items
  1895. EXPECT_EQ("// long long long\n"
  1896. "// long 1024. long.",
  1897. format("// long long long long\n"
  1898. "// 1024. long.",
  1899. getLLVMStyleWithColumns(20)));
  1900. // Do not break before number, to avoid introducing a non-reflowable doxygen
  1901. // list item.
  1902. EXPECT_EQ("// long long\n"
  1903. "// long 10. long.",
  1904. format("// long long long 10.\n"
  1905. "// long.",
  1906. getLLVMStyleWithColumns(20)));
  1907. // Don't break or reflow after implicit string literals.
  1908. verifyFormat("#include <t> // l l l\n"
  1909. " // l",
  1910. getLLVMStyleWithColumns(20));
  1911. // Don't break or reflow comments on import lines.
  1912. EXPECT_EQ("#include \"t\" /* l l l\n"
  1913. " * l */",
  1914. format("#include \"t\" /* l l l\n"
  1915. " * l */",
  1916. getLLVMStyleWithColumns(20)));
  1917. // Don't reflow between different trailing comment sections.
  1918. EXPECT_EQ("int i; // long long\n"
  1919. " // long\n"
  1920. "int j; // long long\n"
  1921. " // long\n",
  1922. format("int i; // long long long\n"
  1923. "int j; // long long long\n",
  1924. getLLVMStyleWithColumns(20)));
  1925. // Don't reflow if the first word on the next line is longer than the
  1926. // available space at current line.
  1927. EXPECT_EQ("int i; // trigger\n"
  1928. " // reflow\n"
  1929. " // longsec\n",
  1930. format("int i; // trigger reflow\n"
  1931. " // longsec\n",
  1932. getLLVMStyleWithColumns(20)));
  1933. // Keep empty comment lines.
  1934. EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
  1935. EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
  1936. EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
  1937. EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
  1938. EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
  1939. }
  1940. TEST_F(FormatTestComments, IgnoresIf0Contents) {
  1941. EXPECT_EQ("#if 0\n"
  1942. "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
  1943. "#endif\n"
  1944. "void f() {}",
  1945. format("#if 0\n"
  1946. "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
  1947. "#endif\n"
  1948. "void f( ) { }"));
  1949. EXPECT_EQ("#if false\n"
  1950. "void f( ) { }\n"
  1951. "#endif\n"
  1952. "void g() {}\n",
  1953. format("#if false\n"
  1954. "void f( ) { }\n"
  1955. "#endif\n"
  1956. "void g( ) { }\n"));
  1957. EXPECT_EQ("enum E {\n"
  1958. " One,\n"
  1959. " Two,\n"
  1960. "#if 0\n"
  1961. "Three,\n"
  1962. " Four,\n"
  1963. "#endif\n"
  1964. " Five\n"
  1965. "};",
  1966. format("enum E {\n"
  1967. " One,Two,\n"
  1968. "#if 0\n"
  1969. "Three,\n"
  1970. " Four,\n"
  1971. "#endif\n"
  1972. " Five};"));
  1973. EXPECT_EQ("enum F {\n"
  1974. " One,\n"
  1975. "#if 1\n"
  1976. " Two,\n"
  1977. "#if 0\n"
  1978. "Three,\n"
  1979. " Four,\n"
  1980. "#endif\n"
  1981. " Five\n"
  1982. "#endif\n"
  1983. "};",
  1984. format("enum F {\n"
  1985. "One,\n"
  1986. "#if 1\n"
  1987. "Two,\n"
  1988. "#if 0\n"
  1989. "Three,\n"
  1990. " Four,\n"
  1991. "#endif\n"
  1992. "Five\n"
  1993. "#endif\n"
  1994. "};"));
  1995. EXPECT_EQ("enum G {\n"
  1996. " One,\n"
  1997. "#if 0\n"
  1998. "Two,\n"
  1999. "#else\n"
  2000. " Three,\n"
  2001. "#endif\n"
  2002. " Four\n"
  2003. "};",
  2004. format("enum G {\n"
  2005. "One,\n"
  2006. "#if 0\n"
  2007. "Two,\n"
  2008. "#else\n"
  2009. "Three,\n"
  2010. "#endif\n"
  2011. "Four\n"
  2012. "};"));
  2013. EXPECT_EQ("enum H {\n"
  2014. " One,\n"
  2015. "#if 0\n"
  2016. "#ifdef Q\n"
  2017. "Two,\n"
  2018. "#else\n"
  2019. "Three,\n"
  2020. "#endif\n"
  2021. "#endif\n"
  2022. " Four\n"
  2023. "};",
  2024. format("enum H {\n"
  2025. "One,\n"
  2026. "#if 0\n"
  2027. "#ifdef Q\n"
  2028. "Two,\n"
  2029. "#else\n"
  2030. "Three,\n"
  2031. "#endif\n"
  2032. "#endif\n"
  2033. "Four\n"
  2034. "};"));
  2035. EXPECT_EQ("enum I {\n"
  2036. " One,\n"
  2037. "#if /* test */ 0 || 1\n"
  2038. "Two,\n"
  2039. "Three,\n"
  2040. "#endif\n"
  2041. " Four\n"
  2042. "};",
  2043. format("enum I {\n"
  2044. "One,\n"
  2045. "#if /* test */ 0 || 1\n"
  2046. "Two,\n"
  2047. "Three,\n"
  2048. "#endif\n"
  2049. "Four\n"
  2050. "};"));
  2051. EXPECT_EQ("enum J {\n"
  2052. " One,\n"
  2053. "#if 0\n"
  2054. "#if 0\n"
  2055. "Two,\n"
  2056. "#else\n"
  2057. "Three,\n"
  2058. "#endif\n"
  2059. "Four,\n"
  2060. "#endif\n"
  2061. " Five\n"
  2062. "};",
  2063. format("enum J {\n"
  2064. "One,\n"
  2065. "#if 0\n"
  2066. "#if 0\n"
  2067. "Two,\n"
  2068. "#else\n"
  2069. "Three,\n"
  2070. "#endif\n"
  2071. "Four,\n"
  2072. "#endif\n"
  2073. "Five\n"
  2074. "};"));
  2075. // Ignore stuff in SWIG-blocks.
  2076. EXPECT_EQ("#ifdef SWIG\n"
  2077. "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
  2078. "#endif\n"
  2079. "void f() {}",
  2080. format("#ifdef SWIG\n"
  2081. "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
  2082. "#endif\n"
  2083. "void f( ) { }"));
  2084. EXPECT_EQ("#ifndef SWIG\n"
  2085. "void f() {}\n"
  2086. "#endif",
  2087. format("#ifndef SWIG\n"
  2088. "void f( ) { }\n"
  2089. "#endif"));
  2090. }
  2091. TEST_F(FormatTestComments, DontCrashOnBlockComments) {
  2092. EXPECT_EQ(
  2093. "int xxxxxxxxx; /* "
  2094. "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
  2095. "zzzzzz\n"
  2096. "0*/",
  2097. format("int xxxxxxxxx; /* "
  2098. "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
  2099. "0*/"));
  2100. }
  2101. TEST_F(FormatTestComments, BlockCommentsInControlLoops) {
  2102. verifyFormat("if (0) /* a comment in a strange place */ {\n"
  2103. " f();\n"
  2104. "}");
  2105. verifyFormat("if (0) /* a comment in a strange place */ {\n"
  2106. " f();\n"
  2107. "} /* another comment */ else /* comment #3 */ {\n"
  2108. " g();\n"
  2109. "}");
  2110. verifyFormat("while (0) /* a comment in a strange place */ {\n"
  2111. " f();\n"
  2112. "}");
  2113. verifyFormat("for (;;) /* a comment in a strange place */ {\n"
  2114. " f();\n"
  2115. "}");
  2116. verifyFormat("do /* a comment in a strange place */ {\n"
  2117. " f();\n"
  2118. "} /* another comment */ while (0);");
  2119. }
  2120. TEST_F(FormatTestComments, BlockComments) {
  2121. EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
  2122. format("/* *//* */ /* */\n/* *//* */ /* */"));
  2123. EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
  2124. EXPECT_EQ("#define A /*123*/ \\\n"
  2125. " b\n"
  2126. "/* */\n"
  2127. "someCall(\n"
  2128. " parameter);",
  2129. format("#define A /*123*/ b\n"
  2130. "/* */\n"
  2131. "someCall(parameter);",
  2132. getLLVMStyleWithColumns(15)));
  2133. EXPECT_EQ("#define A\n"
  2134. "/* */ someCall(\n"
  2135. " parameter);",
  2136. format("#define A\n"
  2137. "/* */someCall(parameter);",
  2138. getLLVMStyleWithColumns(15)));
  2139. EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
  2140. EXPECT_EQ("/*\n"
  2141. " *\n"
  2142. " * aaaaaa\n"
  2143. " * aaaaaa\n"
  2144. " */",
  2145. format("/*\n"
  2146. "*\n"
  2147. " * aaaaaa aaaaaa\n"
  2148. "*/",
  2149. getLLVMStyleWithColumns(10)));
  2150. EXPECT_EQ("/*\n"
  2151. "**\n"
  2152. "* aaaaaa\n"
  2153. "*aaaaaa\n"
  2154. "*/",
  2155. format("/*\n"
  2156. "**\n"
  2157. "* aaaaaa aaaaaa\n"
  2158. "*/",
  2159. getLLVMStyleWithColumns(10)));
  2160. EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
  2161. " /* line 1\n"
  2162. " bbbbbbbbbbbb */\n"
  2163. " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
  2164. format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
  2165. " /* line 1\n"
  2166. " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
  2167. getLLVMStyleWithColumns(50)));
  2168. FormatStyle NoBinPacking = getLLVMStyle();
  2169. NoBinPacking.BinPackParameters = false;
  2170. EXPECT_EQ("someFunction(1, /* comment 1 */\n"
  2171. " 2, /* comment 2 */\n"
  2172. " 3, /* comment 3 */\n"
  2173. " aaaa,\n"
  2174. " bbbb);",
  2175. format("someFunction (1, /* comment 1 */\n"
  2176. " 2, /* comment 2 */ \n"
  2177. " 3, /* comment 3 */\n"
  2178. "aaaa, bbbb );",
  2179. NoBinPacking));
  2180. verifyFormat(
  2181. "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
  2182. " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
  2183. EXPECT_EQ(
  2184. "bool aaaaaaaaaaaaa = /* trailing comment */\n"
  2185. " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
  2186. " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
  2187. format(
  2188. "bool aaaaaaaaaaaaa = /* trailing comment */\n"
  2189. " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
  2190. " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
  2191. EXPECT_EQ(
  2192. "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
  2193. "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
  2194. "int cccccccccccccccccccccccccccccc; /* comment */\n",
  2195. format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
  2196. "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
  2197. "int cccccccccccccccccccccccccccccc; /* comment */\n"));
  2198. verifyFormat("void f(int * /* unused */) {}");
  2199. EXPECT_EQ("/*\n"
  2200. " **\n"
  2201. " */",
  2202. format("/*\n"
  2203. " **\n"
  2204. " */"));
  2205. EXPECT_EQ("/*\n"
  2206. " *q\n"
  2207. " */",
  2208. format("/*\n"
  2209. " *q\n"
  2210. " */"));
  2211. EXPECT_EQ("/*\n"
  2212. " * q\n"
  2213. " */",
  2214. format("/*\n"
  2215. " * q\n"
  2216. " */"));
  2217. EXPECT_EQ("/*\n"
  2218. " **/",
  2219. format("/*\n"
  2220. " **/"));
  2221. EXPECT_EQ("/*\n"
  2222. " ***/",
  2223. format("/*\n"
  2224. " ***/"));
  2225. }
  2226. TEST_F(FormatTestComments, BlockCommentsInMacros) {
  2227. EXPECT_EQ("#define A \\\n"
  2228. " { \\\n"
  2229. " /* one line */ \\\n"
  2230. " someCall();",
  2231. format("#define A { \\\n"
  2232. " /* one line */ \\\n"
  2233. " someCall();",
  2234. getLLVMStyleWithColumns(20)));
  2235. EXPECT_EQ("#define A \\\n"
  2236. " { \\\n"
  2237. " /* previous */ \\\n"
  2238. " /* one line */ \\\n"
  2239. " someCall();",
  2240. format("#define A { \\\n"
  2241. " /* previous */ \\\n"
  2242. " /* one line */ \\\n"
  2243. " someCall();",
  2244. getLLVMStyleWithColumns(20)));
  2245. }
  2246. TEST_F(FormatTestComments, BlockCommentsAtEndOfLine) {
  2247. EXPECT_EQ("a = {\n"
  2248. " 1111 /* */\n"
  2249. "};",
  2250. format("a = {1111 /* */\n"
  2251. "};",
  2252. getLLVMStyleWithColumns(15)));
  2253. EXPECT_EQ("a = {\n"
  2254. " 1111 /* */\n"
  2255. "};",
  2256. format("a = {1111 /* */\n"
  2257. "};",
  2258. getLLVMStyleWithColumns(15)));
  2259. EXPECT_EQ("a = {\n"
  2260. " 1111 /* a\n"
  2261. " */\n"
  2262. "};",
  2263. format("a = {1111 /* a */\n"
  2264. "};",
  2265. getLLVMStyleWithColumns(15)));
  2266. }
  2267. TEST_F(FormatTestComments, IndentLineCommentsInStartOfBlockAtEndOfFile) {
  2268. verifyFormat("{\n"
  2269. " // a\n"
  2270. " // b");
  2271. }
  2272. TEST_F(FormatTestComments, AlignTrailingComments) {
  2273. EXPECT_EQ("#define MACRO(V) \\\n"
  2274. " V(Rt2) /* one more char */ \\\n"
  2275. " V(Rs) /* than here */ \\\n"
  2276. "/* comment 3 */\n",
  2277. format("#define MACRO(V)\\\n"
  2278. "V(Rt2) /* one more char */ \\\n"
  2279. "V(Rs) /* than here */ \\\n"
  2280. "/* comment 3 */\n",
  2281. getLLVMStyleWithColumns(40)));
  2282. EXPECT_EQ("int i = f(abc, // line 1\n"
  2283. " d, // line 2\n"
  2284. " // line 3\n"
  2285. " b);",
  2286. format("int i = f(abc, // line 1\n"
  2287. " d, // line 2\n"
  2288. " // line 3\n"
  2289. " b);",
  2290. getLLVMStyleWithColumns(40)));
  2291. // Align newly broken trailing comments.
  2292. EXPECT_EQ("int ab; // line\n"
  2293. "int a; // long\n"
  2294. " // long\n",
  2295. format("int ab; // line\n"
  2296. "int a; // long long\n",
  2297. getLLVMStyleWithColumns(15)));
  2298. EXPECT_EQ("int ab; // line\n"
  2299. "int a; // long\n"
  2300. " // long\n"
  2301. " // long",
  2302. format("int ab; // line\n"
  2303. "int a; // long long\n"
  2304. " // long",
  2305. getLLVMStyleWithColumns(15)));
  2306. EXPECT_EQ("int ab; // line\n"
  2307. "int a; // long\n"
  2308. " // long\n"
  2309. "pt c; // long",
  2310. format("int ab; // line\n"
  2311. "int a; // long long\n"
  2312. "pt c; // long",
  2313. getLLVMStyleWithColumns(15)));
  2314. EXPECT_EQ("int ab; // line\n"
  2315. "int a; // long\n"
  2316. " // long\n"
  2317. "\n"
  2318. "// long",
  2319. format("int ab; // line\n"
  2320. "int a; // long long\n"
  2321. "\n"
  2322. "// long",
  2323. getLLVMStyleWithColumns(15)));
  2324. // Don't align newly broken trailing comments if that would put them over the
  2325. // column limit.
  2326. EXPECT_EQ("int i, j; // line 1\n"
  2327. "int k; // line longg\n"
  2328. " // long",
  2329. format("int i, j; // line 1\n"
  2330. "int k; // line longg long",
  2331. getLLVMStyleWithColumns(20)));
  2332. // Always align if ColumnLimit = 0
  2333. EXPECT_EQ("int i, j; // line 1\n"
  2334. "int k; // line longg long",
  2335. format("int i, j; // line 1\n"
  2336. "int k; // line longg long",
  2337. getLLVMStyleWithColumns(0)));
  2338. // Align comment line sections aligned with the next token with the next
  2339. // token.
  2340. EXPECT_EQ("class A {\n"
  2341. "public: // public comment\n"
  2342. " // comment about a\n"
  2343. " int a;\n"
  2344. "};",
  2345. format("class A {\n"
  2346. "public: // public comment\n"
  2347. " // comment about a\n"
  2348. " int a;\n"
  2349. "};",
  2350. getLLVMStyleWithColumns(40)));
  2351. EXPECT_EQ("class A {\n"
  2352. "public: // public comment 1\n"
  2353. " // public comment 2\n"
  2354. " // comment 1 about a\n"
  2355. " // comment 2 about a\n"
  2356. " int a;\n"
  2357. "};",
  2358. format("class A {\n"
  2359. "public: // public comment 1\n"
  2360. " // public comment 2\n"
  2361. " // comment 1 about a\n"
  2362. " // comment 2 about a\n"
  2363. " int a;\n"
  2364. "};",
  2365. getLLVMStyleWithColumns(40)));
  2366. EXPECT_EQ("int f(int n) { // comment line 1 on f\n"
  2367. " // comment line 2 on f\n"
  2368. " // comment line 1 before return\n"
  2369. " // comment line 2 before return\n"
  2370. " return n; // comment line 1 on return\n"
  2371. " // comment line 2 on return\n"
  2372. " // comment line 1 after return\n"
  2373. "}",
  2374. format("int f(int n) { // comment line 1 on f\n"
  2375. " // comment line 2 on f\n"
  2376. " // comment line 1 before return\n"
  2377. " // comment line 2 before return\n"
  2378. " return n; // comment line 1 on return\n"
  2379. " // comment line 2 on return\n"
  2380. " // comment line 1 after return\n"
  2381. "}",
  2382. getLLVMStyleWithColumns(40)));
  2383. EXPECT_EQ("int f(int n) {\n"
  2384. " switch (n) { // comment line 1 on switch\n"
  2385. " // comment line 2 on switch\n"
  2386. " // comment line 1 before case 1\n"
  2387. " // comment line 2 before case 1\n"
  2388. " case 1: // comment line 1 on case 1\n"
  2389. " // comment line 2 on case 1\n"
  2390. " // comment line 1 before return 1\n"
  2391. " // comment line 2 before return 1\n"
  2392. " return 1; // comment line 1 on return 1\n"
  2393. " // comment line 2 on return 1\n"
  2394. " // comment line 1 before default\n"
  2395. " // comment line 2 before default\n"
  2396. " default: // comment line 1 on default\n"
  2397. " // comment line 2 on default\n"
  2398. " // comment line 1 before return 2\n"
  2399. " return 2 * f(n - 1); // comment line 1 on return 2\n"
  2400. " // comment line 2 on return 2\n"
  2401. " // comment line 1 after return\n"
  2402. " // comment line 2 after return\n"
  2403. " }\n"
  2404. "}",
  2405. format("int f(int n) {\n"
  2406. " switch (n) { // comment line 1 on switch\n"
  2407. " // comment line 2 on switch\n"
  2408. " // comment line 1 before case 1\n"
  2409. " // comment line 2 before case 1\n"
  2410. " case 1: // comment line 1 on case 1\n"
  2411. " // comment line 2 on case 1\n"
  2412. " // comment line 1 before return 1\n"
  2413. " // comment line 2 before return 1\n"
  2414. " return 1; // comment line 1 on return 1\n"
  2415. " // comment line 2 on return 1\n"
  2416. " // comment line 1 before default\n"
  2417. " // comment line 2 before default\n"
  2418. " default: // comment line 1 on default\n"
  2419. " // comment line 2 on default\n"
  2420. " // comment line 1 before return 2\n"
  2421. " return 2 * f(n - 1); // comment line 1 on return 2\n"
  2422. " // comment line 2 on return 2\n"
  2423. " // comment line 1 after return\n"
  2424. " // comment line 2 after return\n"
  2425. " }\n"
  2426. "}",
  2427. getLLVMStyleWithColumns(80)));
  2428. // If all the lines in a sequence of line comments are aligned with the next
  2429. // token, the first line belongs to the previous token and the other lines
  2430. // belong to the next token.
  2431. EXPECT_EQ("int a; // line about a\n"
  2432. "long b;",
  2433. format("int a; // line about a\n"
  2434. " long b;",
  2435. getLLVMStyleWithColumns(80)));
  2436. EXPECT_EQ("int a; // line about a\n"
  2437. "// line about b\n"
  2438. "long b;",
  2439. format("int a; // line about a\n"
  2440. " // line about b\n"
  2441. " long b;",
  2442. getLLVMStyleWithColumns(80)));
  2443. EXPECT_EQ("int a; // line about a\n"
  2444. "// line 1 about b\n"
  2445. "// line 2 about b\n"
  2446. "long b;",
  2447. format("int a; // line about a\n"
  2448. " // line 1 about b\n"
  2449. " // line 2 about b\n"
  2450. " long b;",
  2451. getLLVMStyleWithColumns(80)));
  2452. }
  2453. TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {
  2454. EXPECT_EQ("/*\n"
  2455. " */",
  2456. format("/*\n"
  2457. "*/", getLLVMStyle()));
  2458. EXPECT_EQ("/*\n"
  2459. " */",
  2460. format("/*\n"
  2461. " */", getLLVMStyle()));
  2462. EXPECT_EQ("/*\n"
  2463. " */",
  2464. format("/*\n"
  2465. " */", getLLVMStyle()));
  2466. // Align a single line.
  2467. EXPECT_EQ("/*\n"
  2468. " * line */",
  2469. format("/*\n"
  2470. "* line */",
  2471. getLLVMStyle()));
  2472. EXPECT_EQ("/*\n"
  2473. " * line */",
  2474. format("/*\n"
  2475. " * line */",
  2476. getLLVMStyle()));
  2477. EXPECT_EQ("/*\n"
  2478. " * line */",
  2479. format("/*\n"
  2480. " * line */",
  2481. getLLVMStyle()));
  2482. EXPECT_EQ("/*\n"
  2483. " * line */",
  2484. format("/*\n"
  2485. " * line */",
  2486. getLLVMStyle()));
  2487. EXPECT_EQ("/**\n"
  2488. " * line */",
  2489. format("/**\n"
  2490. "* line */",
  2491. getLLVMStyle()));
  2492. EXPECT_EQ("/**\n"
  2493. " * line */",
  2494. format("/**\n"
  2495. " * line */",
  2496. getLLVMStyle()));
  2497. EXPECT_EQ("/**\n"
  2498. " * line */",
  2499. format("/**\n"
  2500. " * line */",
  2501. getLLVMStyle()));
  2502. EXPECT_EQ("/**\n"
  2503. " * line */",
  2504. format("/**\n"
  2505. " * line */",
  2506. getLLVMStyle()));
  2507. EXPECT_EQ("/**\n"
  2508. " * line */",
  2509. format("/**\n"
  2510. " * line */",
  2511. getLLVMStyle()));
  2512. // Align the end '*/' after a line.
  2513. EXPECT_EQ("/*\n"
  2514. " * line\n"
  2515. " */",
  2516. format("/*\n"
  2517. "* line\n"
  2518. "*/", getLLVMStyle()));
  2519. EXPECT_EQ("/*\n"
  2520. " * line\n"
  2521. " */",
  2522. format("/*\n"
  2523. " * line\n"
  2524. " */", getLLVMStyle()));
  2525. EXPECT_EQ("/*\n"
  2526. " * line\n"
  2527. " */",
  2528. format("/*\n"
  2529. " * line\n"
  2530. " */", getLLVMStyle()));
  2531. // Align two lines.
  2532. EXPECT_EQ("/* line 1\n"
  2533. " * line 2 */",
  2534. format("/* line 1\n"
  2535. " * line 2 */",
  2536. getLLVMStyle()));
  2537. EXPECT_EQ("/* line 1\n"
  2538. " * line 2 */",
  2539. format("/* line 1\n"
  2540. "* line 2 */",
  2541. getLLVMStyle()));
  2542. EXPECT_EQ("/* line 1\n"
  2543. " * line 2 */",
  2544. format("/* line 1\n"
  2545. " * line 2 */",
  2546. getLLVMStyle()));
  2547. EXPECT_EQ("/* line 1\n"
  2548. " * line 2 */",
  2549. format("/* line 1\n"
  2550. " * line 2 */",
  2551. getLLVMStyle()));
  2552. EXPECT_EQ("/* line 1\n"
  2553. " * line 2 */",
  2554. format("/* line 1\n"
  2555. " * line 2 */",
  2556. getLLVMStyle()));
  2557. EXPECT_EQ("int i; /* line 1\n"
  2558. " * line 2 */",
  2559. format("int i; /* line 1\n"
  2560. "* line 2 */",
  2561. getLLVMStyle()));
  2562. EXPECT_EQ("int i; /* line 1\n"
  2563. " * line 2 */",
  2564. format("int i; /* line 1\n"
  2565. " * line 2 */",
  2566. getLLVMStyle()));
  2567. EXPECT_EQ("int i; /* line 1\n"
  2568. " * line 2 */",
  2569. format("int i; /* line 1\n"
  2570. " * line 2 */",
  2571. getLLVMStyle()));
  2572. // Align several lines.
  2573. EXPECT_EQ("/* line 1\n"
  2574. " * line 2\n"
  2575. " * line 3 */",
  2576. format("/* line 1\n"
  2577. " * line 2\n"
  2578. "* line 3 */",
  2579. getLLVMStyle()));
  2580. EXPECT_EQ("/* line 1\n"
  2581. " * line 2\n"
  2582. " * line 3 */",
  2583. format("/* line 1\n"
  2584. " * line 2\n"
  2585. "* line 3 */",
  2586. getLLVMStyle()));
  2587. EXPECT_EQ("/*\n"
  2588. "** line 1\n"
  2589. "** line 2\n"
  2590. "*/",
  2591. format("/*\n"
  2592. "** line 1\n"
  2593. " ** line 2\n"
  2594. "*/",
  2595. getLLVMStyle()));
  2596. // Align with different indent after the decorations.
  2597. EXPECT_EQ("/*\n"
  2598. " * line 1\n"
  2599. " * line 2\n"
  2600. " * line 3\n"
  2601. " * line 4\n"
  2602. " */",
  2603. format("/*\n"
  2604. "* line 1\n"
  2605. " * line 2\n"
  2606. " * line 3\n"
  2607. "* line 4\n"
  2608. "*/", getLLVMStyle()));
  2609. // Align empty or blank lines.
  2610. EXPECT_EQ("/**\n"
  2611. " *\n"
  2612. " *\n"
  2613. " *\n"
  2614. " */",
  2615. format("/**\n"
  2616. "* \n"
  2617. " * \n"
  2618. " *\n"
  2619. "*/", getLLVMStyle()));
  2620. // Align while breaking and reflowing.
  2621. EXPECT_EQ("/*\n"
  2622. " * long long long\n"
  2623. " * long long\n"
  2624. " *\n"
  2625. " * long */",
  2626. format("/*\n"
  2627. " * long long long long\n"
  2628. " * long\n"
  2629. " *\n"
  2630. "* long */",
  2631. getLLVMStyleWithColumns(20)));
  2632. }
  2633. TEST_F(FormatTestComments, NonTrailingBlockComments) {
  2634. verifyFormat("const /** comment comment */ A = B;",
  2635. getLLVMStyleWithColumns(40));
  2636. verifyFormat("const /** comment comment comment */ A =\n"
  2637. " B;",
  2638. getLLVMStyleWithColumns(40));
  2639. EXPECT_EQ("const /** comment comment comment\n"
  2640. " comment */\n"
  2641. " A = B;",
  2642. format("const /** comment comment comment comment */\n"
  2643. " A = B;",
  2644. getLLVMStyleWithColumns(40)));
  2645. }
  2646. } // end namespace
  2647. } // end namespace format
  2648. } // end namespace clang