27#include "llvm/ADT/SmallString.h"
28#include "llvm/ADT/SmallVector.h"
29#include "llvm/Support/Casting.h"
30#include "llvm/Support/ErrorHandling.h"
31#include "llvm/Support/raw_ostream.h"
47 if (Elts == 0)
return;
49 List =
new (Ctx)
void*[Elts];
61 set(InList, Elts, Ctx);
76void ObjCContainerDecl::anchor() {}
84 Ivar != IvarEnd; ++Ivar) {
85 if (
auto *ivar = dyn_cast<ObjCIvarDecl>(*Ivar))
94 bool AllowHidden)
const {
97 if (
const auto *Proto = dyn_cast<ObjCProtocolDecl>(
this)) {
99 if (!Def->isUnconditionallyVisible() && !AllowHidden)
112 Meth != MethEnd; ++Meth) {
113 auto *MD = dyn_cast<ObjCMethodDecl>(*Meth);
114 if (MD && MD->isInstanceMethod() == isInstance)
130 Meth != MethEnd; ++Meth) {
131 auto *MD = dyn_cast<ObjCMethodDecl>(*Meth);
132 if (MD && MD->isInstanceMethod() && !MD->isImplicit())
136 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(
this)) {
139 for (
const auto *Cat : ID->visible_categories()) {
141 if (!MD->isImplicit())
143 if (Cat->IsClassExtension())
149 for (
const auto *
P : Cat->properties())
150 if (
P->getIdentifier() ==
Property->getIdentifier()) {
151 if (
P->getPropertyAttributes() &
159 for (
const auto *Proto : ID->all_referenced_protocols())
160 if (Proto->HasUserDeclaredSetterMethod(
Property))
171 if (
const auto *PD = dyn_cast<ObjCProtocolDecl>(
this))
172 for (
const auto *PI : PD->protocols())
173 if (PI->HasUserDeclaredSetterMethod(
Property))
184 if (
const auto *Proto = dyn_cast<ObjCProtocolDecl>(DC)) {
186 if (!Def->isUnconditionallyVisible())
192 if (
auto *IDecl = dyn_cast<ObjCInterfaceDecl>(DC)) {
193 for (
const auto *Ext : IDecl->visible_extensions())
204 if (
auto *PD = dyn_cast<ObjCPropertyDecl>(*I)) {
208 !PD->isClassProperty()) ||
210 PD->isClassProperty()) ||
212 !PD->isClassProperty()))
215 if (PD->isClassProperty())
230 llvm::raw_svector_ostream os(ivarName);
237 bool IsInstance)
const {
239 if (
auto *Prop = dyn_cast<ObjCPropertyDecl>(
LookupResult)) {
240 if (Prop->isInstanceProperty() == IsInstance) {
254 if (
const auto *Proto = dyn_cast<ObjCProtocolDecl>(
this)) {
256 if (!Def->isUnconditionallyVisible())
262 if (
const auto *ClassDecl = dyn_cast<ObjCInterfaceDecl>(
this)) {
263 for (
const auto *Ext : ClassDecl->visible_extensions()) {
264 if (
auto *
P = Ext->FindPropertyDeclaration(PropertyId, QueryKind))
277 case Decl::ObjCProtocol: {
278 const auto *PID = cast<ObjCProtocolDecl>(
this);
279 for (
const auto *I : PID->protocols())
285 case Decl::ObjCInterface: {
286 const auto *OID = cast<ObjCInterfaceDecl>(
this);
288 for (
const auto *Cat : OID->visible_categories()) {
289 if (!Cat->IsClassExtension())
291 PropertyId, QueryKind))
296 for (
const auto *I : OID->all_referenced_protocols())
303 return superClass->FindPropertyDeclaration(PropertyId, QueryKind);
306 case Decl::ObjCCategory: {
307 const auto *OCD = cast<ObjCCategoryDecl>(
this);
309 if (!OCD->IsClassExtension())
310 for (
const auto *I : OCD->protocols())
320void ObjCInterfaceDecl::anchor() {}
329 return def->getTypeParamListAsWritten();
348 for (
auto *typeParam : *TypeParamList)
349 typeParam->setDeclContext(
this);
357 if (data().ExternallyCompleted)
358 LoadExternalDefinition();
374 return superTInfo->getTypeLoc().getBeginLoc();
388 if (data().ExternallyCompleted)
389 LoadExternalDefinition();
407 PM[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] = Prop;
412 PM[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] = Prop;
425 if (
Class->hasAttr<ArcWeakrefUnavailableAttr>())
435 if (
Class->hasAttr<ObjCRequiresPropertyDefsAttr>())
445 if (data().ExternallyCompleted)
446 LoadExternalDefinition();
448 if (data().AllReferencedProtocols.empty() &&
449 data().ReferencedProtocols.empty()) {
450 data().AllReferencedProtocols.set(ExtList, ExtNum,
C);
458 for (
unsigned i = 0; i < ExtNum; i++) {
459 bool protocolExists =
false;
462 if (
C.ProtocolCompatibleWithProtocol(ProtoInExtension, Proto)) {
463 protocolExists =
true;
470 ProtocolRefs.push_back(ProtoInExtension);
473 if (ProtocolRefs.empty())
480 data().AllReferencedProtocols.set(ProtocolRefs.data(), ProtocolRefs.size(),
C);
484ObjCInterfaceDecl::findInterfaceWithDesignatedInitializers()
const {
489 if (!IFace->inheritsDesignatedInitializers())
497 for (
const auto *MD :
D->instance_methods()) {
498 if (MD->getMethodFamily() ==
OMF_init && !MD->isOverriding())
501 for (
const auto *Ext :
D->visible_extensions()) {
502 for (
const auto *MD : Ext->instance_methods()) {
503 if (MD->getMethodFamily() ==
OMF_init && !MD->isOverriding())
507 if (
const auto *ImplD =
D->getImplementation()) {
508 for (
const auto *MD : ImplD->instance_methods()) {
509 if (MD->getMethodFamily() ==
OMF_init && !MD->isOverriding())
516bool ObjCInterfaceDecl::inheritsDesignatedInitializers()
const {
517 switch (data().InheritedDesignatedInitializers) {
518 case DefinitionData::IDI_Inherited:
520 case DefinitionData::IDI_NotInherited:
522 case DefinitionData::IDI_Unknown:
527 data().InheritedDesignatedInitializers = DefinitionData::IDI_NotInherited;
530 data().InheritedDesignatedInitializers =
531 SuperD->declaresOrInheritsDesignatedInitializers() ?
532 DefinitionData::IDI_Inherited :
533 DefinitionData::IDI_NotInherited;
535 data().InheritedDesignatedInitializers =
536 DefinitionData::IDI_NotInherited;
539 assert(data().InheritedDesignatedInitializers
540 != DefinitionData::IDI_Unknown);
541 return data().InheritedDesignatedInitializers ==
542 DefinitionData::IDI_Inherited;
545 llvm_unreachable(
"unexpected InheritedDesignatedInitializers value");
553 if (data().ExternallyCompleted)
554 LoadExternalDefinition();
561 if (MD->isThisDeclarationADesignatedInitializer())
562 Methods.push_back(MD);
564 for (
const auto *MD : Ext->instance_methods())
565 if (MD->isThisDeclarationADesignatedInitializer())
566 Methods.push_back(MD);
578 HasCompleteDef =
true;
584 if (data().ExternallyCompleted)
585 LoadExternalDefinition();
592 if (MD->isThisDeclarationADesignatedInitializer()) {
600 if (MD->isThisDeclarationADesignatedInitializer()) {
610void ObjCInterfaceDecl::allocateDefinitionData() {
611 assert(!
hasDefinition() &&
"ObjC class already has a definition");
613 Data.getPointer()->Definition =
this;
617 allocateDefinitionData();
627 Data.setPointer(
nullptr);
628 allocateDefinitionData();
643 if (data().ExternallyCompleted)
644 LoadExternalDefinition();
647 while (ClassDecl !=
nullptr) {
649 clsDeclared = ClassDecl;
655 clsDeclared = ClassDecl;
674 if (data().ExternallyCompleted)
675 LoadExternalDefinition();
678 while (ClassDecl !=
nullptr) {
689 if (
P->lookupProtocolNamed(Name))
701 bool shallowCategoryLookup,
712 if (data().ExternallyCompleted)
713 LoadExternalDefinition();
717 if ((MethodDecl = ClassDecl->
getMethod(Sel, isInstance)))
722 if ((MethodDecl = Cat->getMethod(Sel, isInstance)))
727 for (
const auto *I : ClassDecl->
protocols())
728 if ((MethodDecl = I->lookupMethod(Sel, isInstance)))
732 if (!shallowCategoryLookup)
736 Cat->getReferencedProtocols();
737 for (
auto *Protocol : Protocols)
738 if ((MethodDecl = Protocol->lookupMethod(Sel, isInstance)))
758 bool Instance)
const {
763 if (data().ExternallyCompleted)
764 LoadExternalDefinition();
768 Method = Instance ? ImpDecl->getInstanceMethod(Sel)
769 : ImpDecl->getClassMethod(Sel);
792 assert(
hasDefinition() &&
"ODRHash only for records with definitions");
796 return data().ODRHash;
804 return data().ODRHash;
807bool ObjCInterfaceDecl::hasODRHash()
const {
810 return data().HasODRHash;
813void ObjCInterfaceDecl::setHasODRHash(
bool HasHash) {
814 assert(
hasDefinition() &&
"Cannot set ODRHash without definition");
815 data().HasODRHash = HasHash;
822ObjCMethodDecl::ObjCMethodDecl(
825 bool isInstance,
bool isVariadic,
bool isPropertyAccessor,
826 bool isSynthesizedAccessorStub,
bool isImplicitlyDeclared,
bool isDefined,
828 :
NamedDecl(ObjCMethod, contextDecl, beginLoc, SelInfo),
829 DeclContext(ObjCMethod), MethodDeclType(
T), ReturnTInfo(ReturnTInfo),
835 setInstanceMethod(isInstance);
836 setVariadic(isVariadic);
837 setPropertyAccessor(isPropertyAccessor);
838 setSynthesizedAccessorStub(isSynthesizedAccessorStub);
839 setDefined(isDefined);
840 setIsRedeclaration(
false);
841 setHasRedeclaration(
false);
842 setDeclImplementation(impControl);
844 setRelatedResultType(HasRelatedResultType);
846 setOverriding(
false);
847 setHasSkippedBody(
false);
855 DeclContext *contextDecl,
bool isInstance,
bool isVariadic,
856 bool isPropertyAccessor,
bool isSynthesizedAccessorStub,
857 bool isImplicitlyDeclared,
bool isDefined,
860 beginLoc, endLoc, SelInfo,
T, ReturnTInfo, contextDecl, isInstance,
862 isImplicitlyDeclared,
isDefined, impControl, HasRelatedResultType);
872 return hasAttr<ObjCDirectAttr>() &&
878 hasAttr<ObjCDesignatedInitializerAttr>();
882 if (
const auto *PD = dyn_cast<const ObjCProtocolDecl>(
getDeclContext()))
884 if (
const auto *ID = dyn_cast<const ObjCInterfaceDecl>(
getDeclContext()))
894 if (isa<ObjCProtocolDecl>(DC))
897 return ID->isDesignatedInitializer(
getSelector(), InitMethod);
903 if (param->isDestroyedInCallee())
920void ObjCMethodDecl::setParamsAndSelLocs(
ASTContext &
C,
923 ParamsAndSelLocs =
nullptr;
924 NumParams = Params.size();
925 if (Params.empty() && SelLocs.empty())
929 "Alignment not sufficient for SourceLocation");
931 unsigned Size =
sizeof(
ParmVarDecl *) * NumParams +
933 ParamsAndSelLocs =
C.Allocate(Size);
934 std::uninitialized_copy(Params.begin(), Params.end(), getParams());
935 std::uninitialized_copy(SelLocs.begin(), SelLocs.end(), getStoredSelLocs());
948 "No selector locs for non-implicit method");
950 return setParamsAndSelLocs(
C, Params, std::nullopt);
955 return setParamsAndSelLocs(
C, Params, std::nullopt);
957 setParamsAndSelLocs(
C, Params, SelLocs);
973 if (!CtxD->isInvalidDecl()) {
974 if (
auto *IFD = dyn_cast<ObjCInterfaceDecl>(CtxD)) {
976 if (!ImplD->isInvalidDecl())
979 }
else if (
auto *CD = dyn_cast<ObjCCategoryDecl>(CtxD)) {
981 if (!ImplD->isInvalidDecl())
984 }
else if (
auto *ImplD = dyn_cast<ObjCImplementationDecl>(CtxD)) {
986 if (!IFD->isInvalidDecl())
989 }
else if (
auto *CImplD = dyn_cast<ObjCCategoryImplDecl>(CtxD)) {
991 if (!CatD->isInvalidDecl())
999 if (Redecl && cast<Decl>(Redecl->
getDeclContext())->isInvalidDecl())
1004 return cast<ObjCContainerDecl>(CtxD)->getMethod(
getSelector(),
1009 return Redecl ? Redecl :
this;
1016 if (
auto *ImplD = dyn_cast<ObjCImplementationDecl>(CtxD)) {
1026 for (
auto *Ext : IFD->known_extensions())
1030 }
else if (
auto *CImplD = dyn_cast<ObjCCategoryImplDecl>(CtxD)) {
1041 return MD ? MD :
this;
1049 return Body->getEndLoc();
1059 if (
const ObjCMethodFamilyAttr *
attr = getAttr<ObjCMethodFamilyAttr>()) {
1062 switch (
attr->getFamily()) {
1063 case ObjCMethodFamilyAttr::OMF_None: family =
OMF_None;
break;
1064 case ObjCMethodFamilyAttr::OMF_alloc: family =
OMF_alloc;
break;
1065 case ObjCMethodFamilyAttr::OMF_copy: family =
OMF_copy;
break;
1066 case ObjCMethodFamilyAttr::OMF_init: family =
OMF_init;
break;
1067 case ObjCMethodFamilyAttr::OMF_mutableCopy: family =
OMF_mutableCopy;
break;
1068 case ObjCMethodFamilyAttr::OMF_new: family =
OMF_new;
break;
1117 if (noParams < 1 || noParams > 3)
1126 while (--noParams) {
1147 bool &selfIsPseudoStrong,
1148 bool &selfIsConsumed)
const {
1150 selfIsPseudoStrong =
false;
1151 selfIsConsumed =
false;
1166 selfIsConsumed = hasAttr<NSConsumesSelfAttr>();
1177 selfIsPseudoStrong =
true;
1184 selfIsPseudoStrong =
true;
1192 bool selfIsPseudoStrong, selfIsConsumed;
1194 getSelfType(Context, OID, selfIsPseudoStrong, selfIsConsumed);
1201 Self->addAttr(NSConsumedAttr::CreateImplicit(Context));
1203 if (selfIsPseudoStrong)
1204 Self->setARCPseudoStrong(
true);
1215 return CD->getClassInterface();
1217 return IMD->getClassInterface();
1220 llvm_unreachable(
"unknown method context");
1226 if (
auto *IMD = dyn_cast<ObjCCategoryImplDecl>(
getDeclContext()))
1227 return IMD->getCategoryDecl();
1234 return TSI->getTypeLoc().getSourceRange();
1255 bool MovedToSuper) {
1262 if (
const auto *
Category = dyn_cast<ObjCCategoryDecl>(Container)) {
1267 Overridden = Container->getMethod(Method->
getSelector(),
1270 if (Method != Overridden) {
1273 Methods.push_back(Overridden);
1277 for (
const auto *
P :
Category->protocols())
1284 Overridden = Container->getMethod(Method->
getSelector(),
1287 if (Method != Overridden) {
1290 Methods.push_back(Overridden);
1294 if (
const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)){
1295 for (
const auto *
P : Protocol->protocols())
1299 if (
const auto *
Interface = dyn_cast<ObjCInterfaceDecl>(Container)) {
1303 for (
const auto *Cat :
Interface->known_categories())
1323 if (
const auto *ProtD =
1327 }
else if (
const auto *IMD =
1340 }
else if (
const auto *CatD =
1356 Method, overridden);
1372 assert(!Overridden.empty() &&
1373 "ObjCMethodDecl's overriding bit is not as expected");
1385 const auto *Container = cast<ObjCContainerDecl>(
getParent());
1387 if (
auto *ImplDecl = dyn_cast<ObjCImplDecl>(Container))
1389 Container = ImplDecl->getClassInterface();
1391 bool IsGetter = (NumArgs == 0);
1396 auto findMatchingProperty =
1399 for (
const auto *I : Container->instance_properties()) {
1400 Selector NextSel = IsGetter ? I->getGetterName()
1401 : I->getSetterName();
1406 for (
const auto *I : Container->class_properties()) {
1407 Selector NextSel = IsGetter ? I->getGetterName()
1408 : I->getSetterName();
1418 if (
const auto *
Found = findMatchingProperty(Container))
1423 if (
const auto *
Category = dyn_cast<ObjCCategoryDecl>(Container)) {
1424 ClassDecl =
Category->getClassInterface();
1425 if (
const auto *
Found = findMatchingProperty(ClassDecl))
1429 ClassDecl = cast<ObjCInterfaceDecl>(Container);
1431 assert(ClassDecl &&
"Failed to find main class");
1435 if (Ext == Container)
1437 if (
const auto *
Found = findMatchingProperty(Ext))
1444 if (Cat == Container)
1446 if (
const auto *
Found = findMatchingProperty(Cat))
1450 llvm_unreachable(
"Marked as a property accessor but no property found!");
1453 if (!CheckOverrides)
1458 OverridesTy Overrides;
1460 for (
const auto *Override : Overrides)
1471void ObjCTypeParamDecl::anchor() {}
1483 nameLoc, name, colonLoc, boundInfo);
1516 : Brackets(lAngleLoc, rAngleLoc), NumParams(typeParams.size()) {
1517 std::copy(typeParams.begin(), typeParams.end(), begin());
1526 ctx.
Allocate(totalSizeToAlloc<ObjCTypeParamDecl *>(typeParams.size()),
1533 typeArgs.reserve(
size());
1534 for (
auto *typeParam : *
this)
1535 typeArgs.push_back(typeParam->getUnderlyingType());
1549 Result->Data.setInt(!
C.getLangOpts().Modules);
1550 C.getObjCInterfaceType(
Result, PrevDecl);
1559 Result->Data.setInt(!
C.getLangOpts().Modules);
1563ObjCInterfaceDecl::ObjCInterfaceDecl(
1568 redeclarable_base(
C) {
1573 Data = PrevDecl->Data;
1580void ObjCInterfaceDecl::LoadExternalDefinition()
const {
1581 assert(data().ExternallyCompleted &&
"Class is not externally completed");
1582 data().ExternallyCompleted =
false;
1589 "Class can't be externally completed without an external source");
1591 "Forward declarations can't be externally completed");
1592 data().ExternallyCompleted =
true;
1599 data().HasDesignatedInitializers =
true;
1606 if (data().ExternallyCompleted)
1607 LoadExternalDefinition();
1609 return data().HasDesignatedInitializers;
1614 if (
const auto *ObjCRTName = getAttr<ObjCRuntimeNameAttr>())
1615 return ObjCRTName->getMetadataName();
1624 return ID->getObjCRuntimeNameAsString();
1631 if (data().ExternallyCompleted)
1632 LoadExternalDefinition();
1648struct SynthesizeIvarChunk {
1653 : Size(size), Ivar(ivar) {}
1656bool operator<(
const SynthesizeIvarChunk & LHS,
1657 const SynthesizeIvarChunk &RHS) {
1658 return LHS.Size < RHS.Size;
1678 if (!data().IvarList) {
1682 (void)Ext->ivar_empty();
1686 data().IvarList = *I; ++I;
1687 for (curIvar = data().IvarList; I !=
E; curIvar = *I, ++I)
1692 if (!Ext->ivar_empty()) {
1694 I = Ext->ivar_begin(),
1695 E = Ext->ivar_end();
1696 if (!data().IvarList) {
1697 data().IvarList = *I; ++I;
1698 curIvar = data().IvarList;
1700 for ( ;I !=
E; curIvar = *I, ++I)
1704 data().IvarListMissingImplementation =
true;
1708 if (!data().IvarListMissingImplementation)
1709 return data().IvarList;
1712 data().IvarListMissingImplementation =
false;
1713 if (!ImplDecl->ivar_empty()) {
1715 for (
auto *IV : ImplDecl->ivars()) {
1716 if (IV->getSynthesize() && !IV->isInvalidDecl()) {
1717 layout.push_back(SynthesizeIvarChunk(
1718 IV->getASTContext().getTypeSize(IV->getType()), IV));
1721 if (!data().IvarList)
1722 data().IvarList = IV;
1728 if (!layout.empty()) {
1730 llvm::stable_sort(layout);
1731 unsigned Ix = 0, EIx = layout.size();
1732 if (!data().IvarList) {
1733 data().IvarList = layout[0].Ivar; Ix++;
1734 curIvar = data().IvarList;
1736 for ( ; Ix != EIx; curIvar = layout[Ix].Ivar, Ix++)
1741 return data().IvarList;
1754 if (data().ExternallyCompleted)
1755 LoadExternalDefinition();
1758 if (Cat->getIdentifier() == CategoryId)
1789 bool lookupCategory,
1790 bool RHSIsQualifiedID) {
1797 if (
getASTContext().ProtocolCompatibleWithProtocol(lProto, PI))
1805 if (RHSIsQualifiedID &&
1813 for (
auto *PI : Cat->protocols())
1814 if (
getASTContext().ProtocolCompatibleWithProtocol(lProto, PI))
1831void ObjCIvarDecl::anchor() {}
1838 Expr *BW,
bool synthesized) {
1850 assert((isa<ObjCInterfaceDecl>(DC) || isa<ObjCImplementationDecl>(DC) ||
1851 isa<ObjCCategoryDecl>(DC)) &&
1852 "Invalid ivar decl context!");
1855 auto *ID = dyn_cast<ObjCInterfaceDecl>(DC);
1857 if (
auto *IM = dyn_cast<ObjCImplementationDecl>(DC))
1858 ID = IM->getClassInterface();
1860 ID = cast<ObjCCategoryDecl>(DC)->getClassInterface();
1862 ID->setIvarList(
nullptr);
1878 switch (DC->getKind()) {
1880 case ObjCCategoryImpl:
1882 llvm_unreachable(
"invalid ivar container!");
1885 case ObjCCategory: {
1886 auto *CD = cast<ObjCCategoryDecl>(DC);
1887 assert(CD->IsClassExtension() &&
"invalid container for ivar!");
1888 return CD->getClassInterface();
1891 case ObjCImplementation:
1892 return cast<ObjCImplementationDecl>(DC)->getClassInterface();
1895 return cast<ObjCInterfaceDecl>(DC);
1908void ObjCAtDefsFieldDecl::anchor() {}
1928void ObjCProtocolDecl::anchor() {}
1935 redeclarable_base(
C) {
1936 setPreviousDecl(PrevDecl);
1938 Data = PrevDecl->Data;
1948 Result->Data.setInt(!
C.getLangOpts().Modules);
1957 Result->Data.setInt(!
C.getLangOpts().Modules);
1962 return hasAttr<ObjCNonRuntimeProtocolAttr>();
1966 llvm::DenseSet<const ObjCProtocolDecl *> &IPs)
const {
1967 std::queue<const ObjCProtocolDecl *> WorkQueue;
1968 WorkQueue.push(
this);
1970 while (!WorkQueue.empty()) {
1971 const auto *PD = WorkQueue.front();
1973 for (
const auto *
Parent : PD->protocols()) {
1974 const auto *Can =
Parent->getCanonicalDecl();
1975 auto Result = IPs.insert(Can);
1998 bool isInstance)
const {
2007 if ((MethodDecl =
getMethod(Sel, isInstance)))
2011 if ((MethodDecl = I->lookupMethod(Sel, isInstance)))
2016void ObjCProtocolDecl::allocateDefinitionData() {
2017 assert(!Data.getPointer() &&
"Protocol already has a definition!");
2019 Data.getPointer()->Definition =
this;
2020 Data.getPointer()->HasODRHash =
false;
2024 allocateDefinitionData();
2028 RD->Data = this->Data;
2032 Data.setPointer(
nullptr);
2033 allocateDefinitionData();
2044 for (
auto *Prop : PDecl->properties()) {
2046 PM.insert(std::make_pair(
2047 std::make_pair(Prop->getIdentifier(), Prop->isClassProperty()),
2051 for (
const auto *PI : PDecl->protocols())
2052 PI->collectPropertiesToImplement(PM);
2060 if (!PS.insert(PDecl).second)
2062 for (
auto *Prop : PDecl->properties()) {
2065 if (Prop->getIdentifier() ==
Property->getIdentifier()) {
2071 for (
const auto *PI : PDecl->protocols())
2072 PI->collectInheritedProtocolProperties(
Property, PS, PO);
2078 if (
const auto *ObjCRTName = getAttr<ObjCRuntimeNameAttr>())
2079 return ObjCRTName->getMetadataName();
2085 assert(
hasDefinition() &&
"ODRHash only for records with definitions");
2089 return data().ODRHash;
2095 setHasODRHash(
true);
2097 return data().ODRHash;
2100bool ObjCProtocolDecl::hasODRHash()
const {
2103 return data().HasODRHash;
2106void ObjCProtocolDecl::setHasODRHash(
bool HasHash) {
2107 assert(
hasDefinition() &&
"Cannot set ODRHash without definition");
2108 data().HasODRHash = HasHash;
2115void ObjCCategoryDecl::anchor() {}
2117ObjCCategoryDecl::ObjCCategoryDecl(
2123 ClassInterface(IDecl), CategoryNameLoc(CategoryNameLoc),
2124 IvarLBraceLoc(IvarLBraceLoc), IvarRBraceLoc(IvarRBraceLoc) {
2125 setTypeParamList(typeParamList);
2136 IDecl, typeParamList, IvarLBraceLoc,
2144 L->AddedObjCCategoryToInterface(CatDecl, IDecl);
2155 nullptr,
nullptr,
nullptr);
2168 TypeParamList = TPL;
2172 for (
auto *typeParam : *TypeParamList)
2173 typeParam->setDeclContext(
this);
2180void ObjCCategoryImplDecl::anchor() {}
2189 atStartLoc, CategoryNameLoc);
2206void ObjCImplDecl::anchor() {}
2210 property->setLexicalDeclContext(
this);
2217 if (
auto *ImplD = dyn_cast_or_null<ObjCImplementationDecl>(
this)) {
2221 }
else if (
auto *ImplD = dyn_cast_or_null<ObjCCategoryImplDecl>(
this)) {
2226 ClassInterface = IFace;
2235 if (PID->getPropertyIvarDecl() &&
2236 PID->getPropertyIvarDecl()->getIdentifier() == ivarId)
2251 if (PID->getPropertyDecl()->getIdentifier() ==
Id) {
2253 !PID->getPropertyDecl()->isClassProperty()) ||
2255 PID->getPropertyDecl()->isClassProperty()) ||
2257 !PID->getPropertyDecl()->isClassProperty()))
2260 if (PID->getPropertyDecl()->isClassProperty())
2261 ClassPropImpl = PID;
2266 return ClassPropImpl;
2281void ObjCImplementationDecl::anchor() {}
2295 nameLoc, atStartLoc, superLoc,
2296 IvarLBraceLoc, IvarRBraceLoc);
2307 unsigned numInitializers) {
2308 if (numInitializers > 0) {
2309 NumIvarInitializers = numInitializers;
2311 memcpy(ivarInitializers, initializers,
2313 IvarInitializers = ivarInitializers;
2332void ObjCCompatibleAliasDecl::anchor() {}
2352void ObjCPropertyDecl::anchor() {}
Defines the clang::ASTContext interface.
static void CollectOverriddenMethodsRecurse(const ObjCContainerDecl *Container, const ObjCMethodDecl *Method, SmallVectorImpl< const ObjCMethodDecl * > &Methods, bool MovedToSuper)
static bool isIntroducingInitializers(const ObjCInterfaceDecl *D)
static void collectOverriddenMethodsSlow(const ObjCMethodDecl *Method, SmallVectorImpl< const ObjCMethodDecl * > &overridden)
static void CollectOverriddenMethods(const ObjCContainerDecl *Container, const ObjCMethodDecl *Method, SmallVectorImpl< const ObjCMethodDecl * > &Methods)
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes,...
Defines the clang::SourceLocation class and associated facilities.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
QualType getObjCClassType() const
Represents the Objective-C Class type.
void setObjCImplementation(ObjCInterfaceDecl *IFaceD, ObjCImplementationDecl *ImplD)
Set the implementation of ObjCInterfaceDecl.
const LangOptions & getLangOpts() const
IdentifierInfo * getNSObjectName() const
Retrieve the identifier 'NSObject'.
QualType getObjCSelType() const
Retrieve the type that corresponds to the predefined Objective-C 'SEL' type.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
const ObjCMethodDecl * getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const
Get the duplicate declaration of a ObjCMethod in the same interface, or null if none exists.
QualType getObjCIdType() const
Represents the Objective-CC id type.
void * Allocate(size_t Size, unsigned Align=8) const
QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl, ArrayRef< ObjCProtocolDecl * > protocols) const
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
ObjCImplementationDecl * getObjCImplementation(ObjCInterfaceDecl *D)
Get the implementation of the ObjCInterfaceDecl D, or nullptr if none exists.
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Represents a C++ base or member initializer.
The results of name lookup within a DeclContext.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
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.
ObjCMethodDeclBitfields ObjCMethodDeclBits
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
void addDecl(Decl *D)
Add the declaration D into this context.
SourceLocation getEndLoc() const LLVM_READONLY
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Kind
Lists the kind of concrete classes of Decl.
SourceLocation getLocation() const
void setImplicit(bool I=true)
DeclContext * getDeclContext()
This represents one expression.
virtual void CompleteType(TagDecl *Tag)
Gives the external AST source an opportunity to complete an incomplete type.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Represents the results of name lookup.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
void AddObjCProtocolDecl(const ObjCProtocolDecl *P)
void AddObjCInterfaceDecl(const ObjCInterfaceDecl *Record)
Represents a field declaration created by an @defs(...).
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static ObjCAtDefsFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, Expr *BW)
ObjCCategoryDecl - Represents a category declaration.
static ObjCCategoryDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation AtLoc, SourceLocation ClassNameLoc, SourceLocation CategoryNameLoc, const IdentifierInfo *Id, ObjCInterfaceDecl *IDecl, ObjCTypeParamList *typeParamList, SourceLocation IvarLBraceLoc=SourceLocation(), SourceLocation IvarRBraceLoc=SourceLocation())
void setTypeParamList(ObjCTypeParamList *TPL)
Set the type parameters of this category.
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCategoryImplDecl * getImplementation() const
void setImplementation(ObjCCategoryImplDecl *ImplD)
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCCategoryDecl * getCategoryDecl() const
static ObjCCategoryImplDecl * Create(ASTContext &C, DeclContext *DC, const IdentifierInfo *Id, ObjCInterfaceDecl *classInterface, SourceLocation nameLoc, SourceLocation atStartLoc, SourceLocation CategoryNameLoc)
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCompatibleAliasDecl - Represents alias of a class.
static ObjCCompatibleAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, ObjCInterfaceDecl *aliasedClass)
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCContainerDecl - Represents a container for method declarations.
ObjCMethodDecl * getMethod(Selector Sel, bool isInstance, bool AllowHidden=false) const
void setAtStartLoc(SourceLocation Loc)
llvm::MapVector< std::pair< IdentifierInfo *, unsigned >, ObjCPropertyDecl * > PropertyMap
instmeth_range instance_methods() const
llvm::SmallDenseSet< const ObjCProtocolDecl *, 8 > ProtocolPropertySet
ObjCPropertyDecl * getProperty(const IdentifierInfo *Id, bool IsInstance) const
ObjCIvarDecl * getIvarDecl(IdentifierInfo *Id) const
getIvarDecl - This method looks up an ivar in this ContextDecl.
ObjCPropertyDecl * FindPropertyDeclaration(const IdentifierInfo *PropertyId, ObjCPropertyQueryKind QueryKind) const
FindPropertyDeclaration - Finds declaration of the property given its name in 'PropertyId' and return...
virtual void collectPropertiesToImplement(PropertyMap &PM) const
This routine collects list of properties to be implemented in the class.
prop_range properties() const
ObjCMethodDecl * getInstanceMethod(Selector Sel, bool AllowHidden=false) const
ObjCContainerDecl(Kind DK, DeclContext *DC, const IdentifierInfo *Id, SourceLocation nameLoc, SourceLocation atStartLoc)
bool HasUserDeclaredSetterMethod(const ObjCPropertyDecl *P) const
This routine returns 'true' if a user declared setter method was found in the class,...
void addPropertyImplementation(ObjCPropertyImplDecl *property)
propimpl_range property_impls() const
void setClassInterface(ObjCInterfaceDecl *IFace)
ObjCPropertyImplDecl * FindPropertyImplDecl(IdentifierInfo *propertyId, ObjCPropertyQueryKind queryKind) const
FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl added to the list of thos...
const ObjCInterfaceDecl * getClassInterface() const
ObjCPropertyImplDecl * FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const
FindPropertyImplIvarDecl - This method lookup the ivar in the list of properties implemented in this ...
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static ObjCImplementationDecl * Create(ASTContext &C, DeclContext *DC, ObjCInterfaceDecl *classInterface, ObjCInterfaceDecl *superDecl, SourceLocation nameLoc, SourceLocation atStartLoc, SourceLocation superLoc=SourceLocation(), SourceLocation IvarLBraceLoc=SourceLocation(), SourceLocation IvarRBraceLoc=SourceLocation())
StringRef getObjCRuntimeNameAsString() const
Produce a name to be used for class's metadata.
CXXCtorInitializer *const * init_const_iterator
init_const_iterator - Iterates through the ivar initializer list.
StringRef getName() const
getName - Get the name of identifier for the class interface associated with this implementation as a...
init_iterator init_begin()
init_begin() - Retrieve an iterator to the first initializer.
void setIvarInitializers(ASTContext &C, CXXCtorInitializer **initializers, unsigned numInitializers)
Represents an ObjC class declaration.
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameters of this class.
all_protocol_iterator all_referenced_protocol_end() const
ObjCInterfaceDecl * lookupInheritedClass(const IdentifierInfo *ICName)
lookupInheritedClass - This method returns ObjCInterfaceDecl * of the super class whose name is passe...
ivar_iterator ivar_end() const
ObjCPropertyDecl * FindPropertyVisibleInPrimaryClass(const IdentifierInfo *PropertyId, ObjCPropertyQueryKind QueryKind) const
FindPropertyVisibleInPrimaryClass - Finds declaration of the property with name 'PropertyId' in the p...
ObjCMethodDecl * getCategoryMethod(Selector Sel, bool isInstance) const
static ObjCInterfaceDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation atLoc, const IdentifierInfo *Id, ObjCTypeParamList *typeParamList, ObjCInterfaceDecl *PrevDecl, SourceLocation ClassLoc=SourceLocation(), bool isInternal=false)
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
void setCategoryListRaw(ObjCCategoryDecl *category)
Set the raw pointer to the start of the category/extension list.
bool hasDefinition() const
Determine whether this class has been defined.
all_protocol_range all_referenced_protocols() const
visible_extensions_range visible_extensions() const
ObjCTypeParamList * getTypeParamListAsWritten() const
Retrieve the type parameters written on this particular declaration of the class.
ObjCIvarDecl * all_declared_ivar_begin()
all_declared_ivar_begin - return first ivar declared in this class, its extensions and its implementa...
ObjCCategoryDecl * FindCategoryDeclaration(const IdentifierInfo *CategoryId) const
FindCategoryDeclaration - Finds category declaration in the list of categories for this class and ret...
ivar_iterator ivar_begin() const
protocol_range protocols() const
ObjCMethodDecl * lookupInstanceMethod(Selector Sel) const
Lookup an instance method for a given selector.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
void setImplementation(ObjCImplementationDecl *ImplD)
known_categories_range known_categories() const
const ObjCInterfaceDecl * isObjCRequiresPropertyDefs() const
isObjCRequiresPropertyDefs - Checks that a class or one of its super classes must not be auto-synthes...
SourceLocation getSuperClassLoc() const
Retrieve the starting location of the superclass.
all_protocol_iterator all_referenced_protocol_begin() const
void setExternallyCompleted()
Indicate that this Objective-C class is complete, but that the external AST source will be responsibl...
ObjCMethodDecl * getCategoryClassMethod(Selector Sel) const
ObjCCategoryDecl * getCategoryListRaw() const
Retrieve the raw pointer to the start of the category/extension list.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration of this class is actually also a definition.
ObjCMethodDecl * lookupPrivateMethod(const Selector &Sel, bool Instance=true) const
Lookup a method in the classes implementation hierarchy.
void setTypeParamList(ObjCTypeParamList *TPL)
Set the type parameters of this class.
ObjCMethodDecl * getCategoryInstanceMethod(Selector Sel) const
ObjCMethodDecl * lookupMethod(Selector Sel, bool isInstance, bool shallowCategoryLookup=false, bool followSuper=true, const ObjCCategoryDecl *C=nullptr) const
lookupMethod - This method returns an instance/class method by looking in the class,...
ObjCProtocolDecl * lookupNestedProtocol(IdentifierInfo *Name)
bool ClassImplementsProtocol(ObjCProtocolDecl *lProto, bool lookupCategory, bool RHSIsQualifiedID=false)
ClassImplementsProtocol - Checks that 'lProto' protocol has been implemented in IDecl class,...
StringRef getObjCRuntimeNameAsString() const
Produce a name to be used for class's metadata.
const ObjCObjectType * getSuperClassType() const
Retrieve the superclass type.
ObjCImplementationDecl * getImplementation() const
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasDesignatedInitializers() const
Returns true if this interface decl contains at least one initializer marked with the 'objc_designate...
void getDesignatedInitializers(llvm::SmallVectorImpl< const ObjCMethodDecl * > &Methods) const
Returns the designated initializers for the interface.
void startDefinition()
Starts the definition of this Objective-C class, taking it from a forward declaration (@class) to a d...
void collectPropertiesToImplement(PropertyMap &PM) const override
This routine collects list of properties to be implemented in the class.
bool isArcWeakrefUnavailable() const
isArcWeakrefUnavailable - Checks for a class or one of its super classes to be incompatible with __we...
visible_categories_range visible_categories() const
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCInterfaceDecl * getSuperClass() const
ObjCInterfaceDecl * getDefinition()
Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...
TypeSourceInfo * getSuperClassTInfo() const
bool isDesignatedInitializer(Selector Sel, const ObjCMethodDecl **InitMethod=nullptr) const
Returns true if the given selector is a designated initializer for the interface.
void startDuplicateDefinitionForComparison()
Starts the definition without sharing it with other redeclarations.
void setHasDesignatedInitializers()
Indicate that this interface decl contains at least one initializer marked with the 'objc_designated_...
void mergeDuplicateDefinitionWithCommon(const ObjCInterfaceDecl *Definition)
known_extensions_range known_extensions() const
ObjCIvarDecl - Represents an ObjC instance variable.
void setNextIvar(ObjCIvarDecl *ivar)
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
static ObjCIvarDecl * Create(ASTContext &C, ObjCContainerDecl *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, AccessControl ac, Expr *BW=nullptr, bool synthesized=false)
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
QualType getUsageType(QualType objectType) const
Retrieve the type of this instance variable when viewed as a member of a specific object type.
void ** List
List is an array of pointers to objects that are not owned by this object.
void set(void *const *InList, unsigned Elts, ASTContext &Ctx)
ObjCList - This is a simple template class used to hold various lists of decls etc,...
ObjCMethodDecl - Represents an instance or class method declaration.
bool isDesignatedInitializerForTheInterface(const ObjCMethodDecl **InitMethod=nullptr) const
Returns true if the method selector resolves to a designated initializer in the class's interface.
bool isOverriding() const
Whether this method overrides any other in the class hierarchy.
ArrayRef< ParmVarDecl * > parameters() const
unsigned param_size() const
void setSelfDecl(ImplicitParamDecl *SD)
bool isPropertyAccessor() const
void getOverriddenMethods(SmallVectorImpl< const ObjCMethodDecl * > &Overridden) const
Return overridden methods for the given Method.
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
void setHasRedeclaration(bool HRD) const
const ObjCPropertyDecl * findPropertyDecl(bool CheckOverrides=true) const
Returns the property associated with this method's selector.
QualType getSendResultType() const
Determine the type of an expression that sends a message to this function.
bool hasParamDestroyedInCallee() const
True if the method has a parameter that's destroyed in the callee.
void setIsRedeclaration(bool RD)
void setCmdDecl(ImplicitParamDecl *CD)
Stmt * getBody() const override
Retrieve the body of this method, if it has one.
ObjCMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
SourceLocation getEndLoc() const LLVM_READONLY
TypeSourceInfo * getReturnTypeSourceInfo() const
QualType getSelfType(ASTContext &Context, const ObjCInterfaceDecl *OID, bool &selfIsPseudoStrong, bool &selfIsConsumed) const
bool hasRedeclaration() const
True if redeclared in the same interface.
void setAsRedeclaration(const ObjCMethodDecl *PrevMethod)
param_type_iterator param_type_begin() const
bool isSynthesizedAccessorStub() const
SourceLocation getSelectorLoc(unsigned Index) const
SourceRange getReturnTypeSourceRange() const
void setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs=std::nullopt)
Sets the method's parameters and selector source locations.
bool isRedeclaration() const
True if this is a method redeclaration in the same interface.
bool isDirectMethod() const
True if the method is tagged as objc_direct.
llvm::mapped_iterator< param_const_iterator, GetTypeFn > param_type_iterator
Selector getSelector() const
bool isInstanceMethod() const
static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
bool isThisDeclarationADesignatedInitializer() const
Returns true if this specific method declaration is marked with the designated initializer attribute.
ObjCCategoryDecl * getCategory()
If this method is declared or implemented in a category, return that category.
bool definedInNSObject(const ASTContext &) const
Is this method defined in the NSObject base class?
ObjCMethodFamily getMethodFamily() const
Determines the family of this method.
void createImplicitParams(ASTContext &Context, const ObjCInterfaceDecl *ID)
createImplicitParams - Used to lazily create the self and cmd implicit parameters.
QualType getReturnType() const
unsigned getNumSelectorLocs() const
bool isClassMethod() const
ObjCInterfaceDecl * getClassInterface()
void getSelectorLocs(SmallVectorImpl< SourceLocation > &SelLocs) const
Represents a class type in Objective C.
Represents one property declaration in an Objective-C interface.
QualType getUsageType(QualType objectType) const
Retrieve the type when this property is used with a specific base object type.
static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)
Lookup a property by name in the specified DeclContext.
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
bool isDirectProperty() const
IdentifierInfo * getDefaultSynthIvarName(ASTContext &Ctx) const
Get the default name of the synthesized ivar.
static ObjCPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, SourceLocation AtLocation, SourceLocation LParenLocation, QualType T, TypeSourceInfo *TSI, PropertyControl propControl=None)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static ObjCPropertyImplDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation atLoc, SourceLocation L, ObjCPropertyDecl *property, Kind PK, ObjCIvarDecl *ivarDecl, SourceLocation ivarLoc)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Represents an Objective-C protocol declaration.
void mergeDuplicateDefinitionWithCommon(const ObjCProtocolDecl *Definition)
void startDuplicateDefinitionForComparison()
Starts the definition without sharing it with other redeclarations.
bool hasDefinition() const
Determine whether this protocol has a definition.
ObjCMethodDecl * lookupMethod(Selector Sel, bool isInstance) const
static ObjCProtocolDecl * Create(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, SourceLocation nameLoc, SourceLocation atStartLoc, ObjCProtocolDecl *PrevDecl)
ObjCProtocolDecl * getDefinition()
Retrieve the definition of this protocol, if any.
StringRef getObjCRuntimeNameAsString() const
Produce a name to be used for protocol's metadata.
void getImpliedProtocols(llvm::DenseSet< const ObjCProtocolDecl * > &IPs) const
Get the set of all protocols implied by this protocols inheritance hierarchy.
void startDefinition()
Starts the definition of this Objective-C protocol.
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
bool isNonRuntimeProtocol() const
This is true iff the protocol is tagged with the objc_non_runtime_protocol attribute.
void collectInheritedProtocolProperties(const ObjCPropertyDecl *Property, ProtocolPropertySet &PS, PropertyDeclOrder &PO) const
ObjCProtocolDecl * lookupProtocolNamed(IdentifierInfo *PName)
protocol_range protocols() const
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
void collectPropertiesToImplement(PropertyMap &PM) const override
This routine collects list of properties to be implemented in the class.
void set(ObjCProtocolDecl *const *InList, unsigned Elts, const SourceLocation *Locs, ASTContext &Ctx)
Represents the declaration of an Objective-C type parameter.
static ObjCTypeParamDecl * Create(ASTContext &ctx, DeclContext *dc, ObjCTypeParamVariance variance, SourceLocation varianceLoc, unsigned index, SourceLocation nameLoc, IdentifierInfo *name, SourceLocation colonLoc, TypeSourceInfo *boundInfo)
bool hasExplicitBound() const
Whether this type parameter has an explicitly-written type bound, e.g., "T : NSView".
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
void gatherDefaultTypeArgs(SmallVectorImpl< QualType > &typeArgs) const
Gather the default set of type arguments to be substituted for these type parameters when dealing wit...
unsigned size() const
Determine the number of type parameters in this list.
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
Represents a parameter to a function.
A (possibly-)qualified type.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
QualType withConst() const
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
QualType substObjCMemberType(QualType objectType, const DeclContext *dc, ObjCSubstitutionContext context) const
Substitute type arguments from an object type for the Objective-C type parameters used in the subject...
QualType substObjCTypeArgs(ASTContext &ctx, ArrayRef< QualType > typeArgs, ObjCSubstitutionContext context) const
Substitute type arguments for the Objective-C type parameters used in the subject type.
The collection of all-type qualifiers we support.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
void setObjCLifetime(ObjCLifetime type)
ObjCInterfaceDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
void setPreviousDecl(ObjCInterfaceDecl *PrevDecl)
Set the previous declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Smart pointer class that efficiently represents Objective-C method names.
ObjCMethodFamily getMethodFamily() const
Derive the conventional family of this method.
unsigned getNumArgs() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
A container of type source information.
bool isObjCSelType() const
bool isObjCIdType() const
TypeSourceInfo * getTypeSourceInfo() const
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
The JSON file list parser is used to communicate input to InstallAPI.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ SelLoc_NonStandard
Non-standard.
@ SelLoc_StandardNoSpace
For nullary selectors, immediately before the end: "[foo release]" / "-(void)release;" Or immediately...
bool operator<(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
ObjCMethodFamily
A family of Objective-C methods.
@ OMF_None
No particular method family.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
SelectorLocationsKind hasStandardSelectorLocs(Selector Sel, ArrayRef< SourceLocation > SelLocs, ArrayRef< Expr * > Args, SourceLocation EndLoc)
Returns true if all SelLocs are in a "standard" location.
@ Property
The type of a property.
@ Result
The result type of a method or function.
ObjCImplementationControl
const FunctionProtoType * T
@ InvalidObjCMethodFamily
ObjCTypeParamVariance
Describes the variance of a given generic parameter.
@ Invariant
The parameter is invariant: must match exactly.
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ ObjCSelf
Parameter for Objective-C 'self' argument.
@ ObjCCmd
Parameter for Objective-C '_cmd' argument.
T * get(ExternalASTSource *Source) const
Retrieve the pointer to the AST node that this lazy pointer points to.