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 
Diag(SourceLocation Loc,unsigned DiagID)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 
consumeToken()61   void consumeToken() {
62     if (MoreLATokens.empty())
63       L.lex(Tok);
64     else
65       Tok = MoreLATokens.pop_back_val();
66   }
67 
putBack(const Token & OldTok)68   void putBack(const Token &OldTok) {
69     MoreLATokens.push_back(Tok);
70     Tok = OldTok;
71   }
72 
putBack(ArrayRef<Token> Toks)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 
isTokBlockCommand()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