@@ -34,10 +34,20 @@ void commandToMarkup(markup::Paragraph &Out, StringRef Command,
34
34
StringRef Args) {
35
35
Out.appendBoldText (commandMarkerAsString (CommandMarker) + Command.str ());
36
36
Out.appendSpace ();
37
- if (!Args.empty ()) {
38
- Out.appendEmphasizedText (Args.str ());
37
+ if (!Args.empty ())
38
+ Out.appendCode (Args.str ());
39
+ }
40
+
41
+ template <typename T> std::string getArgText (const T *Command) {
42
+ std::string ArgText;
43
+ for (unsigned I = 0 ; I < Command->getNumArgs (); ++I) {
44
+ if (!ArgText.empty ())
45
+ ArgText += " " ;
46
+ ArgText += Command->getArgText (I);
39
47
}
48
+ return ArgText;
40
49
}
50
+
41
51
} // namespace
42
52
43
53
class ParagraphToMarkupDocument
@@ -70,12 +80,7 @@ class ParagraphToMarkupDocument
70
80
void visitInlineCommandComment (const comments::InlineCommandComment *C) {
71
81
72
82
if (C->getNumArgs () > 0 ) {
73
- std::string ArgText;
74
- for (unsigned I = 0 ; I < C->getNumArgs (); ++I) {
75
- if (!ArgText.empty ())
76
- ArgText += " " ;
77
- ArgText += C->getArgText (I);
78
- }
83
+ std::string ArgText = getArgText (C);
79
84
80
85
switch (C->getRenderKind ()) {
81
86
case comments::InlineCommandRenderKind::Monospaced:
@@ -158,10 +163,9 @@ class ParagraphToString
158
163
void visitInlineCommandComment (const comments::InlineCommandComment *C) {
159
164
Out << commandMarkerAsString (C->getCommandMarker ());
160
165
Out << C->getCommandName (Traits);
161
- if (C->getNumArgs () > 0 ) {
162
- for (unsigned I = 0 ; I < C->getNumArgs (); ++I)
163
- Out << " " << C->getArgText (I);
164
- }
166
+ std::string ArgText = getArgText (C);
167
+ if (!ArgText.empty ())
168
+ Out << " " << ArgText;
165
169
Out << " " ;
166
170
}
167
171
@@ -210,16 +214,27 @@ class BlockCommentToMarkupDocument
210
214
Traits)
211
215
.visit (B->getParagraph ());
212
216
break ;
217
+ case comments::CommandTraits::KCI_note:
218
+ case comments::CommandTraits::KCI_warning:
219
+ commandToHeadedParagraph (B);
220
+ break ;
221
+ case comments::CommandTraits::KCI_retval: {
222
+ // The \retval command describes the return value given as its single
223
+ // argument in the corresponding paragraph.
224
+ // Note: We know that we have exactly one argument but not if it has an
225
+ // associated paragraph.
226
+ auto &P = Out.addParagraph ().appendCode (getArgText (B));
227
+ if (B->getParagraph () && !B->getParagraph ()->isWhitespace ()) {
228
+ P.appendText (" - " );
229
+ ParagraphToMarkupDocument (P, Traits).visit (B->getParagraph ());
230
+ }
231
+ return ;
232
+ }
213
233
default : {
214
234
// Some commands have arguments, like \throws.
215
235
// The arguments are not part of the paragraph.
216
236
// We need reconstruct them here.
217
- std::string ArgText;
218
- for (unsigned I = 0 ; I < B->getNumArgs (); ++I) {
219
- if (!ArgText.empty ())
220
- ArgText += " " ;
221
- ArgText += B->getArgText (I);
222
- }
237
+ std::string ArgText = getArgText (B);
223
238
auto &P = Out.addParagraph ();
224
239
commandToMarkup (P, B->getCommandName (Traits), B->getCommandMarker (),
225
240
ArgText);
@@ -262,6 +277,19 @@ class BlockCommentToMarkupDocument
262
277
markup::Document &Out;
263
278
const comments::CommandTraits &Traits;
264
279
StringRef CommentEscapeMarker;
280
+
281
+ // / Emphasize the given command in a paragraph.
282
+ // / Uses the command name with the first letter capitalized as the heading.
283
+ void commandToHeadedParagraph (const comments::BlockCommandComment *B) {
284
+ Out.addRuler ();
285
+ auto &P = Out.addParagraph ();
286
+ std::string Heading = B->getCommandName (Traits).slice (0 , 1 ).upper () +
287
+ B->getCommandName (Traits).drop_front ().str ();
288
+ P.appendBoldText (Heading + " :" );
289
+ P.appendText (" \n " );
290
+ ParagraphToMarkupDocument (P, Traits).visit (B->getParagraph ());
291
+ Out.addRuler ();
292
+ }
265
293
};
266
294
267
295
void SymbolDocCommentVisitor::visitBlockCommandComment (
@@ -282,36 +310,22 @@ void SymbolDocCommentVisitor::visitBlockCommandComment(
282
310
}
283
311
break ;
284
312
case comments::CommandTraits::KCI_retval:
285
- RetvalParagraphs.push_back (B->getParagraph ());
286
- return ;
287
- case comments::CommandTraits::KCI_warning:
288
- WarningParagraphs.push_back (B->getParagraph ());
289
- return ;
290
- case comments::CommandTraits::KCI_note:
291
- NoteParagraphs.push_back (B->getParagraph ());
313
+ // Only consider retval commands having an argument.
314
+ // The argument contains the described return value which is needed to
315
+ // convert it to markup.
316
+ if (B->getNumArgs () == 1 )
317
+ RetvalCommands.push_back (B);
292
318
return ;
293
319
default :
294
320
break ;
295
321
}
296
322
297
- // For all other commands, we store them in the UnhandledCommands map.
323
+ // For all other commands, we store them in the BlockCommands map.
298
324
// This allows us to keep the order of the comments.
299
- UnhandledCommands [CommentPartIndex] = B;
325
+ BlockCommands [CommentPartIndex] = B;
300
326
CommentPartIndex++;
301
327
}
302
328
303
- void SymbolDocCommentVisitor::paragraphsToMarkup (
304
- markup::Document &Out,
305
- const llvm::SmallVectorImpl<const comments::ParagraphComment *> &Paragraphs)
306
- const {
307
- if (Paragraphs.empty ())
308
- return ;
309
-
310
- for (const auto *P : Paragraphs) {
311
- ParagraphToMarkupDocument (Out.addParagraph (), Traits).visit (P);
312
- }
313
- }
314
-
315
329
void SymbolDocCommentVisitor::briefToMarkup (markup::Paragraph &Out) const {
316
330
if (!BriefParagraph)
317
331
return ;
@@ -324,14 +338,6 @@ void SymbolDocCommentVisitor::returnToMarkup(markup::Paragraph &Out) const {
324
338
ParagraphToMarkupDocument (Out, Traits).visit (ReturnParagraph);
325
339
}
326
340
327
- void SymbolDocCommentVisitor::notesToMarkup (markup::Document &Out) const {
328
- paragraphsToMarkup (Out, NoteParagraphs);
329
- }
330
-
331
- void SymbolDocCommentVisitor::warningsToMarkup (markup::Document &Out) const {
332
- paragraphsToMarkup (Out, WarningParagraphs);
333
- }
334
-
335
341
void SymbolDocCommentVisitor::parameterDocToMarkup (
336
342
StringRef ParamName, markup::Paragraph &Out) const {
337
343
if (ParamName.empty ())
@@ -354,7 +360,7 @@ void SymbolDocCommentVisitor::parameterDocToString(
354
360
355
361
void SymbolDocCommentVisitor::docToMarkup (markup::Document &Out) const {
356
362
for (unsigned I = 0 ; I < CommentPartIndex; ++I) {
357
- if (const auto *BC = UnhandledCommands .lookup (I)) {
363
+ if (const auto *BC = BlockCommands .lookup (I)) {
358
364
BlockCommentToMarkupDocument (Out, Traits).visit (BC);
359
365
} else if (const auto *P = FreeParagraphs.lookup (I)) {
360
366
ParagraphToMarkupDocument (Out.addParagraph (), Traits).visit (P);
@@ -382,5 +388,14 @@ void SymbolDocCommentVisitor::templateTypeParmDocToString(
382
388
}
383
389
}
384
390
391
+ void SymbolDocCommentVisitor::retvalsToMarkup (markup::Document &Out) const {
392
+ if (RetvalCommands.empty ())
393
+ return ;
394
+ markup::BulletList &BL = Out.addBulletList ();
395
+ for (const auto *P : RetvalCommands) {
396
+ BlockCommentToMarkupDocument (BL.addItem (), Traits).visit (P);
397
+ }
398
+ }
399
+
385
400
} // namespace clangd
386
401
} // namespace clang
0 commit comments