18d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===--- CommentParser.h - Doxygen comment parser ---------------*- C++ -*-===//
28d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
38d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//                     The LLVM Compiler Infrastructure
48d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
58d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// This file is distributed under the University of Illinois Open Source
68d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// License. See LICENSE.TXT for details.
78d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
88d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===//
98d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//  This file defines the Doxygen comment parser.
118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===//
138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#ifndef LLVM_CLANG_AST_COMMENT_PARSER_H
158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define LLVM_CLANG_AST_COMMENT_PARSER_H
168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/Comment.h"
1830a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/AST/CommentLexer.h"
198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentSema.h"
2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/Diagnostic.h"
218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/Support/Allocator.h"
228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang {
24a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoclass SourceManager;
25a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments {
27aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkoclass CommandTraits;
288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Doxygen comment parser.
308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass Parser {
31da5922f4864b5da254c6676af8833c42adaa6d86Dmitri Gribenko  Parser(const Parser &) LLVM_DELETED_FUNCTION;
32da5922f4864b5da254c6676af8833c42adaa6d86Dmitri Gribenko  void operator=(const Parser &) LLVM_DELETED_FUNCTION;
336f36366c85dc81d67d70efdeeea4cfc382053febDmitri Gribenko
34db13f04dd0579874932bdb958647d0903f632dd4Dmitri Gribenko  friend class TextTokenRetokenizer;
35db13f04dd0579874932bdb958647d0903f632dd4Dmitri Gribenko
368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  Lexer &L;
378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  Sema &S;
398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
40a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Allocator for anything that goes into AST nodes.
418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  llvm::BumpPtrAllocator &Allocator;
428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
43a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Source manager for the comment being parsed.
44a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  const SourceManager &SourceMgr;
45a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
46a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  DiagnosticsEngine &Diags;
47a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
48a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
49a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    return Diags.Report(Loc, DiagID);
50a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  }
51a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
52aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  const CommandTraits &Traits;
53aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  /// Current lookahead token.  We can safely assume that all tokens are from
558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  /// a single source file.
568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  Token Tok;
578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  /// A stack of additional lookahead tokens.
598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  SmallVector<Token, 8> MoreLATokens;
608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
617d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void consumeToken() {
628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    if (MoreLATokens.empty())
638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko      L.lex(Tok);
64344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm    else
65344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm      Tok = MoreLATokens.pop_back_val();
668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  void putBack(const Token &OldTok) {
698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    MoreLATokens.push_back(Tok);
708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    Tok = OldTok;
718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  void putBack(ArrayRef<Token> Toks) {
748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    if (Toks.empty())
758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko      return;
768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    MoreLATokens.push_back(Tok);
788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    for (const Token *I = &Toks.back(),
79fd939162ff99a0084ed22a08dd37c149a0883a2bDmitri Gribenko         *B = &Toks.front();
808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko         I != B; --I) {
818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko      MoreLATokens.push_back(*I);
828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    }
838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    Tok = Toks[0];
858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
8710442564e1ba3c4dfb184cc4e36beffbee4811c3Dmitri Gribenko  bool isTokBlockCommand() {
888536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian    return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) &&
8910442564e1ba3c4dfb184cc4e36beffbee4811c3Dmitri Gribenko           Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand;
9010442564e1ba3c4dfb184cc4e36beffbee4811c3Dmitri Gribenko  }
9110442564e1ba3c4dfb184cc4e36beffbee4811c3Dmitri Gribenko
928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic:
93a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator,
94aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko         const SourceManager &SourceMgr, DiagnosticsEngine &Diags,
95aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko         const CommandTraits &Traits);
968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  /// Parse arguments for \\param command.
987d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void parseParamCommandArgs(ParamCommandComment *PC,
997d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                             TextTokenRetokenizer &Retokenizer);
1008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
10196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  /// Parse arguments for \\tparam command.
1027d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void parseTParamCommandArgs(TParamCommandComment *TPC,
1037d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                              TextTokenRetokenizer &Retokenizer);
1047d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko
1057d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void parseBlockCommandArgs(BlockCommandComment *BC,
1067d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                             TextTokenRetokenizer &Retokenizer,
1077d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                             unsigned NumArgs);
1088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  BlockCommandComment *parseBlockCommand();
1108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  InlineCommandComment *parseInlineCommand();
1118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1123f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  HTMLStartTagComment *parseHTMLStartTag();
1133f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  HTMLEndTagComment *parseHTMLEndTag();
1148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  BlockContentComment *parseParagraphOrBlockCommand();
1168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimBlockComment *parseVerbatimBlock();
1188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimLineComment *parseVerbatimLine();
1198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  BlockContentComment *parseBlockContent();
1208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  FullComment *parseFullComment();
1218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko};
1228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments
1248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang
1258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#endif
1278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
128