14#ifndef LLVM_CLANG_EXTRACTAPI_EXTRACT_API_VISITOR_H
15#define LLVM_CLANG_EXTRACTAPI_EXTRACT_API_VISITOR_H
32#include "llvm/ADT/SmallString.h"
33#include "llvm/ADT/StringRef.h"
34#include "llvm/Support/Casting.h"
41template <
typename Derived>
148 const llvm::iterator_range<
170 Derived &getDerivedExtractAPIVisitor() {
171 return *
static_cast<Derived *
>(
this);
178 for (
const auto &BaseSpecifier :
Decl->bases()) {
182 if (
auto *BaseDecl = BaseSpecifier.getType()->getAsTagDecl()) {
189 if (BaseSpecifier.getType().getTypePtr()->isTemplateTypeParmType()) {
190 if (
auto *TTPTD = BaseSpecifier.getType()
199 Bases.emplace_back(BaseClass);
208 if (
Decl->isStruct())
215 if (
auto *OwningModule =
D.getImportedOwningModule())
216 return OwningModule->getTopLevelModule()->Name;
222 const auto *
Context = cast_if_present<Decl>(
D.getDeclContext());
239 if (
auto *ND = dyn_cast<NamedDecl>(&
D))
240 Name = ND->getName();
247 D.isEmbeddedInDeclarator() && !
D.isFreeStanding();
252 if (!NewRecordContext)
254 auto *Tag =
D.getType()->getAsTagDecl();
256 if (
const auto *AT =
D.getASTContext().getAsArrayType(
D.getType())) {
257 Tag = AT->getElementType()->getAsTagDecl();
262 if (
auto *
Record = llvm::dyn_cast_if_present<TagRecord>(
264 if (
Record->IsEmbeddedInVarDeclarator) {
272template <
typename Derived>
275 if (isa<ParmVarDecl>(
Decl))
292 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
296 StringRef Name =
Decl->getName();
304 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
306 Context.getDiagnostics());
313 if (
Decl->isStaticDataMember()) {
316 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
318 SubHeading, Access, isInSystemHeader(
Decl));
322 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
324 SubHeading, isInSystemHeader(
Decl));
328 maybeMergeWithAnonymousTag(*
Decl, NewRecord);
334template <
typename Derived>
337 if (
const auto *Method = dyn_cast<CXXMethodDecl>(
Decl)) {
339 if (Method->getParent()->getDescribedClassTemplate() !=
nullptr)
343 for (
const auto &
P : Context.getParents(*Method)) {
344 if (
P.template get<CXXRecordDecl>())
349 if (isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method))
354 switch (
Decl->getTemplatedKind()) {
365 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
369 auto Name =
Decl->getNameAsString();
377 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
379 Context.getDiagnostics());
386 if (
Decl->getTemplateSpecializationInfo())
388 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
392 SubHeading, Signature, isInSystemHeader(
Decl));
396 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
399 Signature, isInSystemHeader(
Decl));
403template <
typename Derived>
405 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
414 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
416 Context.getDiagnostics());
427 if (
Decl->hasNameForLinkage()) {
428 StringRef Name =
Decl->getName();
430 Name = getTypedefName(
Decl);
433 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
435 SubHeading, isInSystemHeader(
Decl),
false);
440 ParentContainer = {};
444 getDerivedExtractAPIVisitor().recordEnumConstants(ParentContainer,
445 Decl->enumerators());
450template <
typename Derived>
453 getDerivedExtractAPIVisitor().VisitFunctionDecl(
Decl);
457template <
typename Derived>
460 getDerivedExtractAPIVisitor().VisitRecordDecl(
Decl);
464template <
typename Derived>
467 getDerivedExtractAPIVisitor().VisitCXXRecordDecl(
Decl);
471template <
typename Derived>
474 getDerivedExtractAPIVisitor().VisitCXXMethodDecl(
Decl);
478template <
typename Derived>
481 getDerivedExtractAPIVisitor().VisitClassTemplateSpecializationDecl(
Decl);
485template <
typename Derived>
489 getDerivedExtractAPIVisitor().VisitClassTemplatePartialSpecializationDecl(
494template <
typename Derived>
497 getDerivedExtractAPIVisitor().VisitVarTemplateDecl(
Decl);
501template <
typename Derived>
504 getDerivedExtractAPIVisitor().VisitVarTemplateSpecializationDecl(
Decl);
508template <
typename Derived>
512 getDerivedExtractAPIVisitor().VisitVarTemplatePartialSpecializationDecl(
Decl);
516template <
typename Derived>
519 getDerivedExtractAPIVisitor().VisitFunctionTemplateDecl(
Decl);
523template <
typename Derived>
526 getDerivedExtractAPIVisitor().VisitNamespaceDecl(
Decl);
530template <
typename Derived>
533 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
535 if (
Decl->isAnonymousNamespace())
537 StringRef Name =
Decl->getName();
545 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
547 Context.getDiagnostics());
555 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
557 SubHeading, isInSystemHeader(
Decl));
562template <
typename Derived>
564 bool Ret = Base::TraverseRecordDecl(
Decl);
566 if (!isEmbeddedInVarDeclarator(*
Decl) &&
Decl->isAnonymousStructOrUnion()) {
569 API.removeRecord(USR);
575template <
typename Derived>
577 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
581 StringRef Name =
Decl->getName();
583 Name = getTypedefName(
Decl);
591 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
593 Context.getDiagnostics());
603 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
605 SubHeading, isInSystemHeader(
Decl), isEmbeddedInVarDeclarator(*
Decl));
608 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
610 SubHeading, isInSystemHeader(
Decl), isEmbeddedInVarDeclarator(*
Decl));
615template <
typename Derived>
618 bool Ret = Base::TraverseCXXRecordDecl(
Decl);
620 if (!isEmbeddedInVarDeclarator(*
Decl) &&
Decl->isAnonymousStructOrUnion()) {
623 API.removeRecord(USR);
629template <
typename Derived>
632 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
636 StringRef Name =
Decl->getName();
638 Name = getTypedefName(
Decl);
646 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
648 Context.getDiagnostics());
657 if (
Decl->getDescribedClassTemplate()) {
661 Decl->getDescribedClassTemplate()));
663 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
665 SubHeading,
Template(
Decl->getDescribedClassTemplate()), Access,
666 isInSystemHeader(
Decl));
669 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
672 isInSystemHeader(
Decl), isEmbeddedInVarDeclarator(*
Decl));
681template <
typename Derived>
684 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
688 if (isa<CXXConversionDecl>(
Decl))
690 if (isa<CXXConstructorDecl>(
Decl) || isa<CXXDestructorDecl>(
Decl))
699 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
701 Context.getDiagnostics());
708 Decl->getDescribedFunctionTemplate()) {
710 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
717 }
else if (
Decl->getTemplateSpecializationInfo())
719 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
723 SubHeading, Signature, Access, isInSystemHeader(
Decl));
724 else if (
Decl->isOverloadedOperator())
726 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
729 SubHeading, Signature, Access, isInSystemHeader(
Decl));
730 else if (
Decl->isStatic())
732 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
735 Signature, Access, isInSystemHeader(
Decl));
738 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
741 Signature, Access, isInSystemHeader(
Decl));
746template <
typename Derived>
749 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
753 auto Name =
Decl->getNameAsString();
760 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
762 Context.getDiagnostics());
774 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
776 Signature, Access, isInSystemHeader(
Decl));
780template <
typename Derived>
783 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
787 auto Name =
Decl->getNameAsString();
794 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
796 Context.getDiagnostics());
807 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
809 Signature, Access, isInSystemHeader(
Decl));
813template <
typename Derived>
815 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
818 StringRef Name =
Decl->getName();
825 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
827 Context.getDiagnostics());
833 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
839template <
typename Derived>
842 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
845 StringRef Name =
Decl->getName();
852 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
854 Context.getDiagnostics());
862 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
865 isInSystemHeader(
Decl));
872template <
typename Derived>
876 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
879 StringRef Name =
Decl->getName();
886 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
888 Context.getDiagnostics());
894 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
897 isInSystemHeader(
Decl));
900 CTPSR->Bases = getBases(
Decl);
905template <
typename Derived>
908 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
912 StringRef Name =
Decl->getName();
920 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
922 Context.getDiagnostics());
930 Decl->getTemplatedDecl()));
937 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
943 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
949template <
typename Derived>
952 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
956 StringRef Name =
Decl->getName();
964 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
966 Context.getDiagnostics());
975 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
977 SubHeading, isInSystemHeader(
Decl));
981template <
typename Derived>
984 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
988 StringRef Name =
Decl->getName();
996 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
998 Context.getDiagnostics());
1006 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1012template <
typename Derived>
1015 if (isa<CXXMethodDecl>(
Decl->getTemplatedDecl()))
1017 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1021 auto Name =
Decl->getNameAsString();
1029 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1031 Context.getDiagnostics());
1037 Decl->getTemplatedDecl());
1039 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1047template <
typename Derived>
1050 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1054 StringRef Name =
Decl->getName();
1062 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1064 Context.getDiagnostics());
1074 if (
const auto *SuperClassDecl =
Decl->getSuperClass())
1075 SuperClass = createSymbolReferenceForDecl(*SuperClassDecl);
1078 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1080 SubHeading, SuperClass, isInSystemHeader(
Decl));
1084 getDerivedExtractAPIVisitor().recordObjCMethods(InterfaceRecord,
1086 getDerivedExtractAPIVisitor().recordObjCProperties(InterfaceRecord,
1087 Decl->properties());
1088 getDerivedExtractAPIVisitor().recordObjCInstanceVariables(InterfaceRecord,
1090 getDerivedExtractAPIVisitor().recordObjCProtocols(InterfaceRecord,
1096template <
typename Derived>
1099 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1103 StringRef Name =
Decl->getName();
1110 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1112 Context.getDiagnostics());
1121 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1123 isInSystemHeader(
Decl));
1125 getDerivedExtractAPIVisitor().recordObjCMethods(ProtoRecord,
Decl->methods());
1126 getDerivedExtractAPIVisitor().recordObjCProperties(ProtoRecord,
1127 Decl->properties());
1128 getDerivedExtractAPIVisitor().recordObjCProtocols(ProtoRecord,
1134template <
typename Derived>
1138 if (isa<ObjCTypeParamDecl>(
Decl))
1144 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1147 StringRef Name =
Decl->getName();
1151 if (
auto *
TagDecl =
Decl->getUnderlyingType()->getAsTagDecl()) {
1156 if (
auto *
Record = API.findRecordForUSR(TagUSR)) {
1158 LeadingFragments.
append(
"typedef",
1162 .
prepend(std::move(LeadingFragments))
1178 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1180 Context.getDiagnostics());
1188 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1192 isInSystemHeader(
Decl));
1197template <
typename Derived>
1200 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1203 StringRef Name =
Decl->getName();
1210 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1212 Context.getDiagnostics());
1223 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1227 getDerivedExtractAPIVisitor().recordObjCMethods(CategoryRecord,
1229 getDerivedExtractAPIVisitor().recordObjCProperties(CategoryRecord,
1230 Decl->properties());
1231 getDerivedExtractAPIVisitor().recordObjCInstanceVariables(CategoryRecord,
1233 getDerivedExtractAPIVisitor().recordObjCProtocols(CategoryRecord,
1241template <
typename Derived>
1244 for (
const auto *Constant : Constants) {
1246 StringRef Name = Constant->getName();
1250 Context.getSourceManager().getPresumedLoc(Constant->getLocation());
1253 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(Constant))
1255 Context.getDiagnostics());
1265 Comment,
Declaration, SubHeading, isInSystemHeader(Constant));
1269template <
typename Derived>
1272 if (isa<ObjCIvarDecl>(
Decl) || isa<ObjCAtDefsFieldDecl>(
Decl))
1275 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1279 StringRef Name =
Decl->getName();
1286 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1288 Context.getDiagnostics());
1301 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1303 SubHeading, Access, isInSystemHeader(
Decl));
1307 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1309 SubHeading, isInSystemHeader(
Decl));
1312 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1314 SubHeading, isInSystemHeader(
Decl));
1319 maybeMergeWithAnonymousTag(*
Decl, NewRecord);
1324template <
typename Derived>
1327 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
1331 auto Name =
Decl->getNameAsString();
1338 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1340 Context.getDiagnostics());
1351 if (
Decl->isStatic())
1353 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1355 SubHeading, Signature, Access, isInSystemHeader(
Decl));
1358 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1360 SubHeading, Signature, Access, isInSystemHeader(
Decl));
1367template <
typename Derived>
1371 for (
const auto *Method : Methods) {
1373 if (Method->isPropertyAccessor())
1376 auto Name = Method->getSelector().getAsString();
1380 Context.getSourceManager().getPresumedLoc(Method->getLocation());
1383 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(Method))
1385 Context.getDiagnostics());
1395 if (Method->isInstanceMethod())
1397 USR, Name, createHierarchyInformationForDecl(*Method),
Loc,
1399 SubHeading, Signature, isInSystemHeader(Method));
1402 USR, Name, createHierarchyInformationForDecl(*Method),
Loc,
1404 SubHeading, Signature, isInSystemHeader(Method));
1408template <
typename Derived>
1412 for (
const auto *
Property : Properties) {
1413 StringRef Name =
Property->getName();
1417 Context.getSourceManager().getPresumedLoc(
Property->getLocation());
1420 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Property))
1422 Context.getDiagnostics());
1430 auto GetterName =
Property->getGetterName().getAsString();
1431 auto SetterName =
Property->getSetterName().getAsString();
1435 if (
Property->getPropertyAttributes() &
1441 USR, Name, createHierarchyInformationForDecl(*
Property),
Loc,
1445 GetterName, SetterName,
Property->isOptional(),
1449 USR, Name, createHierarchyInformationForDecl(*
Property),
Loc,
1453 GetterName, SetterName,
Property->isOptional(),
1458template <
typename Derived>
1461 const llvm::iterator_range<
1464 for (
const auto *Ivar : Ivars) {
1465 StringRef Name = Ivar->getName();
1470 Context.getSourceManager().getPresumedLoc(Ivar->getLocation());
1473 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(Ivar))
1475 Context.getDiagnostics());
1484 USR, Name, createHierarchyInformationForDecl(*Ivar),
Loc,
1486 SubHeading, isInSystemHeader(Ivar));
1490template <
typename Derived>
1494 for (
const auto *Protocol : Protocols)
1495 Container->Protocols.emplace_back(createSymbolReferenceForDecl(*Protocol));
1502template <
typename Derived =
void>
1505 std::is_same_v<Derived, void>, ExtractAPIVisitor<>, Derived>> {
1517 if (
const auto *
Declarator = dyn_cast<DeclaratorDecl>(
D)) {
1518 const auto *TagTypeDecl =
Declarator->getType()->getAsTagDecl();
1519 if (TagTypeDecl && TagTypeDecl->isEmbeddedInDeclarator() &&
1520 TagTypeDecl->isCompleteDefinition())
This file defines the APIRecord-based structs and the APISet class.
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
This file defines the Declaration Fragments related classes.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
This file defines the UnderlyingTypeResolver which is a helper type for resolving the undelrying type...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
const clang::PrintingPolicy & getPrintingPolicy() const
RawComment * getRawCommentForDeclNoCache(const Decl *D) const
Return the documentation comment attached to a given declaration, without looking into cache.
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
Represents a C++ destructor within a class.
Represents a static or instance method of a struct/union/class.
Represents a C++ struct/union/class.
Represents a class template specialization, which refers to a class template with a given set of temp...
Declaration of a C++20 concept.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Decl::Kind getDeclKind() const
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
SourceLocation getLocation() const
bool isDefinedOutsideFunctionOrMethod() const
isDefinedOutsideFunctionOrMethod - This predicate returns true if this scoped decl is defined outside...
DeclContext * getDeclContext()
Represents a ValueDecl that came out of a declarator.
Information about one declarator, including the parsed type information and the identifier.
llvm::iterator_range< specific_decl_iterator< EnumConstantDecl > > enumerator_range
Represents a member of a struct/union/class.
Represents a function declaration or definition.
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
Declaration of a template function.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Represent a C++ namespace.
ObjCCategoryDecl - Represents a category declaration.
llvm::iterator_range< specific_decl_iterator< ObjCMethodDecl > > method_range
llvm::iterator_range< specific_decl_iterator< ObjCPropertyDecl > > prop_range
Represents an ObjC class declaration.
llvm::iterator_range< protocol_iterator > protocol_range
Represents an Objective-C protocol declaration.
Represents an unpacked "presumed" location which can be presented to the user.
A (possibly-)qualified type.
Represents a struct/union/class.
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
Represents the declaration of a struct/union/class/enum.
bool isEmbeddedInDeclarator() const
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateTypeParmDecl * getDecl() const
The base class of the type hierarchy.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
Represents a variable declaration or definition.
Declaration of a variable template.
Represents a variable template specialization, which refers to a variable template with a given set o...
bool generateUSRForDecl(const Decl *D, SmallVectorImpl< char > &Buf)
Generate a USR for a Decl, including the USR prefix.
The JSON file list parser is used to communicate input to InstallAPI.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Property
The type of a property.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
static AvailabilityInfo createFromDecl(const Decl *Decl)