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