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
23namespace clang {
24class SourceManager;
25
26namespace comments {
27class CommandTraits;
28
29/// Doxygen comment parser.
30class 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
88public:
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