18d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===--- CommentSema.h - Doxygen comment semantic analysis ------*- 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 semantic analysis class for Doxygen comments.
118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//
128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===//
138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#ifndef LLVM_CLANG_AST_COMMENT_SEMA_H
158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define LLVM_CLANG_AST_COMMENT_SEMA_H
168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1730a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/AST/Comment.h"
18a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko#include "clang/Basic/Diagnostic.h"
198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/Basic/SourceLocation.h"
208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/ArrayRef.h"
2196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko#include "llvm/ADT/StringMap.h"
2230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/StringRef.h"
238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/Support/Allocator.h"
248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang {
26a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoclass Decl;
27a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoclass SourceMgr;
281952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenkoclass Preprocessor;
29a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments {
31aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkoclass CommandTraits;
328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass Sema {
34da5922f4864b5da254c6676af8833c42adaa6d86Dmitri Gribenko  Sema(const Sema &) LLVM_DELETED_FUNCTION;
35da5922f4864b5da254c6676af8833c42adaa6d86Dmitri Gribenko  void operator=(const Sema &) LLVM_DELETED_FUNCTION;
366f36366c85dc81d67d70efdeeea4cfc382053febDmitri Gribenko
37a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Allocator for AST nodes.
388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  llvm::BumpPtrAllocator &Allocator;
398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
40a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Source manager for the comment being parsed.
41a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  const SourceManager &SourceMgr;
42a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
43a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  DiagnosticsEngine &Diags;
44a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
45e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  CommandTraits &Traits;
46aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
471952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  const Preprocessor *PP;
481952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko
491ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  /// Information about the declaration this comment is attached to.
501ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  DeclInfo *ThisDeclInfo;
518487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko
5296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  /// Comment AST nodes that correspond to parameter names in
5396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  /// \c TemplateParameters.
5496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  ///
551ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  /// Contains a valid value if \c DeclInfo->IsFilled is true.
5696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  llvm::StringMap<TParamCommandComment *> TemplateParameterDocs;
5796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
589443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko  /// AST node for the \\brief command and its aliases.
599443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko  const BlockCommandComment *BriefCommand;
609443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko
61f843a580c4a54ca147f22422ee8ccfd2347784fcFariborz Jahanian  /// AST node for the \\headerfile command.
62f843a580c4a54ca147f22422ee8ccfd2347784fcFariborz Jahanian  const BlockCommandComment *HeaderfileCommand;
639443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko
64a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
65a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    return Diags.Report(Loc, DiagID);
66a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  }
67a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
68a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// A stack of HTML tags that are currently open (not matched with closing
69a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// tags).
703f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  SmallVector<HTMLStartTagComment *, 8> HTMLOpenTags;
71a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic:
73a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  Sema(llvm::BumpPtrAllocator &Allocator, const SourceManager &SourceMgr,
741952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko       DiagnosticsEngine &Diags, CommandTraits &Traits,
751952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko       const Preprocessor *PP);
76a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
77a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  void setDecl(const Decl *D);
788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  /// Returns a copy of array, owned by Sema's allocator.
8096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  template<typename T>
8196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  ArrayRef<T> copyArray(ArrayRef<T> Source) {
8296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    size_t Size = Source.size();
8396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    if (Size != 0) {
8496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      T *Mem = Allocator.Allocate<T>(Size);
8596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      std::uninitialized_copy(Source.begin(), Source.end(), Mem);
8696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      return llvm::makeArrayRef(Mem, Size);
876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return ArrayRef<T>();
8996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  }
9096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ParagraphComment *actOnParagraphComment(
928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko      ArrayRef<InlineContentComment *> Content);
938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  BlockCommandComment *actOnBlockCommandStart(SourceLocation LocBegin,
958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                              SourceLocation LocEnd,
968536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian                                              unsigned CommandID,
97808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko                                              CommandMarkerKind CommandMarker);
988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
997d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnBlockCommandArgs(BlockCommandComment *Command,
1007d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                             ArrayRef<BlockCommandComment::Argument> Args);
1018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1027d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnBlockCommandFinish(BlockCommandComment *Command,
1037d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                               ParagraphComment *Paragraph);
1048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ParamCommandComment *actOnParamCommandStart(SourceLocation LocBegin,
1068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                              SourceLocation LocEnd,
1078536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian                                              unsigned CommandID,
108808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko                                              CommandMarkerKind CommandMarker);
1098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1107d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnParamCommandDirectionArg(ParamCommandComment *Command,
1117d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                     SourceLocation ArgLocBegin,
1127d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                     SourceLocation ArgLocEnd,
1137d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                     StringRef Arg);
114a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1157d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnParamCommandParamNameArg(ParamCommandComment *Command,
1167d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                     SourceLocation ArgLocBegin,
1177d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                     SourceLocation ArgLocEnd,
1187d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                     StringRef Arg);
1198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1207d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnParamCommandFinish(ParamCommandComment *Command,
1217d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                               ParagraphComment *Paragraph);
1228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
12396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  TParamCommandComment *actOnTParamCommandStart(SourceLocation LocBegin,
12496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko                                                SourceLocation LocEnd,
1258536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian                                                unsigned CommandID,
126808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko                                                CommandMarkerKind CommandMarker);
12796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
1287d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnTParamCommandParamNameArg(TParamCommandComment *Command,
1297d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                      SourceLocation ArgLocBegin,
1307d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                      SourceLocation ArgLocEnd,
1317d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                      StringRef Arg);
13296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
1337d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnTParamCommandFinish(TParamCommandComment *Command,
1347d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                ParagraphComment *Paragraph);
13596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
1368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  InlineCommandComment *actOnInlineCommand(SourceLocation CommandLocBegin,
1378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           SourceLocation CommandLocEnd,
138e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko                                           unsigned CommandID);
1398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  InlineCommandComment *actOnInlineCommand(SourceLocation CommandLocBegin,
1418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           SourceLocation CommandLocEnd,
142e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko                                           unsigned CommandID,
1438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           SourceLocation ArgLocBegin,
1448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           SourceLocation ArgLocEnd,
1458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           StringRef Arg);
1468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  InlineContentComment *actOnUnknownCommand(SourceLocation LocBegin,
1488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                            SourceLocation LocEnd,
149b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko                                            StringRef CommandName);
150b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko
151b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko  InlineContentComment *actOnUnknownCommand(SourceLocation LocBegin,
152b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko                                            SourceLocation LocEnd,
153b0b8a96df25660cbdbf35d23c3ff5887c33f82f9Dmitri Gribenko                                            unsigned CommandID);
1548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  TextComment *actOnText(SourceLocation LocBegin,
1568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                         SourceLocation LocEnd,
1578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                         StringRef Text);
1588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimBlockComment *actOnVerbatimBlockStart(SourceLocation Loc,
160e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko                                                unsigned CommandID);
1618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimBlockLineComment *actOnVerbatimBlockLine(SourceLocation Loc,
1638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                                   StringRef Text);
1648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1657d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnVerbatimBlockFinish(VerbatimBlockComment *Block,
1667d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                SourceLocation CloseNameLocBegin,
1677d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                StringRef CloseName,
1687d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                                ArrayRef<VerbatimBlockLineComment *> Lines);
1698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimLineComment *actOnVerbatimLine(SourceLocation LocBegin,
171e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko                                         unsigned CommandID,
1728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                         SourceLocation TextBegin,
1738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                         StringRef Text);
1748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1753f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  HTMLStartTagComment *actOnHTMLStartTagStart(SourceLocation LocBegin,
1763f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko                                              StringRef TagName);
1778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1787d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko  void actOnHTMLStartTagFinish(HTMLStartTagComment *Tag,
1797d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                               ArrayRef<HTMLStartTagComment::Attribute> Attrs,
1807d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                               SourceLocation GreaterLoc,
1817d9b51107999c1c1fada7319c4687fe570eb2c0bDmitri Gribenko                               bool IsSelfClosing);
1828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1833f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  HTMLEndTagComment *actOnHTMLEndTag(SourceLocation LocBegin,
1843f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko                                     SourceLocation LocEnd,
1853f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko                                     StringRef TagName);
1868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  FullComment *actOnFullComment(ArrayRef<BlockContentComment *> Blocks);
1888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
189a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  void checkBlockCommandEmptyParagraph(BlockCommandComment *Command);
190a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
19189ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko  void checkReturnsCommand(const BlockCommandComment *Command);
19289ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko
1939443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko  /// Emit diagnostics about duplicate block commands that should be
1949443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko  /// used only once per comment, e.g., \\brief and \\returns.
1959443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko  void checkBlockCommandDuplicate(const BlockCommandComment *Command);
1969443c57150e870e308406e1e4e6d9d64712b417eDmitri Gribenko
1970bd9838751384181ff387f2fb346896792b89617Dmitri Gribenko  void checkDeprecatedCommand(const BlockCommandComment *Comment);
1982a268f2629b49958427e8eb02f2c3d565be71accFariborz Jahanian
1992a268f2629b49958427e8eb02f2c3d565be71accFariborz Jahanian  void checkFunctionDeclVerbatimLine(const BlockCommandComment *Comment);
20028c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian
20128c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian  void checkContainerDeclVerbatimLine(const BlockCommandComment *Comment);
20228c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian
20328c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian  void checkContainerDecl(const BlockCommandComment *Comment);
2040bd9838751384181ff387f2fb346896792b89617Dmitri Gribenko
2059edd2c8a2ff6c6326ff2d5b081929e4baaa798edDmitri Gribenko  /// Resolve parameter names to parameter indexes in function declaration.
2069edd2c8a2ff6c6326ff2d5b081929e4baaa798edDmitri Gribenko  /// Emit diagnostics about unknown parametrs.
2079edd2c8a2ff6c6326ff2d5b081929e4baaa798edDmitri Gribenko  void resolveParamCommandIndexes(const FullComment *FC);
2089edd2c8a2ff6c6326ff2d5b081929e4baaa798edDmitri Gribenko
2098487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko  bool isFunctionDecl();
210eb8f69f094e95d0132e4a6817a2111ad188ab087Fariborz Jahanian  bool isAnyFunctionDecl();
211a558d2e29817e36798875c96efb62251e53ff024Dmitri Gribenko
212a558d2e29817e36798875c96efb62251e53ff024Dmitri Gribenko  /// \returns \c true if declaration that this comment is attached to declares
213a558d2e29817e36798875c96efb62251e53ff024Dmitri Gribenko  /// a function pointer.
21499a7057098c56211e641705e1ff38d4b7c8b309dFariborz Jahanian  bool isFunctionPointerVarDecl();
215c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko  bool isFunctionOrMethodVariadic();
21699a7057098c56211e641705e1ff38d4b7c8b309dFariborz Jahanian  bool isObjCMethodDecl();
217664e860beb2550bef24fb8946192f61648a71d7fFariborz Jahanian  bool isObjCPropertyDecl();
21804bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko  bool isTemplateOrSpecialization();
219b421b56d5a83c5bcae576b714ebd9df7b745368dFariborz Jahanian  bool isRecordLikeDecl();
220b421b56d5a83c5bcae576b714ebd9df7b745368dFariborz Jahanian  bool isClassOrStructDecl();
22128c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian  bool isUnionDecl();
22228c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian  bool isObjCInterfaceDecl();
22328c1cd2138f700742235e1e720c1f7e6dc75a11aFariborz Jahanian  bool isObjCProtocolDecl();
2242d588b4bc7127adf1a1c621002dfe452a99fef6fFariborz Jahanian  bool isClassTemplateDecl();
2252d588b4bc7127adf1a1c621002dfe452a99fef6fFariborz Jahanian  bool isFunctionTemplateDecl();
22696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
2278487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko  ArrayRef<const ParmVarDecl *> getParamVars();
2288487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko
2291ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  /// Extract all important semantic information from
2301ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko  /// \c ThisDeclInfo->ThisDecl into \c ThisDeclInfo members.
2318487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko  void inspectThisDecl();
2328487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko
233a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Returns index of a function parameter with a given name.
234a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  unsigned resolveParmVarReference(StringRef Name,
2358487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko                                   ArrayRef<const ParmVarDecl *> ParamVars);
236a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
237a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Returns index of a function parameter with the name closest to a given
238a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// typo.
239a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  unsigned correctTypoInParmVarReference(StringRef Typo,
2408487c524fdfcea3da858fd0af850b4784c8096d0Dmitri Gribenko                                         ArrayRef<const ParmVarDecl *> ParamVars);
241a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
24296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  bool resolveTParamReference(StringRef Name,
24396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko                              const TemplateParameterList *TemplateParameters,
24496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko                              SmallVectorImpl<unsigned> *Position);
24596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
24696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  StringRef correctTypoInTParamReference(
24796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko                              StringRef Typo,
24896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko                              const TemplateParameterList *TemplateParameters);
24996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
2502d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  InlineCommandComment::RenderKind
2512d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  getInlineCommandRenderKind(StringRef Name) const;
2528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko};
2538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
2548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments
2558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang
2568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
2578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#endif
2588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
259