clang: lib/AST/Comment.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
15#include "llvm/Support/ErrorHandling.h"
16#include <type_traits>
17
19namespace comments {
20
21
22
23#define ABSTRACT_COMMENT(COMMENT)
24#define COMMENT(CLASS, PARENT) \
25 static_assert(std::is_trivially_destructible::value, \
26 #CLASS " should be trivially destructible!");
27#include "clang/AST/CommentNodes.inc"
28#undef COMMENT
29#undef ABSTRACT_COMMENT
30
31
32static_assert(std::is_trivially_destructible_v,
33 "DeclInfo should be trivially destructible!");
34
38 return "None";
39#define ABSTRACT_COMMENT(COMMENT)
40#define COMMENT(CLASS, PARENT) \
41 case CommentKind::CLASS: \
42 return #CLASS;
43#include "clang/AST/CommentNodes.inc"
44#undef COMMENT
45#undef ABSTRACT_COMMENT
46 }
47 llvm_unreachable("Unknown comment kind!");
48}
49
50namespace {
51struct good {};
52struct bad {};
53
54template
56 return good();
57}
58
59LLVM_ATTRIBUTE_UNUSED
60static inline bad implements_child_begin_end(
62 return bad();
63}
64
65#define ASSERT_IMPLEMENTS_child_begin(function) \
66 (void) good(implements_child_begin_end(function))
67
68LLVM_ATTRIBUTE_UNUSED
69static inline void CheckCommentASTNodes() {
70#define ABSTRACT_COMMENT(COMMENT)
71#define COMMENT(CLASS, PARENT) \
72 ASSERT_IMPLEMENTS_child_begin(&CLASS::child_begin); \
73 ASSERT_IMPLEMENTS_child_begin(&CLASS::child_end);
74#include "clang/AST/CommentNodes.inc"
75#undef COMMENT
76#undef ABSTRACT_COMMENT
77}
78
79#undef ASSERT_IMPLEMENTS_child_begin
80
81}
82
86 llvm_unreachable("comment without a kind");
87#define ABSTRACT_COMMENT(COMMENT)
88#define COMMENT(CLASS, PARENT) \
89 case CommentKind::CLASS: \
90 return static_cast<const CLASS *>(this)->child_begin();
91#include "clang/AST/CommentNodes.inc"
92#undef COMMENT
93#undef ABSTRACT_COMMENT
94 }
95 llvm_unreachable("Unknown comment kind!");
96}
97
101 llvm_unreachable("comment without a kind");
102#define ABSTRACT_COMMENT(COMMENT)
103#define COMMENT(CLASS, PARENT) \
104 case CommentKind::CLASS: \
105 return static_cast<const CLASS *>(this)->child_end();
106#include "clang/AST/CommentNodes.inc"
107#undef COMMENT
108#undef ABSTRACT_COMMENT
109 }
110 llvm_unreachable("Unknown comment kind!");
111}
112
113bool TextComment::isWhitespaceNoCache() const {
115}
116
117bool ParagraphComment::isWhitespaceNoCache() const {
119 if (const TextComment *TC = dyn_cast(*I)) {
120 if (!TC->isWhitespace())
121 return false;
122 } else
123 return false;
124 }
125 return true;
126}
127
130
131
133 return AttributeTL.getModifiedLoc();
134
137
140
143
145 return ATL.getOriginalLoc();
151 return ETL.getNamedTypeLoc();
152
153 return TL;
154}
155
158 while (PrevTL != TL) {
159 PrevTL = TL;
161 }
162
164 ResFTL = FTL;
165 return true;
166 }
167
170
171
172
173
174 if (STL.getNumArgs() != 1)
175 return false;
178 return false;
182 ResFTL = FTL;
183 return true;
184 }
185 }
186
187 return false;
188}
189
190const char *
192 switch (D) {
194 return "[in]";
196 return "[out]";
198 return "[in,out]";
199 }
200 llvm_unreachable("unknown PassDirection");
201}
202
205
206
215
217
219 return;
220 }
222
225 switch (K) {
226 default:
227
228 break;
229 case Decl::Function:
230 case Decl::CXXMethod:
231 case Decl::CXXConstructor:
232 case Decl::CXXDestructor:
233 case Decl::CXXConversion: {
239 if (NumLists != 0) {
243 }
244
245 if (K == Decl::CXXMethod || K == Decl::CXXConstructor ||
246 K == Decl::CXXDestructor || K == Decl::CXXConversion) {
250 }
253 break;
254 }
255 case Decl::ObjCMethod: {
265 break;
266 }
267 case Decl::FunctionTemplate: {
277 break;
278 }
279 case Decl::ClassTemplate: {
284 break;
285 }
286 case Decl::ClassTemplatePartialSpecialization: {
288 cast(CommentDecl);
292 break;
293 }
294 case Decl::ClassTemplateSpecialization:
297 break;
298 case Decl::Record:
299 case Decl::CXXRecord:
301 break;
302 case Decl::Var:
304 cast(CommentDecl)->getDescribedVarTemplate()) {
307 }
308 [[fallthrough]];
309 case Decl::Field:
310 case Decl::EnumConstant:
311 case Decl::ObjCIvar:
312 case Decl::ObjCAtDefsField:
313 case Decl::ObjCProperty:
314 if (const auto *VD = dyn_cast(CommentDecl))
315 TSI = VD->getTypeSourceInfo();
316 else if (const auto *PD = dyn_cast(CommentDecl))
317 TSI = PD->getTypeSourceInfo();
319 break;
320 case Decl::VarTemplate: {
326 TSI = VD->getTypeSourceInfo();
327 break;
328 }
329 case Decl::Namespace:
331 break;
332 case Decl::TypeAlias:
333 case Decl::Typedef:
335 TSI = cast(CommentDecl)->getTypeSourceInfo();
336 break;
337 case Decl::TypeAliasTemplate: {
343 TSI = TAD->getTypeSourceInfo();
344 break;
345 }
346 case Decl::Enum:
348 break;
349 }
350
351
352
353 if (TSI) {
359 if (const auto *FPT = dyn_cast(FTL.getTypePtr()))
362 }
363 }
364
366}
367
371 return "...";
373}
374
378 for (unsigned i = 0, e = getDepth(); i != e; ++i) {
379 assert(TPL && "Unknown TemplateParameterList");
380 if (i == e - 1)
383 if (auto *TTP = dyn_cast(Param))
384 TPL = TTP->getTemplateParameters();
385 }
386 return "";
387}
388
389}
390}
391
Defines the clang::ASTContext interface.
Defines the C++ template declaration subclasses.
Type source information for an attributed type.
Wrapper for source info for block pointers.
Represents a static or instance method of a struct/union/class.
Declaration of a class template.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
const TypeClass * getTypePtr() const
Kind
Lists the kind of concrete classes of Decl.
TemplateParameterList * getTemplateParameterList(unsigned index) const
unsigned getNumTemplateParameterLists() const
Represents a function declaration or definition.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isVariadic() const
Whether this function is variadic.
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Wrapper for source info for functions.
ArrayRef< ParmVarDecl * > getParams() const
TypeLoc getReturnLoc() const
Wrapper for source info for member pointers.
This represents a decl that may have a name.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
ObjCMethodDecl - Represents an instance or class method declaration.
ArrayRef< ParmVarDecl * > parameters() const
bool isInstanceMethod() const
QualType getReturnType() const
Wrapper for source info for pointers.
Wrapper of type source information for a type with non-trivial direct qualifiers.
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
TypeSourceInfo * getTypeSourceInfo() const
@ Type
The template argument is a type.
ArgKind getKind() const
Return the kind of stored template argument.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Declaration of an alias template.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
QualType getType() const
Get the type for which this source info wrapper provides information.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Represents a variable declaration or definition.
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
The JSON file list parser is used to communicate input to InstallAPI.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
const FunctionProtoType * T