18d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===--- CommentParser.h - Doxygen comment parser ---------------*- C++ -*-===// 28d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 38d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// The LLVM Compiler Infrastructure 48d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 58d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// This file is distributed under the University of Illinois Open Source 68d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// License. See LICENSE.TXT for details. 78d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 88d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===// 98d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// This file defines the Doxygen comment parser. 118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===// 138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#ifndef LLVM_CLANG_AST_COMMENT_PARSER_H 158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define LLVM_CLANG_AST_COMMENT_PARSER_H 168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/Comment.h" 1830a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/AST/CommentLexer.h" 198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentSema.h" 2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/Diagnostic.h" 218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/Support/Allocator.h" 228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang { 24a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoclass SourceManager; 25a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments { 27aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkoclass CommandTraits; 288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Doxygen comment parser. 308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass Parser { 31da5922f4864b5da254c6676af8833c42adaa6d86Dmitri Gribenko Parser(const Parser &) LLVM_DELETED_FUNCTION; 32da5922f4864b5da254c6676af8833c42adaa6d86Dmitri Gribenko void operator=(const Parser &) LLVM_DELETED_FUNCTION; 336f36366c85dc81d67d70efdeeea4cfc382053febDmitri Gribenko 34db13f04dd0579874932bdb958647d0903f632dd4Dmitri Gribenko friend class TextTokenRetokenizer; 35db13f04dd0579874932bdb958647d0903f632dd4Dmitri Gribenko 368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Lexer &L; 378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Sema &S; 398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 40a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// Allocator for anything that goes into AST nodes. 418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::BumpPtrAllocator &Allocator; 428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 43a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// Source manager for the comment being parsed. 44a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko const SourceManager &SourceMgr; 45a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 46a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko DiagnosticsEngine &Diags; 47a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 48a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) { 49a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return Diags.Report(Loc, DiagID); 50a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 51a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 52aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko const CommandTraits &Traits; 53aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Current lookahead token. We can safely assume that all tokens are from 558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// a single source file. 568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Token Tok; 578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// A stack of additional lookahead tokens. 598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SmallVector<Token, 8> MoreLATokens; 608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 617d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko void consumeToken() { 628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (MoreLATokens.empty()) 638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko L.lex(Tok); 64344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm else 65344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm Tok = MoreLATokens.pop_back_val(); 668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void putBack(const Token &OldTok) { 698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko MoreLATokens.push_back(Tok); 708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Tok = OldTok; 718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void putBack(ArrayRef<Token> Toks) { 748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Toks.empty()) 758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko MoreLATokens.push_back(Tok); 788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko for (const Token *I = &Toks.back(), 79fd939162ff99a0084ed22a08dd37c149a0883a2bDmitri Gribenko *B = &Toks.front(); 808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko I != B; --I) { 818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko MoreLATokens.push_back(*I); 828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Tok = Toks[0]; 858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8710442564e1ba3c4dfb184cc4e36beffbee4811c3Dmitri Gribenko bool isTokBlockCommand() { 888536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) && 8910442564e1ba3c4dfb184cc4e36beffbee4811c3Dmitri Gribenko Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand; 9010442564e1ba3c4dfb184cc4e36beffbee4811c3Dmitri Gribenko } 9110442564e1ba3c4dfb184cc4e36beffbee4811c3Dmitri Gribenko 928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 93a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator, 94aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko const SourceManager &SourceMgr, DiagnosticsEngine &Diags, 95aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko const CommandTraits &Traits); 968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Parse arguments for \\param command. 987d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko void parseParamCommandArgs(ParamCommandComment *PC, 997d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko TextTokenRetokenizer &Retokenizer); 1008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// Parse arguments for \\tparam command. 1027d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko void parseTParamCommandArgs(TParamCommandComment *TPC, 1037d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko TextTokenRetokenizer &Retokenizer); 1047d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko 1057d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko void parseBlockCommandArgs(BlockCommandComment *BC, 1067d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko TextTokenRetokenizer &Retokenizer, 1077d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko unsigned NumArgs); 1088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment *parseBlockCommand(); 1108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineCommandComment *parseInlineCommand(); 1118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1123f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagComment *parseHTMLStartTag(); 1133f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLEndTagComment *parseHTMLEndTag(); 1148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment *parseParagraphOrBlockCommand(); 1168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimBlockComment *parseVerbatimBlock(); 1188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimLineComment *parseVerbatimLine(); 1198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment *parseBlockContent(); 1208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko FullComment *parseFullComment(); 1218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 1228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments 1248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang 1258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#endif 1278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 128