clang 22.0.0git
CommentSema.h
Go to the documentation of this file.
1//===--- CommentSema.h - Doxygen comment semantic analysis ------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the semantic analysis class for Doxygen comments.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_COMMENTSEMA_H
14#define LLVM_CLANG_AST_COMMENTSEMA_H
15
16#include "clang/AST/Comment.h"
19#include "llvm/ADT/ArrayRef.h"
20#include "llvm/ADT/StringMap.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/Support/Allocator.h"
23
24namespace clang {
25class Decl;
26class SourceMgr;
27class Preprocessor;
28
29namespace comments {
30class CommandTraits;
31
32class Sema {
33 Sema(const Sema &) = delete;
34 void operator=(const Sema &) = delete;
35
36 /// Allocator for AST nodes.
37 llvm::BumpPtrAllocator &Allocator;
38
39 /// Source manager for the comment being parsed.
40 const SourceManager &SourceMgr;
41
42 DiagnosticsEngine &Diags;
43
44 CommandTraits &Traits;
45
46 const Preprocessor *PP;
47
48 /// Information about the declaration this comment is attached to.
49 DeclInfo *ThisDeclInfo;
50
51 /// Comment AST nodes that correspond to parameter names in
52 /// \c TemplateParameters.
53 ///
54 /// Contains a valid value if \c DeclInfo->IsFilled is true.
55 llvm::StringMap<TParamCommandComment *> TemplateParameterDocs;
56
57 /// AST node for the \command and its aliases.
58 const BlockCommandComment *BriefCommand;
59
60 /// AST node for the \\headerfile command.
61 const BlockCommandComment *HeaderfileCommand;
62
63 DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
64 return Diags.Report(Loc, DiagID);
65 }
66
67 /// A stack of HTML tags that are currently open (not matched with closing
68 /// tags).
70
71public:
72 Sema(llvm::BumpPtrAllocator &Allocator, const SourceManager &SourceMgr,
73 DiagnosticsEngine &Diags, CommandTraits &Traits,
74 const Preprocessor *PP);
75
76 void setDecl(const Decl *D);
77
78 /// Returns a copy of array, owned by Sema's allocator.
79 template<typename T>
81 if (!Source.empty())
82 return Source.copy(Allocator);
83 return {};
84 }
85
88
90 SourceLocation LocEnd,
91 unsigned CommandID,
92 CommandMarkerKind CommandMarker);
93
96
98 ParagraphComment *Paragraph);
99
101 SourceLocation LocEnd,
102 unsigned CommandID,
103 CommandMarkerKind CommandMarker);
104
106 SourceLocation ArgLocBegin,
107 SourceLocation ArgLocEnd,
108 StringRef Arg);
109
111 SourceLocation ArgLocBegin,
112 SourceLocation ArgLocEnd,
113 StringRef Arg);
114
116 ParagraphComment *Paragraph);
117
119 SourceLocation LocEnd,
120 unsigned CommandID,
121 CommandMarkerKind CommandMarker);
122
124 SourceLocation ArgLocBegin,
125 SourceLocation ArgLocEnd,
126 StringRef Arg);
127
129 ParagraphComment *Paragraph);
130
132 SourceLocation CommandLocEnd,
133 unsigned CommandID,
134 CommandMarkerKind CommandMarker,
136
138 SourceLocation LocEnd,
139 StringRef CommandName);
140
142 SourceLocation LocEnd,
143 unsigned CommandID);
144
146 SourceLocation LocEnd,
147 StringRef Text);
148
150 unsigned CommandID);
151
153 StringRef Text);
154
156 SourceLocation CloseNameLocBegin,
157 StringRef CloseName,
159
161 unsigned CommandID,
162 SourceLocation TextBegin,
163 StringRef Text);
164
166 StringRef TagName);
167
170 SourceLocation GreaterLoc,
171 bool IsSelfClosing);
172
174 SourceLocation LocEnd,
175 StringRef TagName);
176
178
179private:
180 void checkBlockCommandEmptyParagraph(BlockCommandComment *Command);
181
182 void checkReturnsCommand(const BlockCommandComment *Command);
183
184 /// Emit diagnostics about duplicate block commands that should be
185 /// used only once per comment, e.g., \and \\returns.
186 void checkBlockCommandDuplicate(const BlockCommandComment *Command);
187
188 void checkDeprecatedCommand(const BlockCommandComment *Comment);
189
190 void checkFunctionDeclVerbatimLine(const BlockCommandComment *Comment);
191
192 void checkContainerDeclVerbatimLine(const BlockCommandComment *Comment);
193
194 void checkContainerDecl(const BlockCommandComment *Comment);
195
196 /// Resolve parameter names to parameter indexes in function declaration.
197 /// Emit diagnostics about unknown parameters.
198 void resolveParamCommandIndexes(const FullComment *FC);
199
200 /// \returns \c true if the declaration that this comment is attached to
201 /// is a pointer to function/method/block type or has such a type.
202 bool involvesFunctionType();
203
204 bool isFunctionDecl();
205 bool isAnyFunctionDecl();
206
207 /// \returns \c true if declaration that this comment is attached to declares
208 /// a function pointer.
209 bool isFunctionPointerVarDecl();
210 bool isFunctionOrMethodVariadic();
211 bool isObjCMethodDecl();
212 bool isObjCPropertyDecl();
213 bool isTemplateOrSpecialization();
214 bool isRecordLikeDecl();
215 bool isClassOrStructDecl();
216 /// \return \c true if the declaration that this comment is attached to
217 /// declares either struct, class or tag typedef.
218 bool isClassOrStructOrTagTypedefDecl();
219 bool isUnionDecl();
220 bool isObjCInterfaceDecl();
221 bool isObjCProtocolDecl();
222 bool isClassTemplateDecl();
223 bool isFunctionTemplateDecl();
224
225 ArrayRef<const ParmVarDecl *> getParamVars();
226
227 /// Extract all important semantic information from
228 /// \c ThisDeclInfo->ThisDecl into \c ThisDeclInfo members.
229 void inspectThisDecl();
230
231 /// Returns index of a function parameter with a given name.
232 unsigned resolveParmVarReference(StringRef Name,
234
235 /// Returns index of a function parameter with the name closest to a given
236 /// typo.
237 unsigned correctTypoInParmVarReference(StringRef Typo,
239
240 bool resolveTParamReference(StringRef Name,
241 const TemplateParameterList *TemplateParameters,
242 SmallVectorImpl<unsigned> *Position);
243
244 StringRef correctTypoInTParamReference(
245 StringRef Typo,
246 const TemplateParameterList *TemplateParameters);
247
248 InlineCommandRenderKind getInlineCommandRenderKind(StringRef Name) const;
249};
250
251} // end namespace comments
252} // end namespace clang
253
254#endif
255
Defines the Diagnostic-related interfaces.
const Decl * D
SourceLocation Loc
Definition: SemaObjC.cpp:754
Defines the clang::SourceLocation class and associated facilities.
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
A little helper class used to produce diagnostics.
Definition: Diagnostic.h:1233
Concrete class used by the front-end to report problems and issues.
Definition: Diagnostic.h:231
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1529
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:145
Encodes a location in the source.
This class handles loading and caching of source files into memory.
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:74
A command that has zero or more word-like arguments (number of word-like arguments depends on command...
Definition: Comment.h:625
This class provides information about commands that can be used in comments.
Any part of the comment.
Definition: Comment.h:66
A full comment attached to a declaration, contains block content.
Definition: Comment.h:1104
An opening HTML tag with attributes.
Definition: Comment.h:454
A command with word-like arguments that is considered inline content.
Definition: Comment.h:341
Inline content (contained within a block).
Definition: Comment.h:271
A single paragraph that contains inline content.
Definition: Comment.h:576
Doxygen \param command.
Definition: Comment.h:732
FullComment * actOnFullComment(ArrayRef< BlockContentComment * > Blocks)
void actOnParamCommandDirectionArg(ParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg)
InlineCommandComment * actOnInlineCommand(SourceLocation CommandLocBegin, SourceLocation CommandLocEnd, unsigned CommandID, CommandMarkerKind CommandMarker, ArrayRef< Comment::Argument > Args)
TParamCommandComment * actOnTParamCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, unsigned CommandID, CommandMarkerKind CommandMarker)
void actOnTParamCommandFinish(TParamCommandComment *Command, ParagraphComment *Paragraph)
void actOnBlockCommandFinish(BlockCommandComment *Command, ParagraphComment *Paragraph)
Definition: CommentSema.cpp:67
TextComment * actOnText(SourceLocation LocBegin, SourceLocation LocEnd, StringRef Text)
void actOnBlockCommandArgs(BlockCommandComment *Command, ArrayRef< BlockCommandComment::Argument > Args)
Definition: CommentSema.cpp:62
BlockCommandComment * actOnBlockCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, unsigned CommandID, CommandMarkerKind CommandMarker)
Definition: CommentSema.cpp:50
void actOnParamCommandParamNameArg(ParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg)
HTMLEndTagComment * actOnHTMLEndTag(SourceLocation LocBegin, SourceLocation LocEnd, StringRef TagName)
VerbatimLineComment * actOnVerbatimLine(SourceLocation LocBegin, unsigned CommandID, SourceLocation TextBegin, StringRef Text)
void actOnVerbatimBlockFinish(VerbatimBlockComment *Block, SourceLocation CloseNameLocBegin, StringRef CloseName, ArrayRef< VerbatimBlockLineComment * > Lines)
VerbatimBlockLineComment * actOnVerbatimBlockLine(SourceLocation Loc, StringRef Text)
void actOnParamCommandFinish(ParamCommandComment *Command, ParagraphComment *Paragraph)
ArrayRef< T > copyArray(ArrayRef< T > Source)
Returns a copy of array, owned by Sema's allocator.
Definition: CommentSema.h:80
HTMLStartTagComment * actOnHTMLStartTagStart(SourceLocation LocBegin, StringRef TagName)
void actOnHTMLStartTagFinish(HTMLStartTagComment *Tag, ArrayRef< HTMLStartTagComment::Attribute > Attrs, SourceLocation GreaterLoc, bool IsSelfClosing)
ParamCommandComment * actOnParamCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, unsigned CommandID, CommandMarkerKind CommandMarker)
Definition: CommentSema.cpp:80
VerbatimBlockComment * actOnVerbatimBlockStart(SourceLocation Loc, unsigned CommandID)
void actOnTParamCommandParamNameArg(TParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg)
void setDecl(const Decl *D)
Definition: CommentSema.cpp:36
InlineContentComment * actOnUnknownCommand(SourceLocation LocBegin, SourceLocation LocEnd, StringRef CommandName)
ParagraphComment * actOnParagraphComment(ArrayRef< InlineContentComment * > Content)
Definition: CommentSema.cpp:45
Doxygen \tparam command, describes a template parameter.
Definition: Comment.h:814
A verbatim block command (e.
Definition: Comment.h:900
A line of text contained in a verbatim block.
Definition: Comment.h:875
A verbatim line command.
Definition: Comment.h:951
InlineCommandRenderKind
The most appropriate rendering mode for this command, chosen on command semantics in Doxygen.
Definition: Comment.h:332
CommandMarkerKind
Describes the syntax that was used in a documentation command.
Definition: Comment.h:39
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
Definition: ModuleMapFile.h:36
The JSON file list parser is used to communicate input to InstallAPI.
Information about the declaration, useful to clients of FullComment.
Definition: Comment.h:983