]> granicus.if.org Git - clang/commitdiff
CommentBriefParser: use \returns if we can't find the \brief or just a plain
authorDmitri Gribenko <gribozavr@gmail.com>
Fri, 20 Jul 2012 17:01:34 +0000 (17:01 +0000)
committerDmitri Gribenko <gribozavr@gmail.com>
Fri, 20 Jul 2012 17:01:34 +0000 (17:01 +0000)
paragraph.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160550 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/CommentBriefParser.h
lib/AST/CommentBriefParser.cpp
test/Index/annotate-comments.cpp

index e343b94643e2a4f28c8ec19c2db95534383a8d43..62fdf6bdc4123c2342a9b705bf007550a6d449de 100644 (file)
 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;
 
index a6bf33edd4118052b443691eeafa3bf091577cec..7b7e8d5965787283f0a91b515b7b304fce0d66a7 100644 (file)
@@ -53,14 +53,18 @@ bool isBlockCommand(StringRef Name) {
 } // 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;
     }
@@ -68,11 +72,15 @@ std::string BriefParser::Parse() {
     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.
@@ -84,13 +92,16 @@ std::string BriefParser::Parse() {
 
     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;
       }
@@ -101,8 +112,12 @@ std::string BriefParser::Parse() {
     ConsumeToken();
   }
 
-  cleanupBrief(Paragraph);
-  return Paragraph;
+  cleanupBrief(FirstParagraphOrBrief);
+  if (!FirstParagraphOrBrief.empty())
+    return FirstParagraphOrBrief;
+
+  cleanupBrief(ReturnsParagraph);
+  return ReturnsParagraph;
 }
 
 BriefParser::BriefParser(Lexer &L) : L(L)
index 406e743f878126d06d16339d09b10c89d6c050db..afce06a1dab0cfe56b67218e41280e7f9ef99198 100644 (file)
@@ -213,6 +213,14 @@ void notdoxy47(void);
 /// \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
@@ -279,4 +287,6 @@ void isdoxy48(int);
 // 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]