18#include "llvm/Support/Path.h"
19#include "llvm/Support/raw_ostream.h"
35 const std::pair<FileID, unsigned> &Decomposed =
SM.getDecomposedLoc(
Loc);
38 OS << llvm::sys::path::filename(FE->
getName());
47 OS <<
'@' << Decomposed.second;
56 return attr->getDefinedIn();
64 llvm::raw_svector_ostream Out;
67 bool IgnoreResults =
false;
68 bool generatedLoc =
false;
70 llvm::DenseMap<const Type *, unsigned> TypeSubstitutions;
75 : Buf(Buf), Out(Buf), Context(Ctx), LangOpts(LangOpts) {
80 bool ignoreResults()
const {
return IgnoreResults; }
108 IgnoreResults =
true;
112 IgnoreResults =
true;
119 bool EmittedDeclName = !EmitDeclName(
D);
120 assert(EmittedDeclName &&
"EmitDeclName can not fail for UsingDecls");
121 (void)EmittedDeclName;
124 bool ShouldGenerateLocation(
const NamedDecl *
D);
130 void GenExtSymbolContainer(
const NamedDecl *
D);
134 bool GenLoc(
const Decl *
D,
bool IncludeOffset);
143 void GenObjCClass(StringRef cls, StringRef ExtSymDefinedIn,
144 StringRef CategoryContextExtSymbolDefinedIn) {
146 CategoryContextExtSymbolDefinedIn);
150 void GenObjCCategory(StringRef cls, StringRef cat,
151 StringRef clsExt, StringRef catExt) {
156 void GenObjCProperty(StringRef prop,
bool isClassProp) {
161 void GenObjCProtocol(StringRef prot, StringRef ext) {
182bool USRGenerator::EmitDeclName(
const NamedDecl *
D) {
190bool USRGenerator::ShouldGenerateLocation(
const NamedDecl *
D) {
191 if (
D->isExternallyVisible())
199 return !
SM.isInSystemHeader(
Loc);
202void USRGenerator::VisitDeclContext(
const DeclContext *DC) {
203 if (
const NamedDecl *
D = dyn_cast<NamedDecl>(DC))
205 else if (isa<LinkageSpecDecl>(DC))
209void USRGenerator::VisitFieldDecl(
const FieldDecl *
D) {
216 Out << (isa<ObjCIvarDecl>(
D) ?
"@" :
"@FI@");
217 if (EmitDeclName(
D)) {
219 IgnoreResults =
true;
225 if (ShouldGenerateLocation(
D) && GenLoc(
D, isLocal(
D)))
228 if (
D->getType().isNull()) {
229 IgnoreResults =
true;
233 const unsigned StartSize = Buf.size();
235 if (Buf.size() == StartSize)
236 GenExtSymbolContainer(
D);
238 bool IsTemplate =
false;
242 VisitTemplateParameterList(FunTmpl->getTemplateParameters());
249 Policy.SuppressTemplateArgsInCXXConstructors =
true;
250 D->getDeclName().
print(Out, Policy);
252 if ((!LangOpts.CPlusPlus ||
D->isExternC()) &&
256 if (
D->isFunctionTemplateSpecialization()) {
259 D->getTemplateSpecializationArgs()) {
260 for (
const auto &Arg : SpecArgs->asArray()) {
262 VisitTemplateArgument(Arg);
265 D->getTemplateSpecializationArgsAsWritten()) {
266 for (
const auto &ArgLoc : SpecArgsWritten->arguments()) {
268 VisitTemplateArgument(ArgLoc.getArgument());
274 QualType CanonicalType =
D->getType().getCanonicalType();
277 for (
QualType PT : FPT->param_types()) {
291 VisitType(
D->getReturnType());
298 if (
unsigned quals = MD->getMethodQualifiers().getCVRUQualifiers())
299 Out << (char)(
'0' + quals);
300 switch (MD->getRefQualifier()) {
308void USRGenerator::VisitNamedDecl(
const NamedDecl *
D) {
312 if (EmitDeclName(
D)) {
317 IgnoreResults =
true;
321void USRGenerator::VisitVarDecl(
const VarDecl *
D) {
325 if (ShouldGenerateLocation(
D) && GenLoc(
D, isLocal(
D)))
332 VisitTemplateParameterList(VarTmpl->getTemplateParameters());
334 = dyn_cast<VarTemplatePartialSpecializationDecl>(
D)) {
336 VisitTemplateParameterList(PartialSpec->getTemplateParameters());
340 StringRef
s =
D->getName();
347 IgnoreResults =
true;
353 = dyn_cast<VarTemplateSpecializationDecl>(
D)) {
356 for (
unsigned I = 0, N = Args.
size(); I != N; ++I) {
358 VisitTemplateArgument(Args.
get(I));
363void USRGenerator::VisitBindingDecl(
const BindingDecl *
D) {
364 if (isLocal(
D) && GenLoc(
D,
true))
369void USRGenerator::VisitNonTypeTemplateParmDecl(
374void USRGenerator::VisitTemplateTemplateParmDecl(
383 if (
D->isAnonymousNamespace()) {
387 Out <<
"@N@" <<
D->getName();
391 VisitFunctionDecl(
D->getTemplatedDecl());
395 VisitTagDecl(
D->getTemplatedDecl());
401 Out <<
"@NA@" <<
D->getName();
408 return ICD->getCategoryDecl();
422 IgnoreResults =
true;
426 VisitObjCContainerDecl(ID, CD);
431 Out << (
D->isInstanceMethod() ?
"(im)" :
"(cm)")
439 llvm_unreachable(
"Invalid ObjC container.");
440 case Decl::ObjCInterface:
441 case Decl::ObjCImplementation:
445 case Decl::ObjCCategory: {
453 IgnoreResults =
true;
459 Out <<
"objc(ext)" <<
ID->getName() <<
'@';
463 GenObjCCategory(
ID->getName(), CD->
getName(),
469 case Decl::ObjCCategoryImpl: {
477 IgnoreResults =
true;
480 GenObjCCategory(
ID->getName(), CD->
getName(),
485 case Decl::ObjCProtocol: {
500 GenObjCProperty(
D->getName(),
D->isClassProperty());
505 VisitObjCPropertyDecl(PD);
509 IgnoreResults =
true;
512void USRGenerator::VisitTagDecl(
const TagDecl *
D) {
515 if (!isa<EnumDecl>(
D) &&
516 ShouldGenerateLocation(
D) && GenLoc(
D, isLocal(
D)))
519 GenExtSymbolContainer(
D);
524 bool AlreadyStarted =
false;
525 if (
const CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(
D)) {
527 AlreadyStarted =
true;
529 switch (
D->getTagKind()) {
530 case TagTypeKind::Interface:
531 case TagTypeKind::Class:
532 case TagTypeKind::Struct:
535 case TagTypeKind::Union:
538 case TagTypeKind::Enum:
539 llvm_unreachable(
"enum template");
541 VisitTemplateParameterList(ClassTmpl->getTemplateParameters());
543 = dyn_cast<ClassTemplatePartialSpecializationDecl>(CXXRecord)) {
544 AlreadyStarted =
true;
546 switch (
D->getTagKind()) {
547 case TagTypeKind::Interface:
548 case TagTypeKind::Class:
549 case TagTypeKind::Struct:
552 case TagTypeKind::Union:
555 case TagTypeKind::Enum:
556 llvm_unreachable(
"enum partial specialization");
558 VisitTemplateParameterList(PartialSpec->getTemplateParameters());
562 if (!AlreadyStarted) {
563 switch (
D->getTagKind()) {
564 case TagTypeKind::Interface:
565 case TagTypeKind::Class:
566 case TagTypeKind::Struct:
569 case TagTypeKind::Union:
572 case TagTypeKind::Enum:
579 assert(Buf.size() > 0);
580 const unsigned off = Buf.size() - 1;
582 if (EmitDeclName(
D)) {
587 if (
D->isEmbeddedInDeclarator() && !
D->isFreeStanding()) {
591 if (
auto *ED = dyn_cast<EnumDecl>(
D)) {
594 auto enum_range = ED->enumerators();
595 if (enum_range.begin() != enum_range.end()) {
596 Out <<
'@' << **enum_range.begin();
605 = dyn_cast<ClassTemplateSpecializationDecl>(
D)) {
608 for (
unsigned I = 0, N = Args.
size(); I != N; ++I) {
610 VisitTemplateArgument(Args.
get(I));
615void USRGenerator::VisitTypedefDecl(
const TypedefDecl *
D) {
616 if (ShouldGenerateLocation(
D) && GenLoc(
D, isLocal(
D)))
619 if (
const NamedDecl *DCN = dyn_cast<NamedDecl>(DC))
629void USRGenerator::GenExtSymbolContainer(
const NamedDecl *
D) {
631 if (!Container.empty())
632 Out <<
"@M@" << Container;
635bool USRGenerator::GenLoc(
const Decl *
D,
bool IncludeOffset) {
637 return IgnoreResults;
642 IgnoreResults =
true;
653 return IgnoreResults;
667void USRGenerator::VisitType(
QualType T) {
684 Out << ((char) (
'0' + qVal));
690 T = Expansion->getPattern();
694 switch (BT->getKind()) {
695 case BuiltinType::Void:
697 case BuiltinType::Bool:
699 case BuiltinType::UChar:
701 case BuiltinType::Char8:
703 case BuiltinType::Char16:
705 case BuiltinType::Char32:
707 case BuiltinType::UShort:
709 case BuiltinType::UInt:
711 case BuiltinType::ULong:
713 case BuiltinType::ULongLong:
715 case BuiltinType::UInt128:
717 case BuiltinType::Char_U:
718 case BuiltinType::Char_S:
720 case BuiltinType::SChar:
722 case BuiltinType::WChar_S:
723 case BuiltinType::WChar_U:
725 case BuiltinType::Short:
727 case BuiltinType::Int:
729 case BuiltinType::Long:
731 case BuiltinType::LongLong:
733 case BuiltinType::Int128:
735 case BuiltinType::Float16:
736 case BuiltinType::Half:
738 case BuiltinType::Float:
740 case BuiltinType::Double:
742 case BuiltinType::LongDouble:
744 case BuiltinType::Float128:
746 case BuiltinType::NullPtr:
748#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
749 case BuiltinType::Id: \
750 Out << "@BT@" << #Suffix << "_" << #ImgType; break;
751#include "clang/Basic/OpenCLImageTypes.def"
752#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
753 case BuiltinType::Id: \
754 Out << "@BT@" << #ExtType; break;
755#include "clang/Basic/OpenCLExtensionTypes.def"
756 case BuiltinType::OCLEvent:
757 Out <<
"@BT@OCLEvent";
break;
758 case BuiltinType::OCLClkEvent:
759 Out <<
"@BT@OCLClkEvent";
break;
760 case BuiltinType::OCLQueue:
761 Out <<
"@BT@OCLQueue";
break;
762 case BuiltinType::OCLReserveID:
763 Out <<
"@BT@OCLReserveID";
break;
764 case BuiltinType::OCLSampler:
765 Out <<
"@BT@OCLSampler";
break;
766#define SVE_TYPE(Name, Id, SingletonId) \
767 case BuiltinType::Id: \
768 Out << "@BT@" << Name; break;
769#include "clang/Basic/AArch64SVEACLETypes.def"
770#define PPC_VECTOR_TYPE(Name, Id, Size) \
771 case BuiltinType::Id: \
772 Out << "@BT@" << #Name; break;
773#include "clang/Basic/PPCTypes.def"
774#define RVV_TYPE(Name, Id, SingletonId) \
775 case BuiltinType::Id: \
776 Out << "@BT@" << Name; break;
777#include "clang/Basic/RISCVVTypes.def"
778#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
779#include "clang/Basic/WebAssemblyReferenceTypes.def"
780#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
781 case BuiltinType::Id: \
782 Out << "@BT@" << #Name; \
784#include "clang/Basic/AMDGPUTypes.def"
785#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
786 case BuiltinType::Id: \
787 Out << "@BT@" << #Name; \
789#include "clang/Basic/HLSLIntangibleTypes.def"
790 case BuiltinType::ShortAccum:
791 Out <<
"@BT@ShortAccum";
break;
792 case BuiltinType::Accum:
793 Out <<
"@BT@Accum";
break;
794 case BuiltinType::LongAccum:
795 Out <<
"@BT@LongAccum";
break;
796 case BuiltinType::UShortAccum:
797 Out <<
"@BT@UShortAccum";
break;
798 case BuiltinType::UAccum:
799 Out <<
"@BT@UAccum";
break;
800 case BuiltinType::ULongAccum:
801 Out <<
"@BT@ULongAccum";
break;
802 case BuiltinType::ShortFract:
803 Out <<
"@BT@ShortFract";
break;
804 case BuiltinType::Fract:
805 Out <<
"@BT@Fract";
break;
806 case BuiltinType::LongFract:
807 Out <<
"@BT@LongFract";
break;
808 case BuiltinType::UShortFract:
809 Out <<
"@BT@UShortFract";
break;
810 case BuiltinType::UFract:
811 Out <<
"@BT@UFract";
break;
812 case BuiltinType::ULongFract:
813 Out <<
"@BT@ULongFract";
break;
814 case BuiltinType::SatShortAccum:
815 Out <<
"@BT@SatShortAccum";
break;
816 case BuiltinType::SatAccum:
817 Out <<
"@BT@SatAccum";
break;
818 case BuiltinType::SatLongAccum:
819 Out <<
"@BT@SatLongAccum";
break;
820 case BuiltinType::SatUShortAccum:
821 Out <<
"@BT@SatUShortAccum";
break;
822 case BuiltinType::SatUAccum:
823 Out <<
"@BT@SatUAccum";
break;
824 case BuiltinType::SatULongAccum:
825 Out <<
"@BT@SatULongAccum";
break;
826 case BuiltinType::SatShortFract:
827 Out <<
"@BT@SatShortFract";
break;
828 case BuiltinType::SatFract:
829 Out <<
"@BT@SatFract";
break;
830 case BuiltinType::SatLongFract:
831 Out <<
"@BT@SatLongFract";
break;
832 case BuiltinType::SatUShortFract:
833 Out <<
"@BT@SatUShortFract";
break;
834 case BuiltinType::SatUFract:
835 Out <<
"@BT@SatUFract";
break;
836 case BuiltinType::SatULongFract:
837 Out <<
"@BT@SatULongFract";
break;
838 case BuiltinType::BFloat16:
839 Out <<
"@BT@__bf16";
break;
840 case BuiltinType::Ibm128:
841 Out <<
"@BT@__ibm128";
break;
842 case BuiltinType::ObjCId:
844 case BuiltinType::ObjCClass:
846 case BuiltinType::ObjCSel:
848#define BUILTIN_TYPE(Id, SingletonId)
849#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
850#include "clang/AST/BuiltinTypes.def"
851 case BuiltinType::Dependent:
854 IgnoreResults =
true;
862 llvm::DenseMap<const Type *, unsigned>::iterator Substitution
863 = TypeSubstitutions.find(
T.getTypePtr());
864 if (Substitution != TypeSubstitutions.end()) {
865 Out <<
'S' << Substitution->second <<
'_';
869 unsigned Number = TypeSubstitutions.size();
870 TypeSubstitutions[
T.getTypePtr()] = Number;
895 VisitType(FT->getReturnType());
897 for (
const auto &I : FT->param_types()) {
902 if (FT->isVariadic())
913 T = CT->getElementType();
918 VisitTagDecl(TT->getDecl());
923 VisitObjCInterfaceDecl(OIT->getDecl());
928 VisitType(OIT->getBaseType());
929 for (
auto *Prot : OIT->getProtocols())
930 VisitObjCProtocolDecl(Prot);
934 Out <<
't' << TTP->getDepth() <<
'.' << TTP->getIndex();
940 VisitTemplateName(Spec->getTemplateName());
941 Out << Spec->template_arguments().size();
942 for (
const auto &Arg : Spec->template_arguments())
943 VisitTemplateArgument(Arg);
949 Out <<
':' << DNT->getIdentifier()->getName();
953 T = InjT->getInjectedSpecializationType();
958 Out << VT->getNumElements();
959 T = VT->getElementType();
962 if (
const auto *
const AT = dyn_cast<ArrayType>(
T)) {
964 switch (AT->getSizeModifier()) {
965 case ArraySizeModifier::Static:
968 case ArraySizeModifier::Star:
971 case ArraySizeModifier::Normal:
975 if (
const auto *
const CAT = dyn_cast<ConstantArrayType>(
T))
976 Out << CAT->getSize();
978 T = AT->getElementType();
988void USRGenerator::VisitTemplateParameterList(
992 Out <<
'>' << Params->
size();
994 PEnd = Params->
end();
997 if (isa<TemplateTypeParmDecl>(*
P)) {
998 if (cast<TemplateTypeParmDecl>(*P)->isParameterPack())
1005 if (NTTP->isParameterPack())
1008 VisitType(NTTP->getType());
1020void USRGenerator::VisitTemplateName(
TemplateName Name) {
1021 if (
TemplateDecl *Template = Name.getAsTemplateDecl()) {
1023 = dyn_cast<TemplateTemplateParmDecl>(Template)) {
1024 Out <<
't' << TTP->getDepth() <<
'.' << TTP->getIndex();
1061 VisitTemplateArgument(
P);
1079 Out << Hash.CalculateHash();
1086 if (ShouldGenerateLocation(
D) && GenLoc(
D, isLocal(
D)))
1095 if (ShouldGenerateLocation(
D) && GenLoc(
D, isLocal(
D)))
1100 Out <<
D->getName();
1103void USRGenerator::VisitConceptDecl(
const ConceptDecl *
D) {
1104 if (ShouldGenerateLocation(
D) && GenLoc(
D, isLocal(
D)))
1111void USRGenerator::VisitMSGuidDecl(
const MSGuidDecl *
D) {
1114 D->NamedDecl::printName(Out);
1122 StringRef CatSymDefinedIn,
1124 if (ClsSymDefinedIn.empty() && CatSymDefinedIn.empty())
1126 if (CatSymDefinedIn.empty()) {
1127 OS <<
"@M@" << ClsSymDefinedIn <<
'@';
1130 OS <<
"@CM@" << CatSymDefinedIn <<
'@';
1131 if (ClsSymDefinedIn != CatSymDefinedIn) {
1132 OS << ClsSymDefinedIn <<
'@';
1137 StringRef ExtSymDefinedIn,
1138 StringRef CategoryContextExtSymbolDefinedIn) {
1140 CategoryContextExtSymbolDefinedIn, OS);
1141 OS <<
"objc(cs)" << Cls;
1146 StringRef ClsSymDefinedIn,
1147 StringRef CatSymDefinedIn) {
1149 OS <<
"objc(cy)" << Cls <<
'@' << Cat;
1157 bool IsInstanceMethod,
1159 OS << (IsInstanceMethod ?
"(im)" :
"(cm)") << Sel;
1164 OS << (isClassProp ?
"(cpy)" :
"(py)") << Prop;
1168 StringRef ExtSymDefinedIn) {
1169 if (!ExtSymDefinedIn.empty())
1170 OS <<
"@M@" << ExtSymDefinedIn <<
'@';
1171 OS <<
"objc(pl)" << Prot;
1175 StringRef ExtSymDefinedIn) {
1176 if (!ExtSymDefinedIn.empty())
1177 OS <<
"@M@" << ExtSymDefinedIn;
1178 OS <<
"@E@" << EnumName;
1183 OS <<
'@' << EnumConstantName;
1203 if (
auto *ExternalSymAttr = CD->
getAttr<ExternalSourceSymbolAttr>()) {
1204 if (!ExternalSymAttr->getUSR().empty()) {
1205 llvm::raw_svector_ostream Out(Buf);
1206 Out << ExternalSymAttr->getUSR();
1212 return UG.ignoreResults();
1228 if (MacroName.empty())
1231 llvm::raw_svector_ostream Out(Buf);
1235 bool ShouldGenerateLocation =
Loc.
isValid() && !
SM.isInSystemHeader(
Loc);
1238 if (ShouldGenerateLocation)
1255 T =
T.getCanonicalType();
1257 USRGenerator UG(&Ctx, Buf, LangOpts);
1259 return UG.ignoreResults();
1284 OS <<
"@M@" << ModName;
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::FileManager interface and associated types.
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes,...
static void combineClassAndCategoryExtContainers(StringRef ClsSymDefinedIn, StringRef CatSymDefinedIn, raw_ostream &OS)
static bool printLoc(llvm::raw_ostream &OS, SourceLocation Loc, const SourceManager &SM, bool IncludeOffset)
static const ObjCCategoryDecl * getCategoryContext(const NamedDecl *D)
static void printQualifier(llvm::raw_ostream &Out, const LangOptions &LangOpts, NestedNameSpecifier *NNS)
static StringRef GetExternalSourceContainer(const NamedDecl *D)
__device__ __2f16 float __ockl_bool s
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
const LangOptions & getLangOpts() const
const ObjCInterfaceDecl * getObjContainingInterface(const NamedDecl *ND) const
Returns the Objective-C interface that ND belongs to if it is an Objective-C method/property/ivar etc...
A binding in a decomposition declaration.
This class is used for builtin types like 'int'.
Represents a static or instance method of a struct/union/class.
Represents a C++ struct/union/class.
Declaration of a class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
Complex values, per C99 6.2.5p11.
Declaration of a C++20 concept.
A simple visitor class that helps create declaration visitors.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Decl - This represents one declaration (or definition), e.g.
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
ASTContext & getASTContext() const LLVM_READONLY
ExternalSourceSymbolAttr * getExternalSourceSymbolAttr() const
Looks on this and related declarations for an applicable external source symbol attribute.
SourceLocation getLocation() const
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
bool isEmpty() const
Evaluates true when this declaration name is empty.
Represents a qualified type name for which the type name is dependent.
Represents a member of a struct/union/class.
StringRef getName() const
The name of this FileEntry.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
Declaration of a template function.
StringRef getName() const
Return the actual identifier string.
The injected class name of a C++ class template or class template partial specialization.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Represents a linkage specification.
Record the location of a macro definition.
SourceLocation getLocation() const
Retrieve the location of the macro name in the definition.
const IdentifierInfo * getName() const
Retrieve the name of the macro being defined.
Describes a module or submodule.
Module * Parent
The parent of this module.
std::string Name
The name of this module.
This represents a decl that may have a name.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Represents a C++ namespace alias.
Represent a C++ namespace.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false) const
Print this nested name specifier to the given output stream.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
void AddStructuralValue(const APValue &)
ObjCCategoryDecl - Represents a category declaration.
ObjCInterfaceDecl * getClassInterface()
bool IsClassExtension() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCContainerDecl - Represents a container for method declarations.
const ObjCInterfaceDecl * getClassInterface() const
Represents an ObjC class declaration.
Interfaces are the core concept in Objective-C for object oriented design.
ObjCMethodDecl - Represents an instance or class method declaration.
Represents a pointer to an Objective C object.
Represents a class type in Objective C.
Represents one property declaration in an Objective-C interface.
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Represents an Objective-C protocol declaration.
Represents a pack expansion of types.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
The collection of all-type qualifiers we support.
An rvalue reference type, per C++11 [dcl.ref].
Base for LValueReferenceType and RValueReferenceType.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
Represents the declaration of a struct/union/class/enum.
A template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
Represents a template argument.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
QualType getIntegralType() const
Retrieve the type of the integral value.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl *const * const_iterator
Iterates through the template parameters in this list.
Represents a type template specialization; the template must be a class template, a type alias templa...
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
Declaration of a template type parameter.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isExtVectorType() const
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
Represents a dependent using declaration which was marked with typename.
Represents a dependent using declaration which was not marked with typename.
Represents a C++ using-declaration.
Represents C++ using-directive.
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...
Represents a GCC generic vector type.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
bool generateFullUSRForTopLevelModuleName(StringRef ModName, raw_ostream &OS)
Generate a USR for a top-level module name, including the USR prefix.
static StringRef getUSRSpacePrefix()
void generateUSRForObjCCategory(StringRef Cls, StringRef Cat, raw_ostream &OS, StringRef ClsExtSymbolDefinedIn="", StringRef CatExtSymbolDefinedIn="")
Generate a USR fragment for an Objective-C class category.
bool generateFullUSRForModule(const Module *Mod, raw_ostream &OS)
Generate a USR for a module, including the USR prefix.
bool generateUSRFragmentForModuleName(StringRef ModName, raw_ostream &OS)
Generate a USR fragment for a module name.
bool generateUSRForMacro(const MacroDefinitionRecord *MD, const SourceManager &SM, SmallVectorImpl< char > &Buf)
Generate a USR for a macro, including the USR prefix.
void generateUSRForObjCProperty(StringRef Prop, bool isClassProp, raw_ostream &OS)
Generate a USR fragment for an Objective-C property.
void generateUSRForEnumConstant(StringRef EnumConstantName, raw_ostream &OS)
Generate a USR fragment for an enum constant.
void generateUSRForObjCIvar(StringRef Ivar, raw_ostream &OS)
Generate a USR fragment for an Objective-C instance variable.
void generateUSRForObjCMethod(StringRef Sel, bool IsInstanceMethod, raw_ostream &OS)
Generate a USR fragment for an Objective-C method.
bool generateUSRForType(QualType T, ASTContext &Ctx, SmallVectorImpl< char > &Buf)
Generates a USR for a type.
void generateUSRForObjCClass(StringRef Cls, raw_ostream &OS, StringRef ExtSymbolDefinedIn="", StringRef CategoryContextExtSymbolDefinedIn="")
Generate a USR fragment for an Objective-C class.
void generateUSRForGlobalEnum(StringRef EnumName, raw_ostream &OS, StringRef ExtSymbolDefinedIn="")
Generate USR fragment for a global (non-nested) enum.
void generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS, StringRef ExtSymbolDefinedIn="")
Generate a USR fragment for an Objective-C protocol.
bool generateUSRFragmentForModule(const Module *Mod, raw_ostream &OS)
Generate a USR fragment for a module.
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.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
const FunctionProtoType * T
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressUnwrittenScope
Suppress printing parts of scope specifiers that are never written, e.g., for anonymous namespaces.
unsigned AnonymousTagLocations
When printing an anonymous tag name, also print the location of that entity (e.g.,...
unsigned ConstantArraySizeAsWritten
Whether we should print the sizes of constant array expressions as written in the sources.
unsigned SuppressTagKeyword
Whether type printing should skip printing the tag keyword.