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->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();
257 if (
auto *
Record = llvm::dyn_cast_if_present<TagRecord>(
259 if (
Record->IsEmbeddedInVarDeclarator) {
267template <
typename Derived>
270 if (isa<ParmVarDecl>(
Decl))
287 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
291 StringRef Name =
Decl->getName();
299 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
301 Context.getDiagnostics());
308 if (
Decl->isStaticDataMember()) {
311 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
313 SubHeading, Access, isInSystemHeader(
Decl));
317 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
319 SubHeading, isInSystemHeader(
Decl));
323 maybeMergeWithAnonymousTag(*
Decl, NewRecord);
329template <
typename Derived>
332 if (
const auto *Method = dyn_cast<CXXMethodDecl>(
Decl)) {
334 if (Method->getParent()->getDescribedClassTemplate() !=
nullptr)
338 for (
const auto &
P : Context.getParents(*Method)) {
339 if (
P.template get<CXXRecordDecl>())
344 if (isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method))
349 switch (
Decl->getTemplatedKind()) {
360 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
364 auto Name =
Decl->getNameAsString();
372 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
374 Context.getDiagnostics());
381 if (
Decl->getTemplateSpecializationInfo())
383 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
387 SubHeading, Signature, isInSystemHeader(
Decl));
391 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
394 Signature, isInSystemHeader(
Decl));
398template <
typename Derived>
400 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
409 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
411 Context.getDiagnostics());
422 if (
Decl->hasNameForLinkage()) {
423 StringRef Name =
Decl->getName();
425 Name = getTypedefName(
Decl);
428 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
430 SubHeading, isInSystemHeader(
Decl),
false);
435 ParentContainer = {};
439 getDerivedExtractAPIVisitor().recordEnumConstants(ParentContainer,
440 Decl->enumerators());
445template <
typename Derived>
448 getDerivedExtractAPIVisitor().VisitFunctionDecl(
Decl);
452template <
typename Derived>
455 getDerivedExtractAPIVisitor().VisitRecordDecl(
Decl);
459template <
typename Derived>
462 getDerivedExtractAPIVisitor().VisitCXXRecordDecl(
Decl);
466template <
typename Derived>
469 getDerivedExtractAPIVisitor().VisitCXXMethodDecl(
Decl);
473template <
typename Derived>
476 getDerivedExtractAPIVisitor().VisitClassTemplateSpecializationDecl(
Decl);
480template <
typename Derived>
484 getDerivedExtractAPIVisitor().VisitClassTemplatePartialSpecializationDecl(
489template <
typename Derived>
492 getDerivedExtractAPIVisitor().VisitVarTemplateDecl(
Decl);
496template <
typename Derived>
499 getDerivedExtractAPIVisitor().VisitVarTemplateSpecializationDecl(
Decl);
503template <
typename Derived>
507 getDerivedExtractAPIVisitor().VisitVarTemplatePartialSpecializationDecl(
Decl);
511template <
typename Derived>
514 getDerivedExtractAPIVisitor().VisitFunctionTemplateDecl(
Decl);
518template <
typename Derived>
521 getDerivedExtractAPIVisitor().VisitNamespaceDecl(
Decl);
525template <
typename Derived>
528 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
530 if (
Decl->isAnonymousNamespace())
532 StringRef Name =
Decl->getName();
540 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
542 Context.getDiagnostics());
550 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
552 SubHeading, isInSystemHeader(
Decl));
557template <
typename Derived>
559 bool Ret = Base::TraverseRecordDecl(
Decl);
561 if (!isEmbeddedInVarDeclarator(*
Decl) &&
Decl->isAnonymousStructOrUnion()) {
564 API.removeRecord(USR);
570template <
typename Derived>
572 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
576 StringRef Name =
Decl->getName();
578 Name = getTypedefName(
Decl);
586 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
588 Context.getDiagnostics());
598 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
600 SubHeading, isInSystemHeader(
Decl), isEmbeddedInVarDeclarator(*
Decl));
603 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
605 SubHeading, isInSystemHeader(
Decl), isEmbeddedInVarDeclarator(*
Decl));
610template <
typename Derived>
613 bool Ret = Base::TraverseCXXRecordDecl(
Decl);
615 if (!isEmbeddedInVarDeclarator(*
Decl) &&
Decl->isAnonymousStructOrUnion()) {
618 API.removeRecord(USR);
624template <
typename Derived>
627 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
631 StringRef Name =
Decl->getName();
633 Name = getTypedefName(
Decl);
641 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
643 Context.getDiagnostics());
652 if (
Decl->getDescribedClassTemplate()) {
656 Decl->getDescribedClassTemplate()));
658 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
660 SubHeading,
Template(
Decl->getDescribedClassTemplate()), Access,
661 isInSystemHeader(
Decl));
664 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
667 isInSystemHeader(
Decl), isEmbeddedInVarDeclarator(*
Decl));
676template <
typename Derived>
679 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
683 if (isa<CXXConversionDecl>(
Decl))
685 if (isa<CXXConstructorDecl>(
Decl) || isa<CXXDestructorDecl>(
Decl))
694 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
696 Context.getDiagnostics());
703 Decl->getDescribedFunctionTemplate()) {
705 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
712 }
else if (
Decl->getTemplateSpecializationInfo())
714 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
718 SubHeading, Signature, Access, isInSystemHeader(
Decl));
719 else if (
Decl->isOverloadedOperator())
721 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
724 SubHeading, Signature, Access, isInSystemHeader(
Decl));
725 else if (
Decl->isStatic())
727 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
730 Signature, Access, isInSystemHeader(
Decl));
733 USR,
Decl->getNameAsString(), createHierarchyInformationForDecl(*
Decl),
736 Signature, Access, isInSystemHeader(
Decl));
741template <
typename Derived>
744 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
748 auto Name =
Decl->getNameAsString();
755 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
757 Context.getDiagnostics());
769 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
771 Signature, Access, isInSystemHeader(
Decl));
775template <
typename Derived>
778 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
782 auto Name =
Decl->getNameAsString();
789 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
791 Context.getDiagnostics());
802 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
804 Signature, Access, isInSystemHeader(
Decl));
808template <
typename Derived>
810 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
813 StringRef Name =
Decl->getName();
820 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
822 Context.getDiagnostics());
828 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
834template <
typename Derived>
837 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
840 StringRef Name =
Decl->getName();
847 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
849 Context.getDiagnostics());
857 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
860 isInSystemHeader(
Decl));
867template <
typename Derived>
871 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
874 StringRef Name =
Decl->getName();
881 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
883 Context.getDiagnostics());
889 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
892 isInSystemHeader(
Decl));
895 CTPSR->Bases = getBases(
Decl);
900template <
typename Derived>
903 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
907 StringRef Name =
Decl->getName();
915 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
917 Context.getDiagnostics());
925 Decl->getTemplatedDecl()));
932 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
938 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
944template <
typename Derived>
947 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
951 StringRef Name =
Decl->getName();
959 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
961 Context.getDiagnostics());
970 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
972 SubHeading, isInSystemHeader(
Decl));
976template <
typename Derived>
979 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
983 StringRef Name =
Decl->getName();
991 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
993 Context.getDiagnostics());
1001 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1007template <
typename Derived>
1010 if (isa<CXXMethodDecl>(
Decl->getTemplatedDecl()))
1012 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1016 auto Name =
Decl->getNameAsString();
1024 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1026 Context.getDiagnostics());
1032 Decl->getTemplatedDecl());
1034 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1042template <
typename Derived>
1045 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1049 StringRef Name =
Decl->getName();
1057 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1059 Context.getDiagnostics());
1069 if (
const auto *SuperClassDecl =
Decl->getSuperClass())
1070 SuperClass = createSymbolReferenceForDecl(*SuperClassDecl);
1073 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1075 SubHeading, SuperClass, isInSystemHeader(
Decl));
1079 getDerivedExtractAPIVisitor().recordObjCMethods(InterfaceRecord,
1081 getDerivedExtractAPIVisitor().recordObjCProperties(InterfaceRecord,
1082 Decl->properties());
1083 getDerivedExtractAPIVisitor().recordObjCInstanceVariables(InterfaceRecord,
1085 getDerivedExtractAPIVisitor().recordObjCProtocols(InterfaceRecord,
1091template <
typename Derived>
1094 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1098 StringRef Name =
Decl->getName();
1105 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1107 Context.getDiagnostics());
1116 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1118 isInSystemHeader(
Decl));
1120 getDerivedExtractAPIVisitor().recordObjCMethods(ProtoRecord,
Decl->methods());
1121 getDerivedExtractAPIVisitor().recordObjCProperties(ProtoRecord,
1122 Decl->properties());
1123 getDerivedExtractAPIVisitor().recordObjCProtocols(ProtoRecord,
1129template <
typename Derived>
1133 if (isa<ObjCTypeParamDecl>(
Decl))
1139 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1142 StringRef Name =
Decl->getName();
1146 if (
auto *
TagDecl =
Decl->getUnderlyingType()->getAsTagDecl()) {
1151 if (
auto *
Record = API.findRecordForUSR(TagUSR)) {
1153 LeadingFragments.
append(
"typedef",
1157 .
prepend(std::move(LeadingFragments))
1173 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1175 Context.getDiagnostics());
1183 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1187 isInSystemHeader(
Decl));
1192template <
typename Derived>
1195 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1198 StringRef Name =
Decl->getName();
1205 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1207 Context.getDiagnostics());
1218 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1222 getDerivedExtractAPIVisitor().recordObjCMethods(CategoryRecord,
1224 getDerivedExtractAPIVisitor().recordObjCProperties(CategoryRecord,
1225 Decl->properties());
1226 getDerivedExtractAPIVisitor().recordObjCInstanceVariables(CategoryRecord,
1228 getDerivedExtractAPIVisitor().recordObjCProtocols(CategoryRecord,
1236template <
typename Derived>
1239 for (
const auto *Constant : Constants) {
1241 StringRef Name = Constant->getName();
1245 Context.getSourceManager().getPresumedLoc(Constant->getLocation());
1248 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(Constant))
1250 Context.getDiagnostics());
1260 Comment,
Declaration, SubHeading, isInSystemHeader(Constant));
1264template <
typename Derived>
1267 if (isa<ObjCIvarDecl>(
Decl) || isa<ObjCAtDefsFieldDecl>(
Decl))
1270 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl))
1274 StringRef Name =
Decl->getName();
1281 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1283 Context.getDiagnostics());
1296 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1298 SubHeading, Access, isInSystemHeader(
Decl));
1302 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1304 SubHeading, isInSystemHeader(
Decl));
1307 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1309 SubHeading, isInSystemHeader(
Decl));
1314 maybeMergeWithAnonymousTag(*
Decl, NewRecord);
1319template <
typename Derived>
1322 if (!getDerivedExtractAPIVisitor().shouldDeclBeIncluded(
Decl) ||
1326 auto Name =
Decl->getNameAsString();
1333 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Decl))
1335 Context.getDiagnostics());
1346 if (
Decl->isStatic())
1348 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1350 SubHeading, Signature, Access, isInSystemHeader(
Decl));
1353 USR, Name, createHierarchyInformationForDecl(*
Decl),
Loc,
1355 SubHeading, Signature, Access, isInSystemHeader(
Decl));
1362template <
typename Derived>
1366 for (
const auto *Method : Methods) {
1368 if (Method->isPropertyAccessor())
1371 auto Name = Method->getSelector().getAsString();
1375 Context.getSourceManager().getPresumedLoc(Method->getLocation());
1378 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(Method))
1380 Context.getDiagnostics());
1390 if (Method->isInstanceMethod())
1392 USR, Name, createHierarchyInformationForDecl(*Method),
Loc,
1394 SubHeading, Signature, isInSystemHeader(Method));
1397 USR, Name, createHierarchyInformationForDecl(*Method),
Loc,
1399 SubHeading, Signature, isInSystemHeader(Method));
1403template <
typename Derived>
1407 for (
const auto *
Property : Properties) {
1408 StringRef Name =
Property->getName();
1412 Context.getSourceManager().getPresumedLoc(
Property->getLocation());
1415 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(
Property))
1417 Context.getDiagnostics());
1425 auto GetterName =
Property->getGetterName().getAsString();
1426 auto SetterName =
Property->getSetterName().getAsString();
1430 if (
Property->getPropertyAttributes() &
1436 USR, Name, createHierarchyInformationForDecl(*
Property),
Loc,
1440 GetterName, SetterName,
Property->isOptional(),
1444 USR, Name, createHierarchyInformationForDecl(*
Property),
Loc,
1448 GetterName, SetterName,
Property->isOptional(),
1453template <
typename Derived>
1456 const llvm::iterator_range<
1459 for (
const auto *Ivar : Ivars) {
1460 StringRef Name = Ivar->getName();
1465 Context.getSourceManager().getPresumedLoc(Ivar->getLocation());
1468 getDerivedExtractAPIVisitor().fetchRawCommentForDecl(Ivar))
1470 Context.getDiagnostics());
1479 USR, Name, createHierarchyInformationForDecl(*Ivar),
Loc,
1481 SubHeading, isInSystemHeader(Ivar));
1485template <
typename Derived>
1489 for (
const auto *Protocol : Protocols)
1490 Container->Protocols.emplace_back(createSymbolReferenceForDecl(*Protocol));
1497template <
typename Derived =
void>
1500 std::is_same_v<Derived, void>, ExtractAPIVisitor<>, Derived>> {
1512 if (
const auto *
Declarator = dyn_cast<DeclaratorDecl>(
D)) {
1513 const auto *TagTypeDecl =
Declarator->getType()->getAsTagDecl();
1514 if (TagTypeDecl && TagTypeDecl->isEmbeddedInDeclarator() &&
1515 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)