namespace clang {
namespace comments {
-/// A very simple comment parser that extracts just the brief description or
-/// first paragraph.
+/// A very simple comment parser that extracts "a brief description".
+///
+/// Due to a variety of comment styles, it considers the following as "a brief
+/// description", in order of priority:
+/// \li a \\brief or \\short command,
+/// \li the first paragraph,
+/// \li a \\result or \\return or \\returns paragraph.
class BriefParser {
Lexer &L;
} // unnamed namespace
std::string BriefParser::Parse() {
- std::string Paragraph;
+ std::string FirstParagraphOrBrief;
+ std::string ReturnsParagraph;
bool InFirstParagraph = true;
bool InBrief = false;
+ bool InReturns = false;
while (Tok.isNot(tok::eof)) {
if (Tok.is(tok::text)) {
if (InFirstParagraph || InBrief)
- Paragraph += Tok.getText();
+ FirstParagraphOrBrief += Tok.getText();
+ else if (InReturns)
+ ReturnsParagraph += Tok.getText();
ConsumeToken();
continue;
}
if (Tok.is(tok::command)) {
StringRef Name = Tok.getCommandName();
if (Name == "brief" || Name == "short") {
- Paragraph.clear();
+ FirstParagraphOrBrief.clear();
InBrief = true;
ConsumeToken();
continue;
}
+ if (Name == "result" || Name == "return" || Name == "returns") {
+ InReturns = true;
+ ReturnsParagraph += "Returns ";
+ }
// Block commands implicitly start a new paragraph.
if (isBlockCommand(Name)) {
// We found an implicit paragraph end.
if (Tok.is(tok::newline)) {
if (InFirstParagraph || InBrief)
- Paragraph += ' ';
+ FirstParagraphOrBrief += ' ';
+ else if (InReturns)
+ ReturnsParagraph += ' ';
ConsumeToken();
if (Tok.is(tok::newline)) {
ConsumeToken();
// We found a paragraph end.
InFirstParagraph = false;
+ InReturns = false;
if (InBrief)
break;
}
ConsumeToken();
}
- cleanupBrief(Paragraph);
- return Paragraph;
+ cleanupBrief(FirstParagraphOrBrief);
+ if (!FirstParagraphOrBrief.empty())
+ return FirstParagraphOrBrief;
+
+ cleanupBrief(ReturnsParagraph);
+ return ReturnsParagraph;
}
BriefParser::BriefParser(Lexer &L) : L(L)
/// \returns ddd IS_DOXYGEN_END
void isdoxy48(int);
+/// \brief IS_DOXYGEN_START Aaa
+/// \returns bbb IS_DOXYGEN_END
+void isdoxy49(void);
+
+/// \param ccc IS_DOXYGEN_START
+/// \returns ddd IS_DOXYGEN_END
+void isdoxy50(int);
+
#endif
// RUN: rm -rf %t
// CHECK: annotate-comments.cpp:195:6: FunctionDecl=isdoxy45:{{.*}} BriefComment=[Ddd eee. Fff.]
// CHECK: annotate-comments.cpp:205:6: FunctionDecl=isdoxy46:{{.*}} BriefComment=[Ddd eee. Fff.]
// CHECK: annotate-comments.cpp:214:6: FunctionDecl=isdoxy48:{{.*}} BriefComment=[IS_DOXYGEN_START Aaa bbb]
+// CHECK: annotate-comments.cpp:218:6: FunctionDecl=isdoxy49:{{.*}} BriefComment=[IS_DOXYGEN_START Aaa]
+// CHECK: annotate-comments.cpp:222:6: FunctionDecl=isdoxy50:{{.*}} BriefComment=[Returns ddd IS_DOXYGEN_END]