r176387 - comment parsing. Keep the original command format

Fariborz Jahanian fjahanian at apple.com
Fri Mar 1 14:51:30 PST 2013


Author: fjahanian
Date: Fri Mar  1 16:51:30 2013
New Revision: 176387

URL: http://llvm.org/viewvc/llvm-project?rev=176387&view=rev
Log:
comment parsing. Keep the original command format 
in AST for source fidelity and use it in diagnostics 
to refer to the original format. // rdar://13066276

Modified:
    cfe/trunk/include/clang/AST/Comment.h
    cfe/trunk/include/clang/AST/CommentLexer.h
    cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td
    cfe/trunk/lib/AST/CommentLexer.cpp
    cfe/trunk/lib/AST/CommentParser.cpp
    cfe/trunk/lib/AST/CommentSema.cpp
    cfe/trunk/test/Sema/warn-documentation.cpp

Modified: cfe/trunk/include/clang/AST/Comment.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Comment.h?rev=176387&r1=176386&r2=176387&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Comment.h (original)
+++ cfe/trunk/include/clang/AST/Comment.h Fri Mar  1 16:51:30 2013
@@ -570,13 +570,16 @@ protected:
 
   /// Paragraph argument.
   ParagraphComment *Paragraph;
-
+  
+  /// Header Doc command, if true
+  bool HDCommand;
+  
   BlockCommandComment(CommentKind K,
                       SourceLocation LocBegin,
                       SourceLocation LocEnd,
                       unsigned CommandID) :
       BlockContentComment(K, LocBegin, LocEnd),
-      Paragraph(NULL) {
+      Paragraph(NULL), HDCommand(false) {
     setLocation(getCommandNameBeginLoc());
     BlockCommandCommentBits.CommandID = CommandID;
   }
@@ -586,7 +589,7 @@ public:
                       SourceLocation LocEnd,
                       unsigned CommandID) :
       BlockContentComment(BlockCommandCommentKind, LocBegin, LocEnd),
-      Paragraph(NULL) {
+      Paragraph(NULL), HDCommand(false) {
     setLocation(getCommandNameBeginLoc());
     BlockCommandCommentBits.CommandID = CommandID;
   }
@@ -657,6 +660,14 @@ public:
     if (NewLocEnd.isValid())
       setSourceRange(SourceRange(getLocStart(), NewLocEnd));
   }
+  
+  bool getHDCommand() const LLVM_READONLY {
+    return HDCommand;
+  }
+  
+  void setHDCommand(bool HDC) {
+    HDCommand = HDC;
+  }
 };
 
 /// Doxygen \\param command.

Modified: cfe/trunk/include/clang/AST/CommentLexer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CommentLexer.h?rev=176387&r1=176386&r2=176387&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/CommentLexer.h (original)
+++ cfe/trunk/include/clang/AST/CommentLexer.h Fri Mar  1 16:51:30 2013
@@ -75,6 +75,9 @@ class Token {
   /// unused (command spelling can be found with CommandTraits).  Otherwise,
   /// contains the length of the string that starts at TextPtr.
   unsigned IntVal;
+  
+  /// This command is a Header Doc command (command starts with '@').
+  bool     HDCommand;
 
 public:
   SourceLocation getLocation() const LLVM_READONLY { return Loc; }
@@ -122,6 +125,10 @@ public:
     return IntVal;
   }
 
+  bool getHDCommand() const LLVM_READONLY {
+    return HDCommand;
+  }
+  
   void setCommandID(unsigned ID) {
     assert(is(tok::command));
     IntVal = ID;

Modified: cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td?rev=176387&r1=176386&r2=176387&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticCommentKinds.td Fri Mar  1 16:51:30 2013
@@ -44,18 +44,18 @@ def note_doc_html_end_tag : Note<
 // Commands
 
 def warn_doc_block_command_empty_paragraph : Warning<
-  "empty paragraph passed to '\\%0' command">,
+  "empty paragraph passed to '%select{\\|@}0%1' command">,
   InGroup<Documentation>, DefaultIgnore;
 
 def warn_doc_block_command_duplicate : Warning<
-  "duplicated command '\\%0'">,
+  "duplicated command '%select{\\|@}0%1'">,
   InGroup<Documentation>, DefaultIgnore;
 
 def note_doc_block_command_previous : Note<
-  "previous command '\\%0' here">;
+  "previous command '%select{\\|@}0%1' here">;
 
 def note_doc_block_command_previous_alias : Note<
-  "previous command '\\%0' (an alias of '\\%1') here">;
+  "previous command '%select{\\|@}0%1' (an alias of '\\%2') here">;
 
 // \param command
 
@@ -111,14 +111,14 @@ def note_doc_tparam_name_suggestion : No
 // \returns command
 
 def warn_doc_returns_not_attached_to_a_function_decl : Warning<
-  "'\\%0' command used in a comment that is not attached to "
+  "'%select{\\|@}0%1' command used in a comment that is not attached to "
   "a function or method declaration">,
   InGroup<Documentation>, DefaultIgnore;
 
 def warn_doc_returns_attached_to_a_void_function : Warning<
-  "'\\%0' command used in a comment that is attached to a "
+  "'%select{\\|@}0%1' command used in a comment that is attached to a "
   "%select{function returning void|constructor|destructor|"
-  "method returning void}1">,
+  "method returning void}2">,
   InGroup<Documentation>, DefaultIgnore;
 
 // \deprecated command
@@ -134,7 +134,7 @@ def note_add_deprecation_attr : Note<
 // verbatim block commands
 
 def warn_verbatim_block_end_without_start : Warning<
-  "'\\%0' command does not terminate a verbatim text block">,
+  "'%select{\\|@}0%1' command does not terminate a verbatim text block">,
   InGroup<Documentation>, DefaultIgnore;
 
 } // end of documentation issue category

Modified: cfe/trunk/lib/AST/CommentLexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentLexer.cpp?rev=176387&r1=176386&r2=176387&view=diff
==============================================================================
--- cfe/trunk/lib/AST/CommentLexer.cpp (original)
+++ cfe/trunk/lib/AST/CommentLexer.cpp Fri Mar  1 16:51:30 2013
@@ -298,6 +298,7 @@ void Lexer::lexCommentText(Token &T) {
     switch(*TokenPtr) {
       case '\\':
       case '@': {
+        T.HDCommand = (*TokenPtr == '@');
         TokenPtr++;
         if (TokenPtr == CommentEnd) {
           formTextToken(T, TokenPtr);

Modified: cfe/trunk/lib/AST/CommentParser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentParser.cpp?rev=176387&r1=176386&r2=176387&view=diff
==============================================================================
--- cfe/trunk/lib/AST/CommentParser.cpp (original)
+++ cfe/trunk/lib/AST/CommentParser.cpp Fri Mar  1 16:51:30 2013
@@ -313,15 +313,18 @@ BlockCommandComment *Parser::parseBlockC
     PC = S.actOnParamCommandStart(Tok.getLocation(),
                                   Tok.getEndLocation(),
                                   Tok.getCommandID());
+    PC->setHDCommand(Tok.getHDCommand());
   } else if (Info->IsTParamCommand) {
     IsTParam = true;
     TPC = S.actOnTParamCommandStart(Tok.getLocation(),
                                     Tok.getEndLocation(),
                                     Tok.getCommandID());
+    TPC->setHDCommand(Tok.getHDCommand());
   } else {
     BC = S.actOnBlockCommandStart(Tok.getLocation(),
                                   Tok.getEndLocation(),
                                   Tok.getCommandID());
+    BC->setHDCommand(Tok.getHDCommand());
   }
   consumeToken();
 
@@ -569,6 +572,7 @@ BlockContentComment *Parser::parseParagr
       if (Info->IsVerbatimBlockEndCommand) {
         Diag(Tok.getLocation(),
              diag::warn_verbatim_block_end_without_start)
+          << Tok.getHDCommand()
           << Info->Name
           << SourceRange(Tok.getLocation(), Tok.getEndLocation());
         consumeToken();

Modified: cfe/trunk/lib/AST/CommentSema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentSema.cpp?rev=176387&r1=176386&r2=176387&view=diff
==============================================================================
--- cfe/trunk/lib/AST/CommentSema.cpp (original)
+++ cfe/trunk/lib/AST/CommentSema.cpp Fri Mar  1 16:51:30 2013
@@ -432,6 +432,7 @@ void Sema::checkBlockCommandEmptyParagra
     if (!DiagLoc.isValid())
       DiagLoc = Command->getCommandNameRange(Traits).getEnd();
     Diag(DiagLoc, diag::warn_doc_block_command_empty_paragraph)
+      << Command->getHDCommand()
       << Command->getCommandName(Traits)
       << Command->getSourceRange();
   }
@@ -459,6 +460,7 @@ void Sema::checkReturnsCommand(const Blo
       }
       Diag(Command->getLocation(),
            diag::warn_doc_returns_attached_to_a_void_function)
+        << Command->getHDCommand()
         << Command->getCommandName(Traits)
         << DiagKind
         << Command->getSourceRange();
@@ -470,6 +472,7 @@ void Sema::checkReturnsCommand(const Blo
   
   Diag(Command->getLocation(),
        diag::warn_doc_returns_not_attached_to_a_function_decl)
+    << Command->getHDCommand()
     << Command->getCommandName(Traits)
     << Command->getSourceRange();
 }
@@ -502,15 +505,18 @@ void Sema::checkBlockCommandDuplicate(co
   StringRef CommandName = Command->getCommandName(Traits);
   StringRef PrevCommandName = PrevCommand->getCommandName(Traits);
   Diag(Command->getLocation(), diag::warn_doc_block_command_duplicate)
+      << Command->getHDCommand()
       << CommandName
       << Command->getSourceRange();
   if (CommandName == PrevCommandName)
     Diag(PrevCommand->getLocation(), diag::note_doc_block_command_previous)
+        << PrevCommand->getHDCommand()
         << PrevCommandName
         << PrevCommand->getSourceRange();
   else
     Diag(PrevCommand->getLocation(),
          diag::note_doc_block_command_previous_alias)
+        << PrevCommand->getHDCommand()
         << PrevCommandName
         << CommandName;
 }

Modified: cfe/trunk/test/Sema/warn-documentation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-documentation.cpp?rev=176387&r1=176386&r2=176387&view=diff
==============================================================================
--- cfe/trunk/test/Sema/warn-documentation.cpp (original)
+++ cfe/trunk/test/Sema/warn-documentation.cpp Fri Mar  1 16:51:30 2013
@@ -862,28 +862,28 @@ int test_nocrash9;
 
 // We used to crash on this.  PR15068
 
-// expected-warning at +2 {{empty paragraph passed to '\param' command}}
-// expected-warning at +2 {{empty paragraph passed to '\param' command}}
+// expected-warning at +2 {{empty paragraph passed to '@param' command}}
+// expected-warning at +2 {{empty paragraph passed to '@param' command}}
 ///@param x
 ///@param y
 int test_nocrash10(int x, int y);
 
-// expected-warning at +2 {{empty paragraph passed to '\param' command}} expected-warning at +2 {{parameter 'x' not found in the function declaration}}
-// expected-warning at +2 {{empty paragraph passed to '\param' command}} expected-warning at +2 {{parameter 'y' not found in the function declaration}}
+// expected-warning at +2 {{empty paragraph passed to '@param' command}} expected-warning at +2 {{parameter 'x' not found in the function declaration}}
+// expected-warning at +2 {{empty paragraph passed to '@param' command}} expected-warning at +2 {{parameter 'y' not found in the function declaration}}
 ///@param x
 ///@param y
 int test_nocrash11();
 
-// expected-warning at +3 {{empty paragraph passed to '\param' command}} expected-warning at +3 {{parameter 'x' not found in the function declaration}}
-// expected-warning at +3 {{empty paragraph passed to '\param' command}} expected-warning at +3 {{parameter 'y' not found in the function declaration}}
+// expected-warning at +3 {{empty paragraph passed to '@param' command}} expected-warning at +3 {{parameter 'x' not found in the function declaration}}
+// expected-warning at +3 {{empty paragraph passed to '@param' command}} expected-warning at +3 {{parameter 'y' not found in the function declaration}}
 /**
 @param x
 @param y
 **/
 int test_nocrash12();
 
-// expected-warning at +2 {{empty paragraph passed to '\param' command}}
-// expected-warning at +1 {{empty paragraph passed to '\param' command}}
+// expected-warning at +2 {{empty paragraph passed to '@param' command}}
+// expected-warning at +1 {{empty paragraph passed to '@param' command}}
 ///@param x at param y
 int test_nocrash13(int x, int y);
 
@@ -895,3 +895,15 @@ int test_nocrash13(int x, int y);
 /// \headerfile foo.h 
 int test_duplicate_headerfile1(int);
 
+
+// rdar://13066276
+// expected-warning at +1 {{'@return' command used in a comment that is not attached to a function or method declaration}}
+/** @return s */
+struct s* f(void);
+struct s;
+
+// expected-warning at +1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
+/** \return s */
+struct q* g(void);
+struct q;
+





More information about the cfe-commits mailing list