xref: /aosp_15_r20/external/clang/include/clang/AST/CommentSema.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- CommentSema.h - Doxygen comment semantic analysis ------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li //  This file defines the semantic analysis class for Doxygen comments.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #ifndef LLVM_CLANG_AST_COMMENTSEMA_H
15*67e74705SXin Li #define LLVM_CLANG_AST_COMMENTSEMA_H
16*67e74705SXin Li 
17*67e74705SXin Li #include "clang/AST/Comment.h"
18*67e74705SXin Li #include "clang/Basic/Diagnostic.h"
19*67e74705SXin Li #include "clang/Basic/SourceLocation.h"
20*67e74705SXin Li #include "llvm/ADT/ArrayRef.h"
21*67e74705SXin Li #include "llvm/ADT/StringMap.h"
22*67e74705SXin Li #include "llvm/ADT/StringRef.h"
23*67e74705SXin Li #include "llvm/Support/Allocator.h"
24*67e74705SXin Li 
25*67e74705SXin Li namespace clang {
26*67e74705SXin Li class Decl;
27*67e74705SXin Li class SourceMgr;
28*67e74705SXin Li class Preprocessor;
29*67e74705SXin Li 
30*67e74705SXin Li namespace comments {
31*67e74705SXin Li class CommandTraits;
32*67e74705SXin Li 
33*67e74705SXin Li class Sema {
34*67e74705SXin Li   Sema(const Sema &) = delete;
35*67e74705SXin Li   void operator=(const Sema &) = delete;
36*67e74705SXin Li 
37*67e74705SXin Li   /// Allocator for AST nodes.
38*67e74705SXin Li   llvm::BumpPtrAllocator &Allocator;
39*67e74705SXin Li 
40*67e74705SXin Li   /// Source manager for the comment being parsed.
41*67e74705SXin Li   const SourceManager &SourceMgr;
42*67e74705SXin Li 
43*67e74705SXin Li   DiagnosticsEngine &Diags;
44*67e74705SXin Li 
45*67e74705SXin Li   CommandTraits &Traits;
46*67e74705SXin Li 
47*67e74705SXin Li   const Preprocessor *PP;
48*67e74705SXin Li 
49*67e74705SXin Li   /// Information about the declaration this comment is attached to.
50*67e74705SXin Li   DeclInfo *ThisDeclInfo;
51*67e74705SXin Li 
52*67e74705SXin Li   /// Comment AST nodes that correspond to parameter names in
53*67e74705SXin Li   /// \c TemplateParameters.
54*67e74705SXin Li   ///
55*67e74705SXin Li   /// Contains a valid value if \c DeclInfo->IsFilled is true.
56*67e74705SXin Li   llvm::StringMap<TParamCommandComment *> TemplateParameterDocs;
57*67e74705SXin Li 
58*67e74705SXin Li   /// AST node for the \\brief command and its aliases.
59*67e74705SXin Li   const BlockCommandComment *BriefCommand;
60*67e74705SXin Li 
61*67e74705SXin Li   /// AST node for the \\headerfile command.
62*67e74705SXin Li   const BlockCommandComment *HeaderfileCommand;
63*67e74705SXin Li 
Diag(SourceLocation Loc,unsigned DiagID)64*67e74705SXin Li   DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
65*67e74705SXin Li     return Diags.Report(Loc, DiagID);
66*67e74705SXin Li   }
67*67e74705SXin Li 
68*67e74705SXin Li   /// A stack of HTML tags that are currently open (not matched with closing
69*67e74705SXin Li   /// tags).
70*67e74705SXin Li   SmallVector<HTMLStartTagComment *, 8> HTMLOpenTags;
71*67e74705SXin Li 
72*67e74705SXin Li public:
73*67e74705SXin Li   Sema(llvm::BumpPtrAllocator &Allocator, const SourceManager &SourceMgr,
74*67e74705SXin Li        DiagnosticsEngine &Diags, CommandTraits &Traits,
75*67e74705SXin Li        const Preprocessor *PP);
76*67e74705SXin Li 
77*67e74705SXin Li   void setDecl(const Decl *D);
78*67e74705SXin Li 
79*67e74705SXin Li   /// Returns a copy of array, owned by Sema's allocator.
80*67e74705SXin Li   template<typename T>
copyArray(ArrayRef<T> Source)81*67e74705SXin Li   ArrayRef<T> copyArray(ArrayRef<T> Source) {
82*67e74705SXin Li     if (!Source.empty())
83*67e74705SXin Li       return Source.copy(Allocator);
84*67e74705SXin Li     return None;
85*67e74705SXin Li   }
86*67e74705SXin Li 
87*67e74705SXin Li   ParagraphComment *actOnParagraphComment(
88*67e74705SXin Li       ArrayRef<InlineContentComment *> Content);
89*67e74705SXin Li 
90*67e74705SXin Li   BlockCommandComment *actOnBlockCommandStart(SourceLocation LocBegin,
91*67e74705SXin Li                                               SourceLocation LocEnd,
92*67e74705SXin Li                                               unsigned CommandID,
93*67e74705SXin Li                                               CommandMarkerKind CommandMarker);
94*67e74705SXin Li 
95*67e74705SXin Li   void actOnBlockCommandArgs(BlockCommandComment *Command,
96*67e74705SXin Li                              ArrayRef<BlockCommandComment::Argument> Args);
97*67e74705SXin Li 
98*67e74705SXin Li   void actOnBlockCommandFinish(BlockCommandComment *Command,
99*67e74705SXin Li                                ParagraphComment *Paragraph);
100*67e74705SXin Li 
101*67e74705SXin Li   ParamCommandComment *actOnParamCommandStart(SourceLocation LocBegin,
102*67e74705SXin Li                                               SourceLocation LocEnd,
103*67e74705SXin Li                                               unsigned CommandID,
104*67e74705SXin Li                                               CommandMarkerKind CommandMarker);
105*67e74705SXin Li 
106*67e74705SXin Li   void actOnParamCommandDirectionArg(ParamCommandComment *Command,
107*67e74705SXin Li                                      SourceLocation ArgLocBegin,
108*67e74705SXin Li                                      SourceLocation ArgLocEnd,
109*67e74705SXin Li                                      StringRef Arg);
110*67e74705SXin Li 
111*67e74705SXin Li   void actOnParamCommandParamNameArg(ParamCommandComment *Command,
112*67e74705SXin Li                                      SourceLocation ArgLocBegin,
113*67e74705SXin Li                                      SourceLocation ArgLocEnd,
114*67e74705SXin Li                                      StringRef Arg);
115*67e74705SXin Li 
116*67e74705SXin Li   void actOnParamCommandFinish(ParamCommandComment *Command,
117*67e74705SXin Li                                ParagraphComment *Paragraph);
118*67e74705SXin Li 
119*67e74705SXin Li   TParamCommandComment *actOnTParamCommandStart(SourceLocation LocBegin,
120*67e74705SXin Li                                                 SourceLocation LocEnd,
121*67e74705SXin Li                                                 unsigned CommandID,
122*67e74705SXin Li                                                 CommandMarkerKind CommandMarker);
123*67e74705SXin Li 
124*67e74705SXin Li   void actOnTParamCommandParamNameArg(TParamCommandComment *Command,
125*67e74705SXin Li                                       SourceLocation ArgLocBegin,
126*67e74705SXin Li                                       SourceLocation ArgLocEnd,
127*67e74705SXin Li                                       StringRef Arg);
128*67e74705SXin Li 
129*67e74705SXin Li   void actOnTParamCommandFinish(TParamCommandComment *Command,
130*67e74705SXin Li                                 ParagraphComment *Paragraph);
131*67e74705SXin Li 
132*67e74705SXin Li   InlineCommandComment *actOnInlineCommand(SourceLocation CommandLocBegin,
133*67e74705SXin Li                                            SourceLocation CommandLocEnd,
134*67e74705SXin Li                                            unsigned CommandID);
135*67e74705SXin Li 
136*67e74705SXin Li   InlineCommandComment *actOnInlineCommand(SourceLocation CommandLocBegin,
137*67e74705SXin Li                                            SourceLocation CommandLocEnd,
138*67e74705SXin Li                                            unsigned CommandID,
139*67e74705SXin Li                                            SourceLocation ArgLocBegin,
140*67e74705SXin Li                                            SourceLocation ArgLocEnd,
141*67e74705SXin Li                                            StringRef Arg);
142*67e74705SXin Li 
143*67e74705SXin Li   InlineContentComment *actOnUnknownCommand(SourceLocation LocBegin,
144*67e74705SXin Li                                             SourceLocation LocEnd,
145*67e74705SXin Li                                             StringRef CommandName);
146*67e74705SXin Li 
147*67e74705SXin Li   InlineContentComment *actOnUnknownCommand(SourceLocation LocBegin,
148*67e74705SXin Li                                             SourceLocation LocEnd,
149*67e74705SXin Li                                             unsigned CommandID);
150*67e74705SXin Li 
151*67e74705SXin Li   TextComment *actOnText(SourceLocation LocBegin,
152*67e74705SXin Li                          SourceLocation LocEnd,
153*67e74705SXin Li                          StringRef Text);
154*67e74705SXin Li 
155*67e74705SXin Li   VerbatimBlockComment *actOnVerbatimBlockStart(SourceLocation Loc,
156*67e74705SXin Li                                                 unsigned CommandID);
157*67e74705SXin Li 
158*67e74705SXin Li   VerbatimBlockLineComment *actOnVerbatimBlockLine(SourceLocation Loc,
159*67e74705SXin Li                                                    StringRef Text);
160*67e74705SXin Li 
161*67e74705SXin Li   void actOnVerbatimBlockFinish(VerbatimBlockComment *Block,
162*67e74705SXin Li                                 SourceLocation CloseNameLocBegin,
163*67e74705SXin Li                                 StringRef CloseName,
164*67e74705SXin Li                                 ArrayRef<VerbatimBlockLineComment *> Lines);
165*67e74705SXin Li 
166*67e74705SXin Li   VerbatimLineComment *actOnVerbatimLine(SourceLocation LocBegin,
167*67e74705SXin Li                                          unsigned CommandID,
168*67e74705SXin Li                                          SourceLocation TextBegin,
169*67e74705SXin Li                                          StringRef Text);
170*67e74705SXin Li 
171*67e74705SXin Li   HTMLStartTagComment *actOnHTMLStartTagStart(SourceLocation LocBegin,
172*67e74705SXin Li                                               StringRef TagName);
173*67e74705SXin Li 
174*67e74705SXin Li   void actOnHTMLStartTagFinish(HTMLStartTagComment *Tag,
175*67e74705SXin Li                                ArrayRef<HTMLStartTagComment::Attribute> Attrs,
176*67e74705SXin Li                                SourceLocation GreaterLoc,
177*67e74705SXin Li                                bool IsSelfClosing);
178*67e74705SXin Li 
179*67e74705SXin Li   HTMLEndTagComment *actOnHTMLEndTag(SourceLocation LocBegin,
180*67e74705SXin Li                                      SourceLocation LocEnd,
181*67e74705SXin Li                                      StringRef TagName);
182*67e74705SXin Li 
183*67e74705SXin Li   FullComment *actOnFullComment(ArrayRef<BlockContentComment *> Blocks);
184*67e74705SXin Li 
185*67e74705SXin Li   void checkBlockCommandEmptyParagraph(BlockCommandComment *Command);
186*67e74705SXin Li 
187*67e74705SXin Li   void checkReturnsCommand(const BlockCommandComment *Command);
188*67e74705SXin Li 
189*67e74705SXin Li   /// Emit diagnostics about duplicate block commands that should be
190*67e74705SXin Li   /// used only once per comment, e.g., \\brief and \\returns.
191*67e74705SXin Li   void checkBlockCommandDuplicate(const BlockCommandComment *Command);
192*67e74705SXin Li 
193*67e74705SXin Li   void checkDeprecatedCommand(const BlockCommandComment *Comment);
194*67e74705SXin Li 
195*67e74705SXin Li   void checkFunctionDeclVerbatimLine(const BlockCommandComment *Comment);
196*67e74705SXin Li 
197*67e74705SXin Li   void checkContainerDeclVerbatimLine(const BlockCommandComment *Comment);
198*67e74705SXin Li 
199*67e74705SXin Li   void checkContainerDecl(const BlockCommandComment *Comment);
200*67e74705SXin Li 
201*67e74705SXin Li   /// Resolve parameter names to parameter indexes in function declaration.
202*67e74705SXin Li   /// Emit diagnostics about unknown parametrs.
203*67e74705SXin Li   void resolveParamCommandIndexes(const FullComment *FC);
204*67e74705SXin Li 
205*67e74705SXin Li   bool isFunctionDecl();
206*67e74705SXin Li   bool isAnyFunctionDecl();
207*67e74705SXin Li 
208*67e74705SXin Li   /// \returns \c true if declaration that this comment is attached to declares
209*67e74705SXin Li   /// a function pointer.
210*67e74705SXin Li   bool isFunctionPointerVarDecl();
211*67e74705SXin Li   bool isFunctionOrMethodVariadic();
212*67e74705SXin Li   bool isObjCMethodDecl();
213*67e74705SXin Li   bool isObjCPropertyDecl();
214*67e74705SXin Li   bool isTemplateOrSpecialization();
215*67e74705SXin Li   bool isRecordLikeDecl();
216*67e74705SXin Li   bool isClassOrStructDecl();
217*67e74705SXin Li   bool isUnionDecl();
218*67e74705SXin Li   bool isObjCInterfaceDecl();
219*67e74705SXin Li   bool isObjCProtocolDecl();
220*67e74705SXin Li   bool isClassTemplateDecl();
221*67e74705SXin Li   bool isFunctionTemplateDecl();
222*67e74705SXin Li 
223*67e74705SXin Li   ArrayRef<const ParmVarDecl *> getParamVars();
224*67e74705SXin Li 
225*67e74705SXin Li   /// Extract all important semantic information from
226*67e74705SXin Li   /// \c ThisDeclInfo->ThisDecl into \c ThisDeclInfo members.
227*67e74705SXin Li   void inspectThisDecl();
228*67e74705SXin Li 
229*67e74705SXin Li   /// Returns index of a function parameter with a given name.
230*67e74705SXin Li   unsigned resolveParmVarReference(StringRef Name,
231*67e74705SXin Li                                    ArrayRef<const ParmVarDecl *> ParamVars);
232*67e74705SXin Li 
233*67e74705SXin Li   /// Returns index of a function parameter with the name closest to a given
234*67e74705SXin Li   /// typo.
235*67e74705SXin Li   unsigned correctTypoInParmVarReference(StringRef Typo,
236*67e74705SXin Li                                          ArrayRef<const ParmVarDecl *> ParamVars);
237*67e74705SXin Li 
238*67e74705SXin Li   bool resolveTParamReference(StringRef Name,
239*67e74705SXin Li                               const TemplateParameterList *TemplateParameters,
240*67e74705SXin Li                               SmallVectorImpl<unsigned> *Position);
241*67e74705SXin Li 
242*67e74705SXin Li   StringRef correctTypoInTParamReference(
243*67e74705SXin Li                               StringRef Typo,
244*67e74705SXin Li                               const TemplateParameterList *TemplateParameters);
245*67e74705SXin Li 
246*67e74705SXin Li   InlineCommandComment::RenderKind
247*67e74705SXin Li   getInlineCommandRenderKind(StringRef Name) const;
248*67e74705SXin Li };
249*67e74705SXin Li 
250*67e74705SXin Li } // end namespace comments
251*67e74705SXin Li } // end namespace clang
252*67e74705SXin Li 
253*67e74705SXin Li #endif
254*67e74705SXin Li 
255