1239313Sdim//===--- CommentParser.h - Doxygen comment parser ---------------*- C++ -*-===// 2239313Sdim// 3239313Sdim// The LLVM Compiler Infrastructure 4239313Sdim// 5239313Sdim// This file is distributed under the University of Illinois Open Source 6239313Sdim// License. See LICENSE.TXT for details. 7239313Sdim// 8239313Sdim//===----------------------------------------------------------------------===// 9239313Sdim// 10239313Sdim// This file defines the Doxygen comment parser. 11239313Sdim// 12239313Sdim//===----------------------------------------------------------------------===// 13239313Sdim 14239313Sdim#ifndef LLVM_CLANG_AST_COMMENT_PARSER_H 15239313Sdim#define LLVM_CLANG_AST_COMMENT_PARSER_H 16239313Sdim 17249423Sdim#include "clang/AST/Comment.h" 18239313Sdim#include "clang/AST/CommentLexer.h" 19239313Sdim#include "clang/AST/CommentSema.h" 20249423Sdim#include "clang/Basic/Diagnostic.h" 21239313Sdim#include "llvm/Support/Allocator.h" 22239313Sdim 23239313Sdimnamespace clang { 24239313Sdimclass SourceManager; 25239313Sdim 26239313Sdimnamespace comments { 27239313Sdimclass CommandTraits; 28239313Sdim 29239313Sdim/// Doxygen comment parser. 30239313Sdimclass Parser { 31243830Sdim Parser(const Parser &) LLVM_DELETED_FUNCTION; 32243830Sdim void operator=(const Parser &) LLVM_DELETED_FUNCTION; 33239313Sdim 34239313Sdim friend class TextTokenRetokenizer; 35239313Sdim 36239313Sdim Lexer &L; 37239313Sdim 38239313Sdim Sema &S; 39239313Sdim 40239313Sdim /// Allocator for anything that goes into AST nodes. 41239313Sdim llvm::BumpPtrAllocator &Allocator; 42239313Sdim 43239313Sdim /// Source manager for the comment being parsed. 44239313Sdim const SourceManager &SourceMgr; 45239313Sdim 46239313Sdim DiagnosticsEngine &Diags; 47239313Sdim 48239313Sdim DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) { 49239313Sdim return Diags.Report(Loc, DiagID); 50239313Sdim } 51239313Sdim 52239313Sdim const CommandTraits &Traits; 53239313Sdim 54239313Sdim /// Current lookahead token. We can safely assume that all tokens are from 55239313Sdim /// a single source file. 56239313Sdim Token Tok; 57239313Sdim 58239313Sdim /// A stack of additional lookahead tokens. 59239313Sdim SmallVector<Token, 8> MoreLATokens; 60239313Sdim 61239313Sdim void consumeToken() { 62239313Sdim if (MoreLATokens.empty()) 63239313Sdim L.lex(Tok); 64263508Sdim else 65263508Sdim Tok = MoreLATokens.pop_back_val(); 66239313Sdim } 67239313Sdim 68239313Sdim void putBack(const Token &OldTok) { 69239313Sdim MoreLATokens.push_back(Tok); 70239313Sdim Tok = OldTok; 71239313Sdim } 72239313Sdim 73239313Sdim void putBack(ArrayRef<Token> Toks) { 74239313Sdim if (Toks.empty()) 75239313Sdim return; 76239313Sdim 77239313Sdim MoreLATokens.push_back(Tok); 78239313Sdim for (const Token *I = &Toks.back(), 79239313Sdim *B = &Toks.front(); 80239313Sdim I != B; --I) { 81239313Sdim MoreLATokens.push_back(*I); 82239313Sdim } 83239313Sdim 84239313Sdim Tok = Toks[0]; 85239313Sdim } 86239313Sdim 87249423Sdim bool isTokBlockCommand() { 88249423Sdim return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) && 89249423Sdim Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand; 90249423Sdim } 91249423Sdim 92239313Sdimpublic: 93239313Sdim Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator, 94239313Sdim const SourceManager &SourceMgr, DiagnosticsEngine &Diags, 95239313Sdim const CommandTraits &Traits); 96239313Sdim 97239313Sdim /// Parse arguments for \\param command. 98239313Sdim void parseParamCommandArgs(ParamCommandComment *PC, 99239313Sdim TextTokenRetokenizer &Retokenizer); 100239313Sdim 101239313Sdim /// Parse arguments for \\tparam command. 102239313Sdim void parseTParamCommandArgs(TParamCommandComment *TPC, 103239313Sdim TextTokenRetokenizer &Retokenizer); 104239313Sdim 105239313Sdim void parseBlockCommandArgs(BlockCommandComment *BC, 106239313Sdim TextTokenRetokenizer &Retokenizer, 107239313Sdim unsigned NumArgs); 108239313Sdim 109239313Sdim BlockCommandComment *parseBlockCommand(); 110239313Sdim InlineCommandComment *parseInlineCommand(); 111239313Sdim 112239313Sdim HTMLStartTagComment *parseHTMLStartTag(); 113239313Sdim HTMLEndTagComment *parseHTMLEndTag(); 114239313Sdim 115239313Sdim BlockContentComment *parseParagraphOrBlockCommand(); 116239313Sdim 117239313Sdim VerbatimBlockComment *parseVerbatimBlock(); 118239313Sdim VerbatimLineComment *parseVerbatimLine(); 119239313Sdim BlockContentComment *parseBlockContent(); 120239313Sdim FullComment *parseFullComment(); 121239313Sdim}; 122239313Sdim 123239313Sdim} // end namespace comments 124239313Sdim} // end namespace clang 125239313Sdim 126239313Sdim#endif 127239313Sdim 128