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_COMMENTPARSER_H
     15 #define LLVM_CLANG_AST_COMMENTPARSER_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 &) = delete;
     32   void operator=(const Parser &) = delete;
     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     MoreLATokens.append(Toks.rbegin(), std::prev(Toks.rend()));
     79 
     80     Tok = Toks[0];
     81   }
     82 
     83   bool isTokBlockCommand() {
     84     return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) &&
     85            Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand;
     86   }
     87 
     88 public:
     89   Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator,
     90          const SourceManager &SourceMgr, DiagnosticsEngine &Diags,
     91          const CommandTraits &Traits);
     92 
     93   /// Parse arguments for \\param command.
     94   void parseParamCommandArgs(ParamCommandComment *PC,
     95                              TextTokenRetokenizer &Retokenizer);
     96 
     97   /// Parse arguments for \\tparam command.
     98   void parseTParamCommandArgs(TParamCommandComment *TPC,
     99                               TextTokenRetokenizer &Retokenizer);
    100 
    101   void parseBlockCommandArgs(BlockCommandComment *BC,
    102                              TextTokenRetokenizer &Retokenizer,
    103                              unsigned NumArgs);
    104 
    105   BlockCommandComment *parseBlockCommand();
    106   InlineCommandComment *parseInlineCommand();
    107 
    108   HTMLStartTagComment *parseHTMLStartTag();
    109   HTMLEndTagComment *parseHTMLEndTag();
    110 
    111   BlockContentComment *parseParagraphOrBlockCommand();
    112 
    113   VerbatimBlockComment *parseVerbatimBlock();
    114   VerbatimLineComment *parseVerbatimLine();
    115   BlockContentComment *parseBlockContent();
    116   FullComment *parseFullComment();
    117 };
    118 
    119 } // end namespace comments
    120 } // end namespace clang
    121 
    122 #endif
    123 
    124