Home | History | Annotate | Download | only in AST
      1 //===--- CommentParser.h - Doxygen comment parser ---------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file defines the Doxygen comment parser.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CLANG_AST_COMMENT_PARSER_H
     15 #define LLVM_CLANG_AST_COMMENT_PARSER_H
     16 
     17 #include "clang/AST/Comment.h"
     18 #include "clang/AST/CommentLexer.h"
     19 #include "clang/AST/CommentSema.h"
     20 #include "clang/Basic/Diagnostic.h"
     21 #include "llvm/Support/Allocator.h"
     22 
     23 namespace clang {
     24 class SourceManager;
     25 
     26 namespace comments {
     27 class CommandTraits;
     28 
     29 /// Doxygen comment parser.
     30 class Parser {
     31   Parser(const Parser &) LLVM_DELETED_FUNCTION;
     32   void operator=(const Parser &) LLVM_DELETED_FUNCTION;
     33 
     34   friend class TextTokenRetokenizer;
     35 
     36   Lexer &L;
     37 
     38   Sema &S;
     39 
     40   /// Allocator for anything that goes into AST nodes.
     41   llvm::BumpPtrAllocator &Allocator;
     42 
     43   /// Source manager for the comment being parsed.
     44   const SourceManager &SourceMgr;
     45 
     46   DiagnosticsEngine &Diags;
     47 
     48   DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
     49     return Diags.Report(Loc, DiagID);
     50   }
     51 
     52   const CommandTraits &Traits;
     53 
     54   /// Current lookahead token.  We can safely assume that all tokens are from
     55   /// a single source file.
     56   Token Tok;
     57 
     58   /// A stack of additional lookahead tokens.
     59   SmallVector<Token, 8> MoreLATokens;
     60 
     61   void consumeToken() {
     62     if (MoreLATokens.empty())
     63       L.lex(Tok);
     64     else {
     65       Tok = MoreLATokens.back();
     66       MoreLATokens.pop_back();
     67     }
     68   }
     69 
     70   void putBack(const Token &OldTok) {
     71     MoreLATokens.push_back(Tok);
     72     Tok = OldTok;
     73   }
     74 
     75   void putBack(ArrayRef<Token> Toks) {
     76     if (Toks.empty())
     77       return;
     78 
     79     MoreLATokens.push_back(Tok);
     80     for (const Token *I = &Toks.back(),
     81          *B = &Toks.front();
     82          I != B; --I) {
     83       MoreLATokens.push_back(*I);
     84     }
     85 
     86     Tok = Toks[0];
     87   }
     88 
     89   bool isTokBlockCommand() {
     90     return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) &&
     91            Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand;
     92   }
     93 
     94 public:
     95   Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator,
     96          const SourceManager &SourceMgr, DiagnosticsEngine &Diags,
     97          const CommandTraits &Traits);
     98 
     99   /// Parse arguments for \\param command.
    100   void parseParamCommandArgs(ParamCommandComment *PC,
    101                              TextTokenRetokenizer &Retokenizer);
    102 
    103   /// Parse arguments for \\tparam command.
    104   void parseTParamCommandArgs(TParamCommandComment *TPC,
    105                               TextTokenRetokenizer &Retokenizer);
    106 
    107   void parseBlockCommandArgs(BlockCommandComment *BC,
    108                              TextTokenRetokenizer &Retokenizer,
    109                              unsigned NumArgs);
    110 
    111   BlockCommandComment *parseBlockCommand();
    112   InlineCommandComment *parseInlineCommand();
    113 
    114   HTMLStartTagComment *parseHTMLStartTag();
    115   HTMLEndTagComment *parseHTMLEndTag();
    116 
    117   BlockContentComment *parseParagraphOrBlockCommand();
    118 
    119   VerbatimBlockComment *parseVerbatimBlock();
    120   VerbatimLineComment *parseVerbatimLine();
    121   BlockContentComment *parseBlockContent();
    122   FullComment *parseFullComment();
    123 };
    124 
    125 } // end namespace comments
    126 } // end namespace clang
    127 
    128 #endif
    129 
    130