diff --git a/include/clang/AST/Comment.h b/include/clang/AST/Comment.h index f00993bf6c..8c876794b6 100644 --- a/include/clang/AST/Comment.h +++ b/include/clang/AST/Comment.h @@ -572,14 +572,15 @@ protected: ParagraphComment *Paragraph; /// Header Doc command, if true - bool HDCommand; + bool AtCommand; BlockCommandComment(CommentKind K, SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID) : + unsigned CommandID, + bool AtCommand) : BlockContentComment(K, LocBegin, LocEnd), - Paragraph(NULL), HDCommand(false) { + Paragraph(NULL), AtCommand(AtCommand) { setLocation(getCommandNameBeginLoc()); BlockCommandCommentBits.CommandID = CommandID; } @@ -587,9 +588,10 @@ protected: public: BlockCommandComment(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID) : + unsigned CommandID, + bool AtCommand) : BlockContentComment(BlockCommandCommentKind, LocBegin, LocEnd), - Paragraph(NULL), HDCommand(false) { + Paragraph(NULL), AtCommand(AtCommand) { setLocation(getCommandNameBeginLoc()); BlockCommandCommentBits.CommandID = CommandID; } @@ -661,12 +663,8 @@ public: setSourceRange(SourceRange(getLocStart(), NewLocEnd)); } - bool getHDCommand() const LLVM_READONLY { - return HDCommand; - } - - void setHDCommand(bool HDC) { - HDCommand = HDC; + bool getAtCommand() const LLVM_READONLY { + return AtCommand; } }; @@ -681,9 +679,10 @@ public: ParamCommandComment(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID) : + unsigned CommandID, + bool AtCommand) : BlockCommandComment(ParamCommandCommentKind, LocBegin, LocEnd, - CommandID), + CommandID, AtCommand), ParamIndex(InvalidParamIndex) { ParamCommandCommentBits.Direction = In; ParamCommandCommentBits.IsDirectionExplicit = false; @@ -763,8 +762,10 @@ private: public: TParamCommandComment(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID) : - BlockCommandComment(TParamCommandCommentKind, LocBegin, LocEnd, CommandID) + unsigned CommandID, + bool AtCommand) : + BlockCommandComment(TParamCommandCommentKind, LocBegin, LocEnd, CommandID, + AtCommand) { } static bool classof(const Comment *C) { @@ -845,7 +846,7 @@ public: SourceLocation LocEnd, unsigned CommandID) : BlockCommandComment(VerbatimBlockCommentKind, - LocBegin, LocEnd, CommandID) + LocBegin, LocEnd, CommandID, false) { } static bool classof(const Comment *C) { @@ -898,7 +899,7 @@ public: StringRef Text) : BlockCommandComment(VerbatimLineCommentKind, LocBegin, LocEnd, - CommandID), + CommandID, false), Text(Text), TextBegin(TextBegin) { } diff --git a/include/clang/AST/CommentLexer.h b/include/clang/AST/CommentLexer.h index 240a8eac9a..a52b039c16 100644 --- a/include/clang/AST/CommentLexer.h +++ b/include/clang/AST/CommentLexer.h @@ -35,7 +35,8 @@ enum TokenKind { newline, text, unknown_command, // Command that does not have an ID. - command, // Command with an ID. + backslash_command, // \Command with an ID. + at_command, // @command with an ID. verbatim_block_begin, verbatim_block_line, verbatim_block_end, @@ -76,9 +77,6 @@ class Token { /// 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; } void setLocation(SourceLocation SL) { Loc = SL; } @@ -121,16 +119,12 @@ public: } unsigned getCommandID() const LLVM_READONLY { - assert(is(tok::command)); + assert(is(tok::backslash_command) || is(tok::at_command)); return IntVal; } - bool getHDCommand() const LLVM_READONLY { - return HDCommand; - } - void setCommandID(unsigned ID) { - assert(is(tok::command)); + assert(is(tok::backslash_command) || is(tok::at_command)); IntVal = ID; } diff --git a/include/clang/AST/CommentParser.h b/include/clang/AST/CommentParser.h index 8bf629b45e..d6a1072786 100644 --- a/include/clang/AST/CommentParser.h +++ b/include/clang/AST/CommentParser.h @@ -87,7 +87,7 @@ class Parser { } bool isTokBlockCommand() { - return Tok.is(tok::command) && + return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) && Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand; } diff --git a/include/clang/AST/CommentSema.h b/include/clang/AST/CommentSema.h index 76957c23fc..18e3ee8bd9 100644 --- a/include/clang/AST/CommentSema.h +++ b/include/clang/AST/CommentSema.h @@ -96,7 +96,8 @@ public: BlockCommandComment *actOnBlockCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID); + unsigned CommandID, + bool AtCommand); void actOnBlockCommandArgs(BlockCommandComment *Command, ArrayRef Args); @@ -106,7 +107,8 @@ public: ParamCommandComment *actOnParamCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID); + unsigned CommandID, + bool AtCommand); void actOnParamCommandDirectionArg(ParamCommandComment *Command, SourceLocation ArgLocBegin, @@ -123,7 +125,8 @@ public: TParamCommandComment *actOnTParamCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID); + unsigned CommandID, + bool AtCommand); void actOnTParamCommandParamNameArg(TParamCommandComment *Command, SourceLocation ArgLocBegin, diff --git a/lib/AST/CommentBriefParser.cpp b/lib/AST/CommentBriefParser.cpp index 95daa7e3f8..090b9211d4 100644 --- a/lib/AST/CommentBriefParser.cpp +++ b/lib/AST/CommentBriefParser.cpp @@ -78,7 +78,7 @@ std::string BriefParser::Parse() { continue; } - if (Tok.is(tok::command)) { + if (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) { const CommandInfo *Info = Traits.getCommandInfo(Tok.getCommandID()); if (Info->IsBriefCommand) { FirstParagraphOrBrief.clear(); diff --git a/lib/AST/CommentLexer.cpp b/lib/AST/CommentLexer.cpp index da865d2ee3..2018099417 100644 --- a/lib/AST/CommentLexer.cpp +++ b/lib/AST/CommentLexer.cpp @@ -298,7 +298,7 @@ void Lexer::lexCommentText(Token &T) { switch(*TokenPtr) { case '\\': case '@': { - T.HDCommand = (*TokenPtr == '@'); + bool AtCommand = (*TokenPtr == '@'); TokenPtr++; if (TokenPtr == CommentEnd) { formTextToken(T, TokenPtr); @@ -359,7 +359,9 @@ void Lexer::lexCommentText(Token &T) { setupAndLexVerbatimLine(T, TokenPtr, Info); return; } - formTokenWithChars(T, TokenPtr, tok::command); + formTokenWithChars(T, TokenPtr, + (AtCommand ? tok::at_command + : tok::backslash_command)); T.setCommandID(Info->getID()); return; } diff --git a/lib/AST/CommentParser.cpp b/lib/AST/CommentParser.cpp index f5c933e7bb..c6bd922461 100644 --- a/lib/AST/CommentParser.cpp +++ b/lib/AST/CommentParser.cpp @@ -300,7 +300,7 @@ void Parser::parseBlockCommandArgs(BlockCommandComment *BC, } BlockCommandComment *Parser::parseBlockCommand() { - assert(Tok.is(tok::command)); + assert(Tok.is(tok::backslash_command) || Tok.is(tok::at_command)); ParamCommandComment *PC; TParamCommandComment *TPC; @@ -312,19 +312,19 @@ BlockCommandComment *Parser::parseBlockCommand() { IsParam = true; PC = S.actOnParamCommandStart(Tok.getLocation(), Tok.getEndLocation(), - Tok.getCommandID()); - PC->setHDCommand(Tok.getHDCommand()); + Tok.getCommandID(), + Tok.is(tok::at_command)); } else if (Info->IsTParamCommand) { IsTParam = true; TPC = S.actOnTParamCommandStart(Tok.getLocation(), Tok.getEndLocation(), - Tok.getCommandID()); - TPC->setHDCommand(Tok.getHDCommand()); + Tok.getCommandID(), + Tok.is(tok::at_command)); } else { BC = S.actOnBlockCommandStart(Tok.getLocation(), Tok.getEndLocation(), - Tok.getCommandID()); - BC->setHDCommand(Tok.getHDCommand()); + Tok.getCommandID(), + Tok.is(tok::at_command)); } consumeToken(); @@ -395,7 +395,7 @@ BlockCommandComment *Parser::parseBlockCommand() { } InlineCommandComment *Parser::parseInlineCommand() { - assert(Tok.is(tok::command)); + assert(Tok.is(tok::backslash_command) || Tok.is(tok::at_command)); const Token CommandTok = Tok; consumeToken(); @@ -562,7 +562,8 @@ BlockContentComment *Parser::parseParagraphOrBlockCommand() { consumeToken(); continue; - case tok::command: { + case tok::backslash_command: + case tok::at_command: { const CommandInfo *Info = Traits.getCommandInfo(Tok.getCommandID()); if (Info->IsBlockCommand) { if (Content.size() == 0) @@ -572,7 +573,7 @@ BlockContentComment *Parser::parseParagraphOrBlockCommand() { if (Info->IsVerbatimBlockEndCommand) { Diag(Tok.getLocation(), diag::warn_verbatim_block_end_without_start) - << Tok.getHDCommand() + << Tok.is(tok::at_command) << Info->Name << SourceRange(Tok.getLocation(), Tok.getEndLocation()); consumeToken(); @@ -710,7 +711,8 @@ BlockContentComment *Parser::parseBlockContent() { switch (Tok.getKind()) { case tok::text: case tok::unknown_command: - case tok::command: + case tok::backslash_command: + case tok::at_command: case tok::html_start_tag: case tok::html_end_tag: return parseParagraphOrBlockCommand(); diff --git a/lib/AST/CommentSema.cpp b/lib/AST/CommentSema.cpp index 3227138807..e7bd5c8cad 100644 --- a/lib/AST/CommentSema.cpp +++ b/lib/AST/CommentSema.cpp @@ -49,8 +49,9 @@ ParagraphComment *Sema::actOnParagraphComment( BlockCommandComment *Sema::actOnBlockCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID) { - return new (Allocator) BlockCommandComment(LocBegin, LocEnd, CommandID); + unsigned CommandID, + bool AtCommand) { + return new (Allocator) BlockCommandComment(LocBegin, LocEnd, CommandID, AtCommand); } void Sema::actOnBlockCommandArgs(BlockCommandComment *Command, @@ -69,9 +70,10 @@ void Sema::actOnBlockCommandFinish(BlockCommandComment *Command, ParamCommandComment *Sema::actOnParamCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID) { + unsigned CommandID, + bool AtCommand) { ParamCommandComment *Command = - new (Allocator) ParamCommandComment(LocBegin, LocEnd, CommandID); + new (Allocator) ParamCommandComment(LocBegin, LocEnd, CommandID, AtCommand); if (!isFunctionDecl()) Diag(Command->getLocation(), @@ -162,9 +164,10 @@ void Sema::actOnParamCommandFinish(ParamCommandComment *Command, TParamCommandComment *Sema::actOnTParamCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, - unsigned CommandID) { + unsigned CommandID, + bool AtCommand) { TParamCommandComment *Command = - new (Allocator) TParamCommandComment(LocBegin, LocEnd, CommandID); + new (Allocator) TParamCommandComment(LocBegin, LocEnd, CommandID, AtCommand); if (!isTemplateOrSpecialization()) Diag(Command->getLocation(), @@ -432,7 +435,7 @@ void Sema::checkBlockCommandEmptyParagraph(BlockCommandComment *Command) { if (!DiagLoc.isValid()) DiagLoc = Command->getCommandNameRange(Traits).getEnd(); Diag(DiagLoc, diag::warn_doc_block_command_empty_paragraph) - << Command->getHDCommand() + << Command->getAtCommand() << Command->getCommandName(Traits) << Command->getSourceRange(); } @@ -460,7 +463,7 @@ void Sema::checkReturnsCommand(const BlockCommandComment *Command) { } Diag(Command->getLocation(), diag::warn_doc_returns_attached_to_a_void_function) - << Command->getHDCommand() + << Command->getAtCommand() << Command->getCommandName(Traits) << DiagKind << Command->getSourceRange(); @@ -472,7 +475,7 @@ void Sema::checkReturnsCommand(const BlockCommandComment *Command) { Diag(Command->getLocation(), diag::warn_doc_returns_not_attached_to_a_function_decl) - << Command->getHDCommand() + << Command->getAtCommand() << Command->getCommandName(Traits) << Command->getSourceRange(); } @@ -505,18 +508,18 @@ void Sema::checkBlockCommandDuplicate(const BlockCommandComment *Command) { StringRef CommandName = Command->getCommandName(Traits); StringRef PrevCommandName = PrevCommand->getCommandName(Traits); Diag(Command->getLocation(), diag::warn_doc_block_command_duplicate) - << Command->getHDCommand() + << Command->getAtCommand() << CommandName << Command->getSourceRange(); if (CommandName == PrevCommandName) Diag(PrevCommand->getLocation(), diag::note_doc_block_command_previous) - << PrevCommand->getHDCommand() + << PrevCommand->getAtCommand() << PrevCommandName << PrevCommand->getSourceRange(); else Diag(PrevCommand->getLocation(), diag::note_doc_block_command_previous_alias) - << PrevCommand->getHDCommand() + << PrevCommand->getAtCommand() << PrevCommandName << CommandName; } diff --git a/unittests/AST/CommentLexer.cpp b/unittests/AST/CommentLexer.cpp index 7c8456b2dd..46de945cca 100644 --- a/unittests/AST/CommentLexer.cpp +++ b/unittests/AST/CommentLexer.cpp @@ -362,7 +362,7 @@ TEST_F(CommentLexerTest, DoxygenCommand6) { ASSERT_EQ(tok::text, Toks[0].getKind()); ASSERT_EQ(StringRef(" "), Toks[0].getText()); - ASSERT_EQ(tok::command, Toks[1].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[1].getKind()); ASSERT_EQ(StringRef("brief"), getCommandName(Toks[1])); ASSERT_EQ(tok::text, Toks[2].getKind()); @@ -382,22 +382,22 @@ TEST_F(CommentLexerTest, DoxygenCommand7) { ASSERT_EQ(tok::text, Toks[0].getKind()); ASSERT_EQ(StringRef(" "), Toks[0].getText()); - ASSERT_EQ(tok::command, Toks[1].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[1].getKind()); ASSERT_EQ(StringRef("em"), getCommandName(Toks[1])); - ASSERT_EQ(tok::command, Toks[2].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[2].getKind()); ASSERT_EQ(StringRef("em"), getCommandName(Toks[2])); ASSERT_EQ(tok::text, Toks[3].getKind()); ASSERT_EQ(StringRef(" "), Toks[3].getText()); - ASSERT_EQ(tok::command, Toks[4].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[4].getKind()); ASSERT_EQ(StringRef("em"), getCommandName(Toks[4])); ASSERT_EQ(tok::text, Toks[5].getKind()); ASSERT_EQ(StringRef("\t"), Toks[5].getText()); - ASSERT_EQ(tok::command, Toks[6].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[6].getKind()); ASSERT_EQ(StringRef("em"), getCommandName(Toks[6])); ASSERT_EQ(tok::newline, Toks[7].getKind()); @@ -446,7 +446,7 @@ TEST_F(CommentLexerTest, DoxygenCommand9) { ASSERT_EQ(tok::text, Toks[0].getKind()); ASSERT_EQ(StringRef(" "), Toks[0].getText()); - ASSERT_EQ(tok::command, Toks[1].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[1].getKind()); ASSERT_EQ(StringRef("c"), getCommandName(Toks[1])); ASSERT_EQ(tok::newline, Toks[2].getKind()); @@ -466,7 +466,7 @@ TEST_F(CommentLexerTest, RegisterCustomBlockCommand) { ASSERT_EQ(tok::text, Toks[0].getKind()); ASSERT_EQ(StringRef(" "), Toks[0].getText()); - ASSERT_EQ(tok::command, Toks[1].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[1].getKind()); ASSERT_EQ(StringRef("NewBlockCommand"), getCommandName(Toks[1])); ASSERT_EQ(tok::text, Toks[2].getKind()); @@ -494,7 +494,7 @@ TEST_F(CommentLexerTest, RegisterMultipleBlockCommands) { ASSERT_EQ(tok::text, Toks[0].getKind()); ASSERT_EQ(StringRef(" "), Toks[0].getText()); - ASSERT_EQ(tok::command, Toks[1].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[1].getKind()); ASSERT_EQ(StringRef("Foo"), getCommandName(Toks[1])); ASSERT_EQ(tok::newline, Toks[2].getKind()); @@ -502,7 +502,7 @@ TEST_F(CommentLexerTest, RegisterMultipleBlockCommands) { ASSERT_EQ(tok::text, Toks[3].getKind()); ASSERT_EQ(StringRef(" "), Toks[3].getText()); - ASSERT_EQ(tok::command, Toks[4].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[4].getKind()); ASSERT_EQ(StringRef("Bar"), getCommandName(Toks[4])); ASSERT_EQ(tok::text, Toks[5].getKind()); @@ -513,7 +513,7 @@ TEST_F(CommentLexerTest, RegisterMultipleBlockCommands) { ASSERT_EQ(tok::text, Toks[7].getKind()); ASSERT_EQ(StringRef(" "), Toks[7].getText()); - ASSERT_EQ(tok::command, Toks[8].getKind()); + ASSERT_EQ(tok::backslash_command, Toks[8].getKind()); ASSERT_EQ(StringRef("Blech"), getCommandName(Toks[8])); ASSERT_EQ(tok::text, Toks[9].getKind());