On Mar 1, 2013, at 4:29 PM, Dmitri Gribenko <[email protected]> wrote:
> > > On Saturday, March 2, 2013, Fariborz Jahanian wrote: > 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; > > This is unfortunate that we increase sizeof Token. We use Token as a value > type that should be cheap to copy. I think we could carry this information > in the token kind, by defining 'backslash command' and 'at command' tokens. OK. > > > 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()); > > This kind of fixups that are done after AST node is created is fragile -- we > could forget to insert a fixup in a new place where we create ASTnodes. This > flag (or an enum?!) should be an argument for the onstructor. Yeh, I was first going to pass down to these 3 actOn…. routines but changes would have become substantive. So I did not. But, I agree with he underlying argument. - fj
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
