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.pop_back_val();
     66   }
     67 
     68   void putBack(const Token &OldTok) {
     69     MoreLATokens.push_back(Tok);
     70     Tok = OldTok;
     71   }
     72 
     73   void putBack(ArrayRef<Token> Toks) {
     74     if (Toks.empty())
     75       return;
     76 
     77     MoreLATokens.push_back(Tok);
     78     for (const Token *I = &Toks.back(),
     79          *B = &Toks.front();
     80          I != B; --I) {
     81       MoreLATokens.push_back(*I);
     82     }
     83 
     84     Tok = Toks[0];
     85   }
     86 
     87   bool isTokBlockCommand() {
     88     return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) &&
     89            Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand;
     90   }
     91 
     92 public:
     93   Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator,
     94          const SourceManager &SourceMgr, DiagnosticsEngine &Diags,
     95          const CommandTraits &Traits);
     96 
     97   /// Parse arguments for \\param command.
     98   void parseParamCommandArgs(ParamCommandComment *PC,
     99                              TextTokenRetokenizer &Retokenizer);
    100 
    101   /// Parse arguments for \\tparam command.
    102   void parseTParamCommandArgs(TParamCommandComment *TPC,
    103                               TextTokenRetokenizer &Retokenizer);
    104 
    105   void parseBlockCommandArgs(BlockCommandComment *BC,
    106                              TextTokenRetokenizer &Retokenizer,
    107                              unsigned NumArgs);
    108 
    109   BlockCommandComment *parseBlockCommand();
    110   InlineCommandComment *parseInlineCommand();
    111 
    112   HTMLStartTagComment *parseHTMLStartTag();
    113   HTMLEndTagComment *parseHTMLEndTag();
    114 
    115   BlockContentComment *parseParagraphOrBlockCommand();
    116 
    117   VerbatimBlockComment *parseVerbatimBlock();
    118   VerbatimLineComment *parseVerbatimLine();
    119   BlockContentComment *parseBlockContent();
    120   FullComment *parseFullComment();
    121 };
    122 
    123 } // end namespace comments
    124 } // end namespace clang
    125 
    126 #endif
    127 
    128