CommentSema.h revision 3d986980bd02594b1a5aa7b9f9f68d201621ced7
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
17a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko#include "clang/Basic/Diagnostic.h"
188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/Basic/SourceLocation.h"
198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/Comment.h"
208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/ArrayRef.h"
218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/StringRef.h"
228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/Support/Allocator.h"
238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang {
25a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoclass Decl;
26a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoclass FunctionDecl;
27a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoclass ParmVarDecl;
28a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoclass SourceMgr;
29a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments {
318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass Sema {
33a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Allocator for AST nodes.
348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  llvm::BumpPtrAllocator &Allocator;
358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
36a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Source manager for the comment being parsed.
37a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  const SourceManager &SourceMgr;
38a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
39a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  DiagnosticsEngine &Diags;
40a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
41a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  const Decl *ThisDecl;
42a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
43a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
44a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    return Diags.Report(Loc, DiagID);
45a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  }
46a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
47a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// A stack of HTML tags that are currently open (not matched with closing
48a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// tags).
49a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  SmallVector<HTMLOpenTagComment *, 8> HTMLOpenTags;
50a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic:
52a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  Sema(llvm::BumpPtrAllocator &Allocator, const SourceManager &SourceMgr,
53a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko       DiagnosticsEngine &Diags);
54a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
55a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  void setDecl(const Decl *D);
568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ParagraphComment *actOnParagraphComment(
588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko      ArrayRef<InlineContentComment *> Content);
598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  BlockCommandComment *actOnBlockCommandStart(SourceLocation LocBegin,
618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                              SourceLocation LocEnd,
628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                              StringRef Name);
638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  BlockCommandComment *actOnBlockCommandArgs(
658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                              BlockCommandComment *Command,
668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                              ArrayRef<BlockCommandComment::Argument> Args);
678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  BlockCommandComment *actOnBlockCommandFinish(BlockCommandComment *Command,
698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                               ParagraphComment *Paragraph);
708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ParamCommandComment *actOnParamCommandStart(SourceLocation LocBegin,
728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                              SourceLocation LocEnd,
738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                              StringRef Name);
748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
75a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  ParamCommandComment *actOnParamCommandDirectionArg(
76a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                            ParamCommandComment *Command,
778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                            SourceLocation ArgLocBegin,
788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                            SourceLocation ArgLocEnd,
79a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                            StringRef Arg);
80a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
81a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  ParamCommandComment *actOnParamCommandParamNameArg(
82a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                            ParamCommandComment *Command,
83a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                            SourceLocation ArgLocBegin,
84a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                            SourceLocation ArgLocEnd,
85a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                            StringRef Arg);
868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ParamCommandComment *actOnParamCommandFinish(ParamCommandComment *Command,
888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                               ParagraphComment *Paragraph);
898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  InlineCommandComment *actOnInlineCommand(SourceLocation CommandLocBegin,
918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           SourceLocation CommandLocEnd,
928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           StringRef CommandName);
938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  InlineCommandComment *actOnInlineCommand(SourceLocation CommandLocBegin,
958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           SourceLocation CommandLocEnd,
968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           StringRef CommandName,
978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           SourceLocation ArgLocBegin,
988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           SourceLocation ArgLocEnd,
998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                           StringRef Arg);
1008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  InlineContentComment *actOnUnknownCommand(SourceLocation LocBegin,
1028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                            SourceLocation LocEnd,
1038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                            StringRef Name);
1048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  TextComment *actOnText(SourceLocation LocBegin,
1068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                         SourceLocation LocEnd,
1078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                         StringRef Text);
1088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimBlockComment *actOnVerbatimBlockStart(SourceLocation Loc,
1108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                                StringRef Name);
1118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimBlockLineComment *actOnVerbatimBlockLine(SourceLocation Loc,
1138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                                   StringRef Text);
1148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimBlockComment *actOnVerbatimBlockFinish(
1168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                              VerbatimBlockComment *Block,
1178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                              SourceLocation CloseNameLocBegin,
1188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                              StringRef CloseName,
1198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                              ArrayRef<VerbatimBlockLineComment *> Lines);
1208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  VerbatimLineComment *actOnVerbatimLine(SourceLocation LocBegin,
1228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                         StringRef Name,
1238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                         SourceLocation TextBegin,
1248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                         StringRef Text);
1258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  HTMLOpenTagComment *actOnHTMLOpenTagStart(SourceLocation LocBegin,
1278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                            StringRef TagName);
1288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  HTMLOpenTagComment *actOnHTMLOpenTagFinish(
1308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                              HTMLOpenTagComment *Tag,
1318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                              ArrayRef<HTMLOpenTagComment::Attribute> Attrs,
132a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                              SourceLocation GreaterLoc,
133a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                              bool IsSelfClosing);
1348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  HTMLCloseTagComment *actOnHTMLCloseTag(SourceLocation LocBegin,
1368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                         SourceLocation LocEnd,
1378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko                                         StringRef TagName);
1388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  FullComment *actOnFullComment(ArrayRef<BlockContentComment *> Blocks);
1408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
141a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  void checkBlockCommandEmptyParagraph(BlockCommandComment *Command);
142a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
143a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Returns index of a function parameter with a given name.
144a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  unsigned resolveParmVarReference(StringRef Name,
145a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                   const ParmVarDecl * const *ParamVars,
146a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                   unsigned NumParams);
147a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
148a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// Returns index of a function parameter with the name closest to a given
149a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  /// typo.
150a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  unsigned correctTypoInParmVarReference(StringRef Typo,
151a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                         const ParmVarDecl * const *ParamVars,
152a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko                                         unsigned NumParams);
153a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  bool isBlockCommand(StringRef Name);
1558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  bool isParamCommand(StringRef Name);
1568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  unsigned getBlockCommandNumArgs(StringRef Name);
1578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  bool isInlineCommand(StringRef Name);
1593d986980bd02594b1a5aa7b9f9f68d201621ced7Dmitri Gribenko
1603d986980bd02594b1a5aa7b9f9f68d201621ced7Dmitri Gribenko  bool isHTMLCloseTagOptional(StringRef Name);
1613d986980bd02594b1a5aa7b9f9f68d201621ced7Dmitri Gribenko  bool isHTMLCloseTagForbidden(StringRef Name);
1628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko};
1638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments
1658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang
1668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#endif
1688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
169