1239313Sdim//===--- CommentParser.h - Doxygen comment parser ---------------*- C++ -*-===//
2239313Sdim//
3239313Sdim//                     The LLVM Compiler Infrastructure
4239313Sdim//
5239313Sdim// This file is distributed under the University of Illinois Open Source
6239313Sdim// License. See LICENSE.TXT for details.
7239313Sdim//
8239313Sdim//===----------------------------------------------------------------------===//
9239313Sdim//
10239313Sdim//  This file defines the Doxygen comment parser.
11239313Sdim//
12239313Sdim//===----------------------------------------------------------------------===//
13239313Sdim
14239313Sdim#ifndef LLVM_CLANG_AST_COMMENT_PARSER_H
15239313Sdim#define LLVM_CLANG_AST_COMMENT_PARSER_H
16239313Sdim
17249423Sdim#include "clang/AST/Comment.h"
18239313Sdim#include "clang/AST/CommentLexer.h"
19239313Sdim#include "clang/AST/CommentSema.h"
20249423Sdim#include "clang/Basic/Diagnostic.h"
21239313Sdim#include "llvm/Support/Allocator.h"
22239313Sdim
23239313Sdimnamespace clang {
24239313Sdimclass SourceManager;
25239313Sdim
26239313Sdimnamespace comments {
27239313Sdimclass CommandTraits;
28239313Sdim
29239313Sdim/// Doxygen comment parser.
30239313Sdimclass Parser {
31243830Sdim  Parser(const Parser &) LLVM_DELETED_FUNCTION;
32243830Sdim  void operator=(const Parser &) LLVM_DELETED_FUNCTION;
33239313Sdim
34239313Sdim  friend class TextTokenRetokenizer;
35239313Sdim
36239313Sdim  Lexer &L;
37239313Sdim
38239313Sdim  Sema &S;
39239313Sdim
40239313Sdim  /// Allocator for anything that goes into AST nodes.
41239313Sdim  llvm::BumpPtrAllocator &Allocator;
42239313Sdim
43239313Sdim  /// Source manager for the comment being parsed.
44239313Sdim  const SourceManager &SourceMgr;
45239313Sdim
46239313Sdim  DiagnosticsEngine &Diags;
47239313Sdim
48239313Sdim  DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
49239313Sdim    return Diags.Report(Loc, DiagID);
50239313Sdim  }
51239313Sdim
52239313Sdim  const CommandTraits &Traits;
53239313Sdim
54239313Sdim  /// Current lookahead token.  We can safely assume that all tokens are from
55239313Sdim  /// a single source file.
56239313Sdim  Token Tok;
57239313Sdim
58239313Sdim  /// A stack of additional lookahead tokens.
59239313Sdim  SmallVector<Token, 8> MoreLATokens;
60239313Sdim
61239313Sdim  void consumeToken() {
62239313Sdim    if (MoreLATokens.empty())
63239313Sdim      L.lex(Tok);
64263508Sdim    else
65263508Sdim      Tok = MoreLATokens.pop_back_val();
66239313Sdim  }
67239313Sdim
68239313Sdim  void putBack(const Token &OldTok) {
69239313Sdim    MoreLATokens.push_back(Tok);
70239313Sdim    Tok = OldTok;
71239313Sdim  }
72239313Sdim
73239313Sdim  void putBack(ArrayRef<Token> Toks) {
74239313Sdim    if (Toks.empty())
75239313Sdim      return;
76239313Sdim
77239313Sdim    MoreLATokens.push_back(Tok);
78239313Sdim    for (const Token *I = &Toks.back(),
79239313Sdim         *B = &Toks.front();
80239313Sdim         I != B; --I) {
81239313Sdim      MoreLATokens.push_back(*I);
82239313Sdim    }
83239313Sdim
84239313Sdim    Tok = Toks[0];
85239313Sdim  }
86239313Sdim
87249423Sdim  bool isTokBlockCommand() {
88249423Sdim    return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) &&
89249423Sdim           Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand;
90249423Sdim  }
91249423Sdim
92239313Sdimpublic:
93239313Sdim  Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator,
94239313Sdim         const SourceManager &SourceMgr, DiagnosticsEngine &Diags,
95239313Sdim         const CommandTraits &Traits);
96239313Sdim
97239313Sdim  /// Parse arguments for \\param command.
98239313Sdim  void parseParamCommandArgs(ParamCommandComment *PC,
99239313Sdim                             TextTokenRetokenizer &Retokenizer);
100239313Sdim
101239313Sdim  /// Parse arguments for \\tparam command.
102239313Sdim  void parseTParamCommandArgs(TParamCommandComment *TPC,
103239313Sdim                              TextTokenRetokenizer &Retokenizer);
104239313Sdim
105239313Sdim  void parseBlockCommandArgs(BlockCommandComment *BC,
106239313Sdim                             TextTokenRetokenizer &Retokenizer,
107239313Sdim                             unsigned NumArgs);
108239313Sdim
109239313Sdim  BlockCommandComment *parseBlockCommand();
110239313Sdim  InlineCommandComment *parseInlineCommand();
111239313Sdim
112239313Sdim  HTMLStartTagComment *parseHTMLStartTag();
113239313Sdim  HTMLEndTagComment *parseHTMLEndTag();
114239313Sdim
115239313Sdim  BlockContentComment *parseParagraphOrBlockCommand();
116239313Sdim
117239313Sdim  VerbatimBlockComment *parseVerbatimBlock();
118239313Sdim  VerbatimLineComment *parseVerbatimLine();
119239313Sdim  BlockContentComment *parseBlockContent();
120239313Sdim  FullComment *parseFullComment();
121239313Sdim};
122239313Sdim
123239313Sdim} // end namespace comments
124239313Sdim} // end namespace clang
125239313Sdim
126239313Sdim#endif
127239313Sdim
128