1 //===- DeclObjC.cpp - ObjC Declaration AST Node Implementation ------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the Objective-C related Decl classes.
11 //===----------------------------------------------------------------------===//
13 #include "clang/AST/DeclObjC.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/ASTMutationListener.h"
16 #include "clang/AST/Attr.h"
17 #include "clang/AST/Decl.h"
18 #include "clang/AST/DeclBase.h"
19 #include "clang/AST/Stmt.h"
20 #include "clang/AST/Type.h"
21 #include "clang/AST/TypeLoc.h"
22 #include "clang/Basic/IdentifierTable.h"
23 #include "clang/Basic/LLVM.h"
24 #include "clang/Basic/LangOptions.h"
25 #include "clang/Basic/SourceLocation.h"
26 #include "llvm/ADT/None.h"
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"
39 using namespace clang
;
41 //===----------------------------------------------------------------------===//
43 //===----------------------------------------------------------------------===//
45 void ObjCListBase::set(void *const* InList
, unsigned Elts
, ASTContext
&Ctx
) {
47 if (Elts
== 0) return; // Setting to an empty list is a noop.
49 List
= new (Ctx
) void*[Elts
];
51 memcpy(List
, InList
, sizeof(void*)*Elts
);
54 void ObjCProtocolList::set(ObjCProtocolDecl
* const* InList
, unsigned Elts
,
55 const SourceLocation
*Locs
, ASTContext
&Ctx
) {
59 Locations
= new (Ctx
) SourceLocation
[Elts
];
60 memcpy(Locations
, Locs
, sizeof(SourceLocation
) * Elts
);
61 set(InList
, Elts
, Ctx
);
64 //===----------------------------------------------------------------------===//
66 //===----------------------------------------------------------------------===//
68 ObjCContainerDecl::ObjCContainerDecl(Kind DK
, DeclContext
*DC
,
69 IdentifierInfo
*Id
, SourceLocation nameLoc
,
70 SourceLocation atStartLoc
)
71 : NamedDecl(DK
, DC
, nameLoc
, Id
), DeclContext(DK
) {
72 setAtStartLoc(atStartLoc
);
75 void ObjCContainerDecl::anchor() {}
77 /// getIvarDecl - This method looks up an ivar in this ContextDecl.
80 ObjCContainerDecl::getIvarDecl(IdentifierInfo
*Id
) const {
81 lookup_result R
= lookup(Id
);
82 for (lookup_iterator Ivar
= R
.begin(), IvarEnd
= R
.end();
83 Ivar
!= IvarEnd
; ++Ivar
) {
84 if (auto *ivar
= dyn_cast
<ObjCIvarDecl
>(*Ivar
))
90 // Get the local instance/class method declared in this interface.
92 ObjCContainerDecl::getMethod(Selector Sel
, bool isInstance
,
93 bool AllowHidden
) const {
94 // If this context is a hidden protocol definition, don't find any
96 if (const auto *Proto
= dyn_cast
<ObjCProtocolDecl
>(this)) {
97 if (const ObjCProtocolDecl
*Def
= Proto
->getDefinition())
98 if (!Def
->isUnconditionallyVisible() && !AllowHidden
)
102 // Since instance & class methods can have the same name, the loop below
103 // ensures we get the correct method.
105 // @interface Whatever
106 // - (int) class_method;
107 // + (float) class_method;
109 lookup_result R
= lookup(Sel
);
110 for (lookup_iterator Meth
= R
.begin(), MethEnd
= R
.end();
111 Meth
!= MethEnd
; ++Meth
) {
112 auto *MD
= dyn_cast
<ObjCMethodDecl
>(*Meth
);
113 if (MD
&& MD
->isInstanceMethod() == isInstance
)
119 /// This routine returns 'true' if a user declared setter method was
120 /// found in the class, its protocols, its super classes or categories.
121 /// It also returns 'true' if one of its categories has declared a 'readwrite'
122 /// property. This is because, user must provide a setter method for the
123 /// category's 'readwrite' property.
124 bool ObjCContainerDecl::HasUserDeclaredSetterMethod(
125 const ObjCPropertyDecl
*Property
) const {
126 Selector Sel
= Property
->getSetterName();
127 lookup_result R
= lookup(Sel
);
128 for (lookup_iterator Meth
= R
.begin(), MethEnd
= R
.end();
129 Meth
!= MethEnd
; ++Meth
) {
130 auto *MD
= dyn_cast
<ObjCMethodDecl
>(*Meth
);
131 if (MD
&& MD
->isInstanceMethod() && !MD
->isImplicit())
135 if (const auto *ID
= dyn_cast
<ObjCInterfaceDecl
>(this)) {
136 // Also look into categories, including class extensions, looking
137 // for a user declared instance method.
138 for (const auto *Cat
: ID
->visible_categories()) {
139 if (ObjCMethodDecl
*MD
= Cat
->getInstanceMethod(Sel
))
140 if (!MD
->isImplicit())
142 if (Cat
->IsClassExtension())
144 // Also search through the categories looking for a 'readwrite'
145 // declaration of this property. If one found, presumably a setter will
146 // be provided (properties declared in categories will not get
147 // auto-synthesized).
148 for (const auto *P
: Cat
->properties())
149 if (P
->getIdentifier() == Property
->getIdentifier()) {
150 if (P
->getPropertyAttributes() &
151 ObjCPropertyAttribute::kind_readwrite
)
157 // Also look into protocols, for a user declared instance method.
158 for (const auto *Proto
: ID
->all_referenced_protocols())
159 if (Proto
->HasUserDeclaredSetterMethod(Property
))
162 // And in its super class.
163 ObjCInterfaceDecl
*OSC
= ID
->getSuperClass();
165 if (OSC
->HasUserDeclaredSetterMethod(Property
))
167 OSC
= OSC
->getSuperClass();
170 if (const auto *PD
= dyn_cast
<ObjCProtocolDecl
>(this))
171 for (const auto *PI
: PD
->protocols())
172 if (PI
->HasUserDeclaredSetterMethod(Property
))
178 ObjCPropertyDecl::findPropertyDecl(const DeclContext
*DC
,
179 const IdentifierInfo
*propertyID
,
180 ObjCPropertyQueryKind queryKind
) {
181 // If this context is a hidden protocol definition, don't find any
183 if (const auto *Proto
= dyn_cast
<ObjCProtocolDecl
>(DC
)) {
184 if (const ObjCProtocolDecl
*Def
= Proto
->getDefinition())
185 if (!Def
->isUnconditionallyVisible())
189 // If context is class, then lookup property in its visible extensions.
190 // This comes before property is looked up in primary class.
191 if (auto *IDecl
= dyn_cast
<ObjCInterfaceDecl
>(DC
)) {
192 for (const auto *Ext
: IDecl
->visible_extensions())
193 if (ObjCPropertyDecl
*PD
= ObjCPropertyDecl::findPropertyDecl(Ext
,
199 DeclContext::lookup_result R
= DC
->lookup(propertyID
);
200 ObjCPropertyDecl
*classProp
= nullptr;
201 for (DeclContext::lookup_iterator I
= R
.begin(), E
= R
.end(); I
!= E
;
203 if (auto *PD
= dyn_cast
<ObjCPropertyDecl
>(*I
)) {
204 // If queryKind is unknown, we return the instance property if one
205 // exists; otherwise we return the class property.
206 if ((queryKind
== ObjCPropertyQueryKind::OBJC_PR_query_unknown
&&
207 !PD
->isClassProperty()) ||
208 (queryKind
== ObjCPropertyQueryKind::OBJC_PR_query_class
&&
209 PD
->isClassProperty()) ||
210 (queryKind
== ObjCPropertyQueryKind::OBJC_PR_query_instance
&&
211 !PD
->isClassProperty()))
214 if (PD
->isClassProperty())
218 if (queryKind
== ObjCPropertyQueryKind::OBJC_PR_query_unknown
)
219 // We can't find the instance property, return the class property.
226 ObjCPropertyDecl::getDefaultSynthIvarName(ASTContext
&Ctx
) const {
227 SmallString
<128> ivarName
;
229 llvm::raw_svector_ostream
os(ivarName
);
230 os
<< '_' << getIdentifier()->getName();
232 return &Ctx
.Idents
.get(ivarName
.str());
235 ObjCPropertyDecl
*ObjCContainerDecl::getProperty(const IdentifierInfo
*Id
,
236 bool IsInstance
) const {
237 for (auto *LookupResult
: lookup(Id
)) {
238 if (auto *Prop
= dyn_cast
<ObjCPropertyDecl
>(LookupResult
)) {
239 if (Prop
->isInstanceProperty() == IsInstance
) {
247 /// FindPropertyDeclaration - Finds declaration of the property given its name
248 /// in 'PropertyId' and returns it. It returns 0, if not found.
249 ObjCPropertyDecl
*ObjCContainerDecl::FindPropertyDeclaration(
250 const IdentifierInfo
*PropertyId
,
251 ObjCPropertyQueryKind QueryKind
) const {
252 // Don't find properties within hidden protocol definitions.
253 if (const auto *Proto
= dyn_cast
<ObjCProtocolDecl
>(this)) {
254 if (const ObjCProtocolDecl
*Def
= Proto
->getDefinition())
255 if (!Def
->isUnconditionallyVisible())
259 // Search the extensions of a class first; they override what's in
261 if (const auto *ClassDecl
= dyn_cast
<ObjCInterfaceDecl
>(this)) {
262 for (const auto *Ext
: ClassDecl
->visible_extensions()) {
263 if (auto *P
= Ext
->FindPropertyDeclaration(PropertyId
, QueryKind
))
268 if (ObjCPropertyDecl
*PD
=
269 ObjCPropertyDecl::findPropertyDecl(cast
<DeclContext
>(this), PropertyId
,
276 case Decl::ObjCProtocol
: {
277 const auto *PID
= cast
<ObjCProtocolDecl
>(this);
278 for (const auto *I
: PID
->protocols())
279 if (ObjCPropertyDecl
*P
= I
->FindPropertyDeclaration(PropertyId
,
284 case Decl::ObjCInterface
: {
285 const auto *OID
= cast
<ObjCInterfaceDecl
>(this);
286 // Look through categories (but not extensions; they were handled above).
287 for (const auto *Cat
: OID
->visible_categories()) {
288 if (!Cat
->IsClassExtension())
289 if (ObjCPropertyDecl
*P
= Cat
->FindPropertyDeclaration(
290 PropertyId
, QueryKind
))
294 // Look through protocols.
295 for (const auto *I
: OID
->all_referenced_protocols())
296 if (ObjCPropertyDecl
*P
= I
->FindPropertyDeclaration(PropertyId
,
300 // Finally, check the super class.
301 if (const ObjCInterfaceDecl
*superClass
= OID
->getSuperClass())
302 return superClass
->FindPropertyDeclaration(PropertyId
, QueryKind
);
305 case Decl::ObjCCategory
: {
306 const auto *OCD
= cast
<ObjCCategoryDecl
>(this);
307 // Look through protocols.
308 if (!OCD
->IsClassExtension())
309 for (const auto *I
: OCD
->protocols())
310 if (ObjCPropertyDecl
*P
= I
->FindPropertyDeclaration(PropertyId
,
319 void ObjCInterfaceDecl::anchor() {}
321 ObjCTypeParamList
*ObjCInterfaceDecl::getTypeParamList() const {
322 // If this particular declaration has a type parameter list, return it.
323 if (ObjCTypeParamList
*written
= getTypeParamListAsWritten())
326 // If there is a definition, return its type parameter list.
327 if (const ObjCInterfaceDecl
*def
= getDefinition())
328 return def
->getTypeParamListAsWritten();
330 // Otherwise, look at previous declarations to determine whether any
331 // of them has a type parameter list, skipping over those
332 // declarations that do not.
333 for (const ObjCInterfaceDecl
*decl
= getMostRecentDecl(); decl
;
334 decl
= decl
->getPreviousDecl()) {
335 if (ObjCTypeParamList
*written
= decl
->getTypeParamListAsWritten())
342 void ObjCInterfaceDecl::setTypeParamList(ObjCTypeParamList
*TPL
) {
346 // Set the declaration context of each of the type parameters.
347 for (auto *typeParam
: *TypeParamList
)
348 typeParam
->setDeclContext(this);
351 ObjCInterfaceDecl
*ObjCInterfaceDecl::getSuperClass() const {
352 // FIXME: Should make sure no callers ever do this.
353 if (!hasDefinition())
356 if (data().ExternallyCompleted
)
357 LoadExternalDefinition();
359 if (const ObjCObjectType
*superType
= getSuperClassType()) {
360 if (ObjCInterfaceDecl
*superDecl
= superType
->getInterface()) {
361 if (ObjCInterfaceDecl
*superDef
= superDecl
->getDefinition())
371 SourceLocation
ObjCInterfaceDecl::getSuperClassLoc() const {
372 if (TypeSourceInfo
*superTInfo
= getSuperClassTInfo())
373 return superTInfo
->getTypeLoc().getBeginLoc();
375 return SourceLocation();
378 /// FindPropertyVisibleInPrimaryClass - Finds declaration of the property
379 /// with name 'PropertyId' in the primary class; including those in protocols
380 /// (direct or indirect) used by the primary class.
382 ObjCInterfaceDecl::FindPropertyVisibleInPrimaryClass(
383 IdentifierInfo
*PropertyId
,
384 ObjCPropertyQueryKind QueryKind
) const {
385 // FIXME: Should make sure no callers ever do this.
386 if (!hasDefinition())
389 if (data().ExternallyCompleted
)
390 LoadExternalDefinition();
392 if (ObjCPropertyDecl
*PD
=
393 ObjCPropertyDecl::findPropertyDecl(cast
<DeclContext
>(this), PropertyId
,
397 // Look through protocols.
398 for (const auto *I
: all_referenced_protocols())
399 if (ObjCPropertyDecl
*P
= I
->FindPropertyDeclaration(PropertyId
,
406 void ObjCInterfaceDecl::collectPropertiesToImplement(PropertyMap
&PM
,
407 PropertyDeclOrder
&PO
) const {
408 for (auto *Prop
: properties()) {
409 PM
[std::make_pair(Prop
->getIdentifier(), Prop
->isClassProperty())] = Prop
;
412 for (const auto *Ext
: known_extensions()) {
413 const ObjCCategoryDecl
*ClassExt
= Ext
;
414 for (auto *Prop
: ClassExt
->properties()) {
415 PM
[std::make_pair(Prop
->getIdentifier(), Prop
->isClassProperty())] = Prop
;
419 for (const auto *PI
: all_referenced_protocols())
420 PI
->collectPropertiesToImplement(PM
, PO
);
421 // Note, the properties declared only in class extensions are still copied
422 // into the main @interface's property list, and therefore we don't
423 // explicitly, have to search class extension properties.
426 bool ObjCInterfaceDecl::isArcWeakrefUnavailable() const {
427 const ObjCInterfaceDecl
*Class
= this;
429 if (Class
->hasAttr
<ArcWeakrefUnavailableAttr
>())
431 Class
= Class
->getSuperClass();
436 const ObjCInterfaceDecl
*ObjCInterfaceDecl::isObjCRequiresPropertyDefs() const {
437 const ObjCInterfaceDecl
*Class
= this;
439 if (Class
->hasAttr
<ObjCRequiresPropertyDefsAttr
>())
441 Class
= Class
->getSuperClass();
446 void ObjCInterfaceDecl::mergeClassExtensionProtocolList(
447 ObjCProtocolDecl
*const* ExtList
, unsigned ExtNum
,
449 if (data().ExternallyCompleted
)
450 LoadExternalDefinition();
452 if (data().AllReferencedProtocols
.empty() &&
453 data().ReferencedProtocols
.empty()) {
454 data().AllReferencedProtocols
.set(ExtList
, ExtNum
, C
);
458 // Check for duplicate protocol in class's protocol list.
459 // This is O(n*m). But it is extremely rare and number of protocols in
460 // class or its extension are very few.
461 SmallVector
<ObjCProtocolDecl
*, 8> ProtocolRefs
;
462 for (unsigned i
= 0; i
< ExtNum
; i
++) {
463 bool protocolExists
= false;
464 ObjCProtocolDecl
*ProtoInExtension
= ExtList
[i
];
465 for (auto *Proto
: all_referenced_protocols()) {
466 if (C
.ProtocolCompatibleWithProtocol(ProtoInExtension
, Proto
)) {
467 protocolExists
= true;
471 // Do we want to warn on a protocol in extension class which
472 // already exist in the class? Probably not.
474 ProtocolRefs
.push_back(ProtoInExtension
);
477 if (ProtocolRefs
.empty())
480 // Merge ProtocolRefs into class's protocol list;
481 ProtocolRefs
.append(all_referenced_protocol_begin(),
482 all_referenced_protocol_end());
484 data().AllReferencedProtocols
.set(ProtocolRefs
.data(), ProtocolRefs
.size(),C
);
487 const ObjCInterfaceDecl
*
488 ObjCInterfaceDecl::findInterfaceWithDesignatedInitializers() const {
489 const ObjCInterfaceDecl
*IFace
= this;
491 if (IFace
->hasDesignatedInitializers())
493 if (!IFace
->inheritsDesignatedInitializers())
495 IFace
= IFace
->getSuperClass();
500 static bool isIntroducingInitializers(const ObjCInterfaceDecl
*D
) {
501 for (const auto *MD
: D
->instance_methods()) {
502 if (MD
->getMethodFamily() == OMF_init
&& !MD
->isOverriding())
505 for (const auto *Ext
: D
->visible_extensions()) {
506 for (const auto *MD
: Ext
->instance_methods()) {
507 if (MD
->getMethodFamily() == OMF_init
&& !MD
->isOverriding())
511 if (const auto *ImplD
= D
->getImplementation()) {
512 for (const auto *MD
: ImplD
->instance_methods()) {
513 if (MD
->getMethodFamily() == OMF_init
&& !MD
->isOverriding())
520 bool ObjCInterfaceDecl::inheritsDesignatedInitializers() const {
521 switch (data().InheritedDesignatedInitializers
) {
522 case DefinitionData::IDI_Inherited
:
524 case DefinitionData::IDI_NotInherited
:
526 case DefinitionData::IDI_Unknown
:
527 // If the class introduced initializers we conservatively assume that we
528 // don't know if any of them is a designated initializer to avoid possible
529 // misleading warnings.
530 if (isIntroducingInitializers(this)) {
531 data().InheritedDesignatedInitializers
= DefinitionData::IDI_NotInherited
;
533 if (auto SuperD
= getSuperClass()) {
534 data().InheritedDesignatedInitializers
=
535 SuperD
->declaresOrInheritsDesignatedInitializers() ?
536 DefinitionData::IDI_Inherited
:
537 DefinitionData::IDI_NotInherited
;
539 data().InheritedDesignatedInitializers
=
540 DefinitionData::IDI_NotInherited
;
543 assert(data().InheritedDesignatedInitializers
544 != DefinitionData::IDI_Unknown
);
545 return data().InheritedDesignatedInitializers
==
546 DefinitionData::IDI_Inherited
;
549 llvm_unreachable("unexpected InheritedDesignatedInitializers value");
552 void ObjCInterfaceDecl::getDesignatedInitializers(
553 llvm::SmallVectorImpl
<const ObjCMethodDecl
*> &Methods
) const {
554 // Check for a complete definition and recover if not so.
555 if (!isThisDeclarationADefinition())
557 if (data().ExternallyCompleted
)
558 LoadExternalDefinition();
560 const ObjCInterfaceDecl
*IFace
= findInterfaceWithDesignatedInitializers();
564 for (const auto *MD
: IFace
->instance_methods())
565 if (MD
->isThisDeclarationADesignatedInitializer())
566 Methods
.push_back(MD
);
567 for (const auto *Ext
: IFace
->visible_extensions()) {
568 for (const auto *MD
: Ext
->instance_methods())
569 if (MD
->isThisDeclarationADesignatedInitializer())
570 Methods
.push_back(MD
);
574 bool ObjCInterfaceDecl::isDesignatedInitializer(Selector Sel
,
575 const ObjCMethodDecl
**InitMethod
) const {
576 bool HasCompleteDef
= isThisDeclarationADefinition();
577 // During deserialization the data record for the ObjCInterfaceDecl could
578 // be made invariant by reusing the canonical decl. Take this into account
579 // when checking for the complete definition.
580 if (!HasCompleteDef
&& getCanonicalDecl()->hasDefinition() &&
581 getCanonicalDecl()->getDefinition() == getDefinition())
582 HasCompleteDef
= true;
584 // Check for a complete definition and recover if not so.
588 if (data().ExternallyCompleted
)
589 LoadExternalDefinition();
591 const ObjCInterfaceDecl
*IFace
= findInterfaceWithDesignatedInitializers();
595 if (const ObjCMethodDecl
*MD
= IFace
->getInstanceMethod(Sel
)) {
596 if (MD
->isThisDeclarationADesignatedInitializer()) {
602 for (const auto *Ext
: IFace
->visible_extensions()) {
603 if (const ObjCMethodDecl
*MD
= Ext
->getInstanceMethod(Sel
)) {
604 if (MD
->isThisDeclarationADesignatedInitializer()) {
614 void ObjCInterfaceDecl::allocateDefinitionData() {
615 assert(!hasDefinition() && "ObjC class already has a definition");
616 Data
.setPointer(new (getASTContext()) DefinitionData());
617 Data
.getPointer()->Definition
= this;
620 void ObjCInterfaceDecl::startDefinition() {
621 allocateDefinitionData();
623 // Update all of the declarations with a pointer to the definition.
624 for (auto *RD
: redecls()) {
630 ObjCIvarDecl
*ObjCInterfaceDecl::lookupInstanceVariable(IdentifierInfo
*ID
,
631 ObjCInterfaceDecl
*&clsDeclared
) {
632 // FIXME: Should make sure no callers ever do this.
633 if (!hasDefinition())
636 if (data().ExternallyCompleted
)
637 LoadExternalDefinition();
639 ObjCInterfaceDecl
* ClassDecl
= this;
640 while (ClassDecl
!= nullptr) {
641 if (ObjCIvarDecl
*I
= ClassDecl
->getIvarDecl(ID
)) {
642 clsDeclared
= ClassDecl
;
646 for (const auto *Ext
: ClassDecl
->visible_extensions()) {
647 if (ObjCIvarDecl
*I
= Ext
->getIvarDecl(ID
)) {
648 clsDeclared
= ClassDecl
;
653 ClassDecl
= ClassDecl
->getSuperClass();
658 /// lookupInheritedClass - This method returns ObjCInterfaceDecl * of the super
659 /// class whose name is passed as argument. If it is not one of the super classes
660 /// the it returns NULL.
661 ObjCInterfaceDecl
*ObjCInterfaceDecl::lookupInheritedClass(
662 const IdentifierInfo
*ICName
) {
663 // FIXME: Should make sure no callers ever do this.
664 if (!hasDefinition())
667 if (data().ExternallyCompleted
)
668 LoadExternalDefinition();
670 ObjCInterfaceDecl
* ClassDecl
= this;
671 while (ClassDecl
!= nullptr) {
672 if (ClassDecl
->getIdentifier() == ICName
)
674 ClassDecl
= ClassDecl
->getSuperClass();
680 ObjCInterfaceDecl::lookupNestedProtocol(IdentifierInfo
*Name
) {
681 for (auto *P
: all_referenced_protocols())
682 if (P
->lookupProtocolNamed(Name
))
684 ObjCInterfaceDecl
*SuperClass
= getSuperClass();
685 return SuperClass
? SuperClass
->lookupNestedProtocol(Name
) : nullptr;
688 /// lookupMethod - This method returns an instance/class method by looking in
689 /// the class, its categories, and its super classes (using a linear search).
690 /// When argument category "C" is specified, any implicit method found
691 /// in this category is ignored.
692 ObjCMethodDecl
*ObjCInterfaceDecl::lookupMethod(Selector Sel
,
694 bool shallowCategoryLookup
,
696 const ObjCCategoryDecl
*C
) const
698 // FIXME: Should make sure no callers ever do this.
699 if (!hasDefinition())
702 const ObjCInterfaceDecl
* ClassDecl
= this;
703 ObjCMethodDecl
*MethodDecl
= nullptr;
705 if (data().ExternallyCompleted
)
706 LoadExternalDefinition();
709 // 1. Look through primary class.
710 if ((MethodDecl
= ClassDecl
->getMethod(Sel
, isInstance
)))
713 // 2. Didn't find one yet - now look through categories.
714 for (const auto *Cat
: ClassDecl
->visible_categories())
715 if ((MethodDecl
= Cat
->getMethod(Sel
, isInstance
)))
716 if (C
!= Cat
|| !MethodDecl
->isImplicit())
719 // 3. Didn't find one yet - look through primary class's protocols.
720 for (const auto *I
: ClassDecl
->protocols())
721 if ((MethodDecl
= I
->lookupMethod(Sel
, isInstance
)))
724 // 4. Didn't find one yet - now look through categories' protocols
725 if (!shallowCategoryLookup
)
726 for (const auto *Cat
: ClassDecl
->visible_categories()) {
727 // Didn't find one yet - look through protocols.
728 const ObjCList
<ObjCProtocolDecl
> &Protocols
=
729 Cat
->getReferencedProtocols();
730 for (auto *Protocol
: Protocols
)
731 if ((MethodDecl
= Protocol
->lookupMethod(Sel
, isInstance
)))
732 if (C
!= Cat
|| !MethodDecl
->isImplicit())
740 // 5. Get to the super class (if any).
741 ClassDecl
= ClassDecl
->getSuperClass();
746 // Will search "local" class/category implementations for a method decl.
747 // If failed, then we search in class's root for an instance method.
748 // Returns 0 if no method is found.
749 ObjCMethodDecl
*ObjCInterfaceDecl::lookupPrivateMethod(
751 bool Instance
) const {
752 // FIXME: Should make sure no callers ever do this.
753 if (!hasDefinition())
756 if (data().ExternallyCompleted
)
757 LoadExternalDefinition();
759 ObjCMethodDecl
*Method
= nullptr;
760 if (ObjCImplementationDecl
*ImpDecl
= getImplementation())
761 Method
= Instance
? ImpDecl
->getInstanceMethod(Sel
)
762 : ImpDecl
->getClassMethod(Sel
);
764 // Look through local category implementations associated with the class.
766 Method
= getCategoryMethod(Sel
, Instance
);
768 // Before we give up, check if the selector is an instance method.
769 // But only in the root. This matches gcc's behavior and what the
771 if (!Instance
&& !Method
&& !getSuperClass()) {
772 Method
= lookupInstanceMethod(Sel
);
773 // Look through local category implementations associated
774 // with the root class.
776 Method
= lookupPrivateMethod(Sel
, true);
779 if (!Method
&& getSuperClass())
780 return getSuperClass()->lookupPrivateMethod(Sel
, Instance
);
784 //===----------------------------------------------------------------------===//
786 //===----------------------------------------------------------------------===//
788 ObjCMethodDecl::ObjCMethodDecl(
789 SourceLocation beginLoc
, SourceLocation endLoc
, Selector SelInfo
,
790 QualType T
, TypeSourceInfo
*ReturnTInfo
, DeclContext
*contextDecl
,
791 bool isInstance
, bool isVariadic
, bool isPropertyAccessor
,
792 bool isSynthesizedAccessorStub
, bool isImplicitlyDeclared
, bool isDefined
,
793 ImplementationControl impControl
, bool HasRelatedResultType
)
794 : NamedDecl(ObjCMethod
, contextDecl
, beginLoc
, SelInfo
),
795 DeclContext(ObjCMethod
), MethodDeclType(T
), ReturnTInfo(ReturnTInfo
),
798 // Initialized the bits stored in DeclContext.
799 ObjCMethodDeclBits
.Family
=
800 static_cast<ObjCMethodFamily
>(InvalidObjCMethodFamily
);
801 setInstanceMethod(isInstance
);
802 setVariadic(isVariadic
);
803 setPropertyAccessor(isPropertyAccessor
);
804 setSynthesizedAccessorStub(isSynthesizedAccessorStub
);
805 setDefined(isDefined
);
806 setIsRedeclaration(false);
807 setHasRedeclaration(false);
808 setDeclImplementation(impControl
);
809 setObjCDeclQualifier(OBJC_TQ_None
);
810 setRelatedResultType(HasRelatedResultType
);
811 setSelLocsKind(SelLoc_StandardNoSpace
);
812 setOverriding(false);
813 setHasSkippedBody(false);
815 setImplicit(isImplicitlyDeclared
);
818 ObjCMethodDecl
*ObjCMethodDecl::Create(
819 ASTContext
&C
, SourceLocation beginLoc
, SourceLocation endLoc
,
820 Selector SelInfo
, QualType T
, TypeSourceInfo
*ReturnTInfo
,
821 DeclContext
*contextDecl
, bool isInstance
, bool isVariadic
,
822 bool isPropertyAccessor
, bool isSynthesizedAccessorStub
,
823 bool isImplicitlyDeclared
, bool isDefined
, ImplementationControl impControl
,
824 bool HasRelatedResultType
) {
825 return new (C
, contextDecl
) ObjCMethodDecl(
826 beginLoc
, endLoc
, SelInfo
, T
, ReturnTInfo
, contextDecl
, isInstance
,
827 isVariadic
, isPropertyAccessor
, isSynthesizedAccessorStub
,
828 isImplicitlyDeclared
, isDefined
, impControl
, HasRelatedResultType
);
831 ObjCMethodDecl
*ObjCMethodDecl::CreateDeserialized(ASTContext
&C
, unsigned ID
) {
832 return new (C
, ID
) ObjCMethodDecl(SourceLocation(), SourceLocation(),
833 Selector(), QualType(), nullptr, nullptr);
836 bool ObjCMethodDecl::isDirectMethod() const {
837 return hasAttr
<ObjCDirectAttr
>() &&
838 !getASTContext().getLangOpts().ObjCDisableDirectMethodsForTesting
;
841 bool ObjCMethodDecl::isThisDeclarationADesignatedInitializer() const {
842 return getMethodFamily() == OMF_init
&&
843 hasAttr
<ObjCDesignatedInitializerAttr
>();
846 bool ObjCMethodDecl::definedInNSObject(const ASTContext
&Ctx
) const {
847 if (const auto *PD
= dyn_cast
<const ObjCProtocolDecl
>(getDeclContext()))
848 return PD
->getIdentifier() == Ctx
.getNSObjectName();
849 if (const auto *ID
= dyn_cast
<const ObjCInterfaceDecl
>(getDeclContext()))
850 return ID
->getIdentifier() == Ctx
.getNSObjectName();
854 bool ObjCMethodDecl::isDesignatedInitializerForTheInterface(
855 const ObjCMethodDecl
**InitMethod
) const {
856 if (getMethodFamily() != OMF_init
)
858 const DeclContext
*DC
= getDeclContext();
859 if (isa
<ObjCProtocolDecl
>(DC
))
861 if (const ObjCInterfaceDecl
*ID
= getClassInterface())
862 return ID
->isDesignatedInitializer(getSelector(), InitMethod
);
866 bool ObjCMethodDecl::hasParamDestroyedInCallee() const {
867 for (auto *param
: parameters()) {
868 if (param
->isDestroyedInCallee())
874 Stmt
*ObjCMethodDecl::getBody() const {
875 return Body
.get(getASTContext().getExternalSource());
878 void ObjCMethodDecl::setAsRedeclaration(const ObjCMethodDecl
*PrevMethod
) {
880 getASTContext().setObjCMethodRedeclaration(PrevMethod
, this);
881 setIsRedeclaration(true);
882 PrevMethod
->setHasRedeclaration(true);
885 void ObjCMethodDecl::setParamsAndSelLocs(ASTContext
&C
,
886 ArrayRef
<ParmVarDecl
*> Params
,
887 ArrayRef
<SourceLocation
> SelLocs
) {
888 ParamsAndSelLocs
= nullptr;
889 NumParams
= Params
.size();
890 if (Params
.empty() && SelLocs
.empty())
893 static_assert(alignof(ParmVarDecl
*) >= alignof(SourceLocation
),
894 "Alignment not sufficient for SourceLocation");
896 unsigned Size
= sizeof(ParmVarDecl
*) * NumParams
+
897 sizeof(SourceLocation
) * SelLocs
.size();
898 ParamsAndSelLocs
= C
.Allocate(Size
);
899 std::copy(Params
.begin(), Params
.end(), getParams());
900 std::copy(SelLocs
.begin(), SelLocs
.end(), getStoredSelLocs());
903 void ObjCMethodDecl::getSelectorLocs(
904 SmallVectorImpl
<SourceLocation
> &SelLocs
) const {
905 for (unsigned i
= 0, e
= getNumSelectorLocs(); i
!= e
; ++i
)
906 SelLocs
.push_back(getSelectorLoc(i
));
909 void ObjCMethodDecl::setMethodParams(ASTContext
&C
,
910 ArrayRef
<ParmVarDecl
*> Params
,
911 ArrayRef
<SourceLocation
> SelLocs
) {
912 assert((!SelLocs
.empty() || isImplicit()) &&
913 "No selector locs for non-implicit method");
915 return setParamsAndSelLocs(C
, Params
, llvm::None
);
917 setSelLocsKind(hasStandardSelectorLocs(getSelector(), SelLocs
, Params
,
919 if (getSelLocsKind() != SelLoc_NonStandard
)
920 return setParamsAndSelLocs(C
, Params
, llvm::None
);
922 setParamsAndSelLocs(C
, Params
, SelLocs
);
925 /// A definition will return its interface declaration.
926 /// An interface declaration will return its definition.
927 /// Otherwise it will return itself.
928 ObjCMethodDecl
*ObjCMethodDecl::getNextRedeclarationImpl() {
929 ASTContext
&Ctx
= getASTContext();
930 ObjCMethodDecl
*Redecl
= nullptr;
931 if (hasRedeclaration())
932 Redecl
= const_cast<ObjCMethodDecl
*>(Ctx
.getObjCMethodRedeclaration(this));
936 auto *CtxD
= cast
<Decl
>(getDeclContext());
938 if (!CtxD
->isInvalidDecl()) {
939 if (auto *IFD
= dyn_cast
<ObjCInterfaceDecl
>(CtxD
)) {
940 if (ObjCImplementationDecl
*ImplD
= Ctx
.getObjCImplementation(IFD
))
941 if (!ImplD
->isInvalidDecl())
942 Redecl
= ImplD
->getMethod(getSelector(), isInstanceMethod());
944 } else if (auto *CD
= dyn_cast
<ObjCCategoryDecl
>(CtxD
)) {
945 if (ObjCCategoryImplDecl
*ImplD
= Ctx
.getObjCImplementation(CD
))
946 if (!ImplD
->isInvalidDecl())
947 Redecl
= ImplD
->getMethod(getSelector(), isInstanceMethod());
949 } else if (auto *ImplD
= dyn_cast
<ObjCImplementationDecl
>(CtxD
)) {
950 if (ObjCInterfaceDecl
*IFD
= ImplD
->getClassInterface())
951 if (!IFD
->isInvalidDecl())
952 Redecl
= IFD
->getMethod(getSelector(), isInstanceMethod());
954 } else if (auto *CImplD
= dyn_cast
<ObjCCategoryImplDecl
>(CtxD
)) {
955 if (ObjCCategoryDecl
*CatD
= CImplD
->getCategoryDecl())
956 if (!CatD
->isInvalidDecl())
957 Redecl
= CatD
->getMethod(getSelector(), isInstanceMethod());
961 // Ensure that the discovered method redeclaration has a valid declaration
962 // context. Used to prevent infinite loops when iterating redeclarations in
963 // a partially invalid AST.
964 if (Redecl
&& cast
<Decl
>(Redecl
->getDeclContext())->isInvalidDecl())
967 if (!Redecl
&& isRedeclaration()) {
968 // This is the last redeclaration, go back to the first method.
969 return cast
<ObjCContainerDecl
>(CtxD
)->getMethod(getSelector(),
971 /*AllowHidden=*/true);
974 return Redecl
? Redecl
: this;
977 ObjCMethodDecl
*ObjCMethodDecl::getCanonicalDecl() {
978 auto *CtxD
= cast
<Decl
>(getDeclContext());
979 const auto &Sel
= getSelector();
981 if (auto *ImplD
= dyn_cast
<ObjCImplementationDecl
>(CtxD
)) {
982 if (ObjCInterfaceDecl
*IFD
= ImplD
->getClassInterface()) {
983 // When the container is the ObjCImplementationDecl (the primary
984 // @implementation), then the canonical Decl is either in
985 // the class Interface, or in any of its extension.
987 // So when we don't find it in the ObjCInterfaceDecl,
988 // sift through extensions too.
989 if (ObjCMethodDecl
*MD
= IFD
->getMethod(Sel
, isInstanceMethod()))
991 for (auto *Ext
: IFD
->known_extensions())
992 if (ObjCMethodDecl
*MD
= Ext
->getMethod(Sel
, isInstanceMethod()))
995 } else if (auto *CImplD
= dyn_cast
<ObjCCategoryImplDecl
>(CtxD
)) {
996 if (ObjCCategoryDecl
*CatD
= CImplD
->getCategoryDecl())
997 if (ObjCMethodDecl
*MD
= CatD
->getMethod(Sel
, isInstanceMethod()))
1001 if (isRedeclaration()) {
1002 // It is possible that we have not done deserializing the ObjCMethod yet.
1003 ObjCMethodDecl
*MD
=
1004 cast
<ObjCContainerDecl
>(CtxD
)->getMethod(Sel
, isInstanceMethod(),
1005 /*AllowHidden=*/true);
1006 return MD
? MD
: this;
1012 SourceLocation
ObjCMethodDecl::getEndLoc() const {
1013 if (Stmt
*Body
= getBody())
1014 return Body
->getEndLoc();
1018 ObjCMethodFamily
ObjCMethodDecl::getMethodFamily() const {
1019 auto family
= static_cast<ObjCMethodFamily
>(ObjCMethodDeclBits
.Family
);
1020 if (family
!= static_cast<unsigned>(InvalidObjCMethodFamily
))
1023 // Check for an explicit attribute.
1024 if (const ObjCMethodFamilyAttr
*attr
= getAttr
<ObjCMethodFamilyAttr
>()) {
1025 // The unfortunate necessity of mapping between enums here is due
1026 // to the attributes framework.
1027 switch (attr
->getFamily()) {
1028 case ObjCMethodFamilyAttr::OMF_None
: family
= OMF_None
; break;
1029 case ObjCMethodFamilyAttr::OMF_alloc
: family
= OMF_alloc
; break;
1030 case ObjCMethodFamilyAttr::OMF_copy
: family
= OMF_copy
; break;
1031 case ObjCMethodFamilyAttr::OMF_init
: family
= OMF_init
; break;
1032 case ObjCMethodFamilyAttr::OMF_mutableCopy
: family
= OMF_mutableCopy
; break;
1033 case ObjCMethodFamilyAttr::OMF_new
: family
= OMF_new
; break;
1035 ObjCMethodDeclBits
.Family
= family
;
1039 family
= getSelector().getMethodFamily();
1041 case OMF_None
: break;
1043 // init only has a conventional meaning for an instance method, and
1044 // it has to return an object.
1046 if (!isInstanceMethod() || !getReturnType()->isObjCObjectPointerType())
1050 // alloc/copy/new have a conventional meaning for both class and
1051 // instance methods, but they require an object return.
1054 case OMF_mutableCopy
:
1056 if (!getReturnType()->isObjCObjectPointerType())
1060 // These selectors have a conventional meaning only for instance methods.
1065 case OMF_autorelease
:
1066 case OMF_retainCount
:
1068 if (!isInstanceMethod())
1072 case OMF_initialize
:
1073 if (isInstanceMethod() || !getReturnType()->isVoidType())
1077 case OMF_performSelector
:
1078 if (!isInstanceMethod() || !getReturnType()->isObjCIdType())
1081 unsigned noParams
= param_size();
1082 if (noParams
< 1 || noParams
> 3)
1085 ObjCMethodDecl::param_type_iterator it
= param_type_begin();
1086 QualType ArgT
= (*it
);
1087 if (!ArgT
->isObjCSelType()) {
1091 while (--noParams
) {
1094 if (!ArgT
->isObjCIdType()) {
1105 // Cache the result.
1106 ObjCMethodDeclBits
.Family
= family
;
1110 QualType
ObjCMethodDecl::getSelfType(ASTContext
&Context
,
1111 const ObjCInterfaceDecl
*OID
,
1112 bool &selfIsPseudoStrong
,
1113 bool &selfIsConsumed
) const {
1115 selfIsPseudoStrong
= false;
1116 selfIsConsumed
= false;
1117 if (isInstanceMethod()) {
1118 // There may be no interface context due to error in declaration
1119 // of the interface (which has been reported). Recover gracefully.
1121 selfTy
= Context
.getObjCInterfaceType(OID
);
1122 selfTy
= Context
.getObjCObjectPointerType(selfTy
);
1124 selfTy
= Context
.getObjCIdType();
1126 } else // we have a factory method.
1127 selfTy
= Context
.getObjCClassType();
1129 if (Context
.getLangOpts().ObjCAutoRefCount
) {
1130 if (isInstanceMethod()) {
1131 selfIsConsumed
= hasAttr
<NSConsumesSelfAttr
>();
1133 // 'self' is always __strong. It's actually pseudo-strong except
1134 // in init methods (or methods labeled ns_consumes_self), though.
1136 qs
.setObjCLifetime(Qualifiers::OCL_Strong
);
1137 selfTy
= Context
.getQualifiedType(selfTy
, qs
);
1139 // In addition, 'self' is const unless this is an init method.
1140 if (getMethodFamily() != OMF_init
&& !selfIsConsumed
) {
1141 selfTy
= selfTy
.withConst();
1142 selfIsPseudoStrong
= true;
1146 assert(isClassMethod());
1147 // 'self' is always const in class methods.
1148 selfTy
= selfTy
.withConst();
1149 selfIsPseudoStrong
= true;
1155 void ObjCMethodDecl::createImplicitParams(ASTContext
&Context
,
1156 const ObjCInterfaceDecl
*OID
) {
1157 bool selfIsPseudoStrong
, selfIsConsumed
;
1159 getSelfType(Context
, OID
, selfIsPseudoStrong
, selfIsConsumed
);
1160 auto *Self
= ImplicitParamDecl::Create(Context
, this, SourceLocation(),
1161 &Context
.Idents
.get("self"), selfTy
,
1162 ImplicitParamDecl::ObjCSelf
);
1166 Self
->addAttr(NSConsumedAttr::CreateImplicit(Context
));
1168 if (selfIsPseudoStrong
)
1169 Self
->setARCPseudoStrong(true);
1171 setCmdDecl(ImplicitParamDecl::Create(
1172 Context
, this, SourceLocation(), &Context
.Idents
.get("_cmd"),
1173 Context
.getObjCSelType(), ImplicitParamDecl::ObjCCmd
));
1176 ObjCInterfaceDecl
*ObjCMethodDecl::getClassInterface() {
1177 if (auto *ID
= dyn_cast
<ObjCInterfaceDecl
>(getDeclContext()))
1179 if (auto *CD
= dyn_cast
<ObjCCategoryDecl
>(getDeclContext()))
1180 return CD
->getClassInterface();
1181 if (auto *IMD
= dyn_cast
<ObjCImplDecl
>(getDeclContext()))
1182 return IMD
->getClassInterface();
1183 if (isa
<ObjCProtocolDecl
>(getDeclContext()))
1185 llvm_unreachable("unknown method context");
1188 ObjCCategoryDecl
*ObjCMethodDecl::getCategory() {
1189 if (auto *CD
= dyn_cast
<ObjCCategoryDecl
>(getDeclContext()))
1191 if (auto *IMD
= dyn_cast
<ObjCCategoryImplDecl
>(getDeclContext()))
1192 return IMD
->getCategoryDecl();
1196 SourceRange
ObjCMethodDecl::getReturnTypeSourceRange() const {
1197 const auto *TSI
= getReturnTypeSourceInfo();
1199 return TSI
->getTypeLoc().getSourceRange();
1200 return SourceRange();
1203 QualType
ObjCMethodDecl::getSendResultType() const {
1204 ASTContext
&Ctx
= getASTContext();
1205 return getReturnType().getNonLValueExprType(Ctx
)
1206 .substObjCTypeArgs(Ctx
, {}, ObjCSubstitutionContext::Result
);
1209 QualType
ObjCMethodDecl::getSendResultType(QualType receiverType
) const {
1210 // FIXME: Handle related result types here.
1212 return getReturnType().getNonLValueExprType(getASTContext())
1213 .substObjCMemberType(receiverType
, getDeclContext(),
1214 ObjCSubstitutionContext::Result
);
1217 static void CollectOverriddenMethodsRecurse(const ObjCContainerDecl
*Container
,
1218 const ObjCMethodDecl
*Method
,
1219 SmallVectorImpl
<const ObjCMethodDecl
*> &Methods
,
1220 bool MovedToSuper
) {
1224 // In categories look for overridden methods from protocols. A method from
1225 // category is not "overridden" since it is considered as the "same" method
1226 // (same USR) as the one from the interface.
1227 if (const auto *Category
= dyn_cast
<ObjCCategoryDecl
>(Container
)) {
1228 // Check whether we have a matching method at this category but only if we
1229 // are at the super class level.
1231 if (ObjCMethodDecl
*
1232 Overridden
= Container
->getMethod(Method
->getSelector(),
1233 Method
->isInstanceMethod(),
1234 /*AllowHidden=*/true))
1235 if (Method
!= Overridden
) {
1236 // We found an override at this category; there is no need to look
1237 // into its protocols.
1238 Methods
.push_back(Overridden
);
1242 for (const auto *P
: Category
->protocols())
1243 CollectOverriddenMethodsRecurse(P
, Method
, Methods
, MovedToSuper
);
1247 // Check whether we have a matching method at this level.
1248 if (const ObjCMethodDecl
*
1249 Overridden
= Container
->getMethod(Method
->getSelector(),
1250 Method
->isInstanceMethod(),
1251 /*AllowHidden=*/true))
1252 if (Method
!= Overridden
) {
1253 // We found an override at this level; there is no need to look
1254 // into other protocols or categories.
1255 Methods
.push_back(Overridden
);
1259 if (const auto *Protocol
= dyn_cast
<ObjCProtocolDecl
>(Container
)){
1260 for (const auto *P
: Protocol
->protocols())
1261 CollectOverriddenMethodsRecurse(P
, Method
, Methods
, MovedToSuper
);
1264 if (const auto *Interface
= dyn_cast
<ObjCInterfaceDecl
>(Container
)) {
1265 for (const auto *P
: Interface
->protocols())
1266 CollectOverriddenMethodsRecurse(P
, Method
, Methods
, MovedToSuper
);
1268 for (const auto *Cat
: Interface
->known_categories())
1269 CollectOverriddenMethodsRecurse(Cat
, Method
, Methods
, MovedToSuper
);
1271 if (const ObjCInterfaceDecl
*Super
= Interface
->getSuperClass())
1272 return CollectOverriddenMethodsRecurse(Super
, Method
, Methods
,
1273 /*MovedToSuper=*/true);
1277 static inline void CollectOverriddenMethods(const ObjCContainerDecl
*Container
,
1278 const ObjCMethodDecl
*Method
,
1279 SmallVectorImpl
<const ObjCMethodDecl
*> &Methods
) {
1280 CollectOverriddenMethodsRecurse(Container
, Method
, Methods
,
1281 /*MovedToSuper=*/false);
1284 static void collectOverriddenMethodsSlow(const ObjCMethodDecl
*Method
,
1285 SmallVectorImpl
<const ObjCMethodDecl
*> &overridden
) {
1286 assert(Method
->isOverriding());
1288 if (const auto *ProtD
=
1289 dyn_cast
<ObjCProtocolDecl
>(Method
->getDeclContext())) {
1290 CollectOverriddenMethods(ProtD
, Method
, overridden
);
1292 } else if (const auto *IMD
=
1293 dyn_cast
<ObjCImplDecl
>(Method
->getDeclContext())) {
1294 const ObjCInterfaceDecl
*ID
= IMD
->getClassInterface();
1297 // Start searching for overridden methods using the method from the
1298 // interface as starting point.
1299 if (const ObjCMethodDecl
*IFaceMeth
= ID
->getMethod(Method
->getSelector(),
1300 Method
->isInstanceMethod(),
1301 /*AllowHidden=*/true))
1303 CollectOverriddenMethods(ID
, Method
, overridden
);
1305 } else if (const auto *CatD
=
1306 dyn_cast
<ObjCCategoryDecl
>(Method
->getDeclContext())) {
1307 const ObjCInterfaceDecl
*ID
= CatD
->getClassInterface();
1310 // Start searching for overridden methods using the method from the
1311 // interface as starting point.
1312 if (const ObjCMethodDecl
*IFaceMeth
= ID
->getMethod(Method
->getSelector(),
1313 Method
->isInstanceMethod(),
1314 /*AllowHidden=*/true))
1316 CollectOverriddenMethods(ID
, Method
, overridden
);
1319 CollectOverriddenMethods(
1320 dyn_cast_or_null
<ObjCContainerDecl
>(Method
->getDeclContext()),
1321 Method
, overridden
);
1325 void ObjCMethodDecl::getOverriddenMethods(
1326 SmallVectorImpl
<const ObjCMethodDecl
*> &Overridden
) const {
1327 const ObjCMethodDecl
*Method
= this;
1329 if (Method
->isRedeclaration()) {
1330 Method
= cast
<ObjCContainerDecl
>(Method
->getDeclContext())
1331 ->getMethod(Method
->getSelector(), Method
->isInstanceMethod(),
1332 /*AllowHidden=*/true);
1335 if (Method
->isOverriding()) {
1336 collectOverriddenMethodsSlow(Method
, Overridden
);
1337 assert(!Overridden
.empty() &&
1338 "ObjCMethodDecl's overriding bit is not as expected");
1342 const ObjCPropertyDecl
*
1343 ObjCMethodDecl::findPropertyDecl(bool CheckOverrides
) const {
1344 Selector Sel
= getSelector();
1345 unsigned NumArgs
= Sel
.getNumArgs();
1349 if (isPropertyAccessor()) {
1350 const auto *Container
= cast
<ObjCContainerDecl
>(getParent());
1351 // For accessor stubs, go back to the interface.
1352 if (auto *ImplDecl
= dyn_cast
<ObjCImplDecl
>(Container
))
1353 if (isSynthesizedAccessorStub())
1354 Container
= ImplDecl
->getClassInterface();
1356 bool IsGetter
= (NumArgs
== 0);
1357 bool IsInstance
= isInstanceMethod();
1359 /// Local function that attempts to find a matching property within the
1360 /// given Objective-C container.
1361 auto findMatchingProperty
=
1362 [&](const ObjCContainerDecl
*Container
) -> const ObjCPropertyDecl
* {
1364 for (const auto *I
: Container
->instance_properties()) {
1365 Selector NextSel
= IsGetter
? I
->getGetterName()
1366 : I
->getSetterName();
1371 for (const auto *I
: Container
->class_properties()) {
1372 Selector NextSel
= IsGetter
? I
->getGetterName()
1373 : I
->getSetterName();
1382 // Look in the container we were given.
1383 if (const auto *Found
= findMatchingProperty(Container
))
1386 // If we're in a category or extension, look in the main class.
1387 const ObjCInterfaceDecl
*ClassDecl
= nullptr;
1388 if (const auto *Category
= dyn_cast
<ObjCCategoryDecl
>(Container
)) {
1389 ClassDecl
= Category
->getClassInterface();
1390 if (const auto *Found
= findMatchingProperty(ClassDecl
))
1393 // Determine whether the container is a class.
1394 ClassDecl
= cast
<ObjCInterfaceDecl
>(Container
);
1396 assert(ClassDecl
&& "Failed to find main class");
1398 // If we have a class, check its visible extensions.
1399 for (const auto *Ext
: ClassDecl
->visible_extensions()) {
1400 if (Ext
== Container
)
1402 if (const auto *Found
= findMatchingProperty(Ext
))
1406 assert(isSynthesizedAccessorStub() && "expected an accessor stub");
1408 for (const auto *Cat
: ClassDecl
->known_categories()) {
1409 if (Cat
== Container
)
1411 if (const auto *Found
= findMatchingProperty(Cat
))
1415 llvm_unreachable("Marked as a property accessor but no property found!");
1418 if (!CheckOverrides
)
1421 using OverridesTy
= SmallVector
<const ObjCMethodDecl
*, 8>;
1423 OverridesTy Overrides
;
1424 getOverriddenMethods(Overrides
);
1425 for (const auto *Override
: Overrides
)
1426 if (const ObjCPropertyDecl
*Prop
= Override
->findPropertyDecl(false))
1432 //===----------------------------------------------------------------------===//
1433 // ObjCTypeParamDecl
1434 //===----------------------------------------------------------------------===//
1436 void ObjCTypeParamDecl::anchor() {}
1438 ObjCTypeParamDecl
*ObjCTypeParamDecl::Create(ASTContext
&ctx
, DeclContext
*dc
,
1439 ObjCTypeParamVariance variance
,
1440 SourceLocation varianceLoc
,
1442 SourceLocation nameLoc
,
1443 IdentifierInfo
*name
,
1444 SourceLocation colonLoc
,
1445 TypeSourceInfo
*boundInfo
) {
1447 new (ctx
, dc
) ObjCTypeParamDecl(ctx
, dc
, variance
, varianceLoc
, index
,
1448 nameLoc
, name
, colonLoc
, boundInfo
);
1449 QualType TPType
= ctx
.getObjCTypeParamType(TPDecl
, {});
1450 TPDecl
->setTypeForDecl(TPType
.getTypePtr());
1454 ObjCTypeParamDecl
*ObjCTypeParamDecl::CreateDeserialized(ASTContext
&ctx
,
1456 return new (ctx
, ID
) ObjCTypeParamDecl(ctx
, nullptr,
1457 ObjCTypeParamVariance::Invariant
,
1458 SourceLocation(), 0, SourceLocation(),
1459 nullptr, SourceLocation(), nullptr);
1462 SourceRange
ObjCTypeParamDecl::getSourceRange() const {
1463 SourceLocation startLoc
= VarianceLoc
;
1464 if (startLoc
.isInvalid())
1465 startLoc
= getLocation();
1467 if (hasExplicitBound()) {
1468 return SourceRange(startLoc
,
1469 getTypeSourceInfo()->getTypeLoc().getEndLoc());
1472 return SourceRange(startLoc
);
1475 //===----------------------------------------------------------------------===//
1476 // ObjCTypeParamList
1477 //===----------------------------------------------------------------------===//
1478 ObjCTypeParamList::ObjCTypeParamList(SourceLocation lAngleLoc
,
1479 ArrayRef
<ObjCTypeParamDecl
*> typeParams
,
1480 SourceLocation rAngleLoc
)
1481 : Brackets(lAngleLoc
, rAngleLoc
), NumParams(typeParams
.size()) {
1482 std::copy(typeParams
.begin(), typeParams
.end(), begin());
1485 ObjCTypeParamList
*ObjCTypeParamList::create(
1487 SourceLocation lAngleLoc
,
1488 ArrayRef
<ObjCTypeParamDecl
*> typeParams
,
1489 SourceLocation rAngleLoc
) {
1491 ctx
.Allocate(totalSizeToAlloc
<ObjCTypeParamDecl
*>(typeParams
.size()),
1492 alignof(ObjCTypeParamList
));
1493 return new (mem
) ObjCTypeParamList(lAngleLoc
, typeParams
, rAngleLoc
);
1496 void ObjCTypeParamList::gatherDefaultTypeArgs(
1497 SmallVectorImpl
<QualType
> &typeArgs
) const {
1498 typeArgs
.reserve(size());
1499 for (auto *typeParam
: *this)
1500 typeArgs
.push_back(typeParam
->getUnderlyingType());
1503 //===----------------------------------------------------------------------===//
1504 // ObjCInterfaceDecl
1505 //===----------------------------------------------------------------------===//
1507 ObjCInterfaceDecl
*ObjCInterfaceDecl::Create(const ASTContext
&C
,
1509 SourceLocation atLoc
,
1511 ObjCTypeParamList
*typeParamList
,
1512 ObjCInterfaceDecl
*PrevDecl
,
1513 SourceLocation ClassLoc
,
1515 auto *Result
= new (C
, DC
)
1516 ObjCInterfaceDecl(C
, DC
, atLoc
, Id
, typeParamList
, ClassLoc
, PrevDecl
,
1518 Result
->Data
.setInt(!C
.getLangOpts().Modules
);
1519 C
.getObjCInterfaceType(Result
, PrevDecl
);
1523 ObjCInterfaceDecl
*ObjCInterfaceDecl::CreateDeserialized(const ASTContext
&C
,
1525 auto *Result
= new (C
, ID
)
1526 ObjCInterfaceDecl(C
, nullptr, SourceLocation(), nullptr, nullptr,
1527 SourceLocation(), nullptr, false);
1528 Result
->Data
.setInt(!C
.getLangOpts().Modules
);
1532 ObjCInterfaceDecl::ObjCInterfaceDecl(const ASTContext
&C
, DeclContext
*DC
,
1533 SourceLocation AtLoc
, IdentifierInfo
*Id
,
1534 ObjCTypeParamList
*typeParamList
,
1535 SourceLocation CLoc
,
1536 ObjCInterfaceDecl
*PrevDecl
,
1538 : ObjCContainerDecl(ObjCInterface
, DC
, Id
, CLoc
, AtLoc
),
1539 redeclarable_base(C
) {
1540 setPreviousDecl(PrevDecl
);
1542 // Copy the 'data' pointer over.
1544 Data
= PrevDecl
->Data
;
1546 setImplicit(IsInternal
);
1548 setTypeParamList(typeParamList
);
1551 void ObjCInterfaceDecl::LoadExternalDefinition() const {
1552 assert(data().ExternallyCompleted
&& "Class is not externally completed");
1553 data().ExternallyCompleted
= false;
1554 getASTContext().getExternalSource()->CompleteType(
1555 const_cast<ObjCInterfaceDecl
*>(this));
1558 void ObjCInterfaceDecl::setExternallyCompleted() {
1559 assert(getASTContext().getExternalSource() &&
1560 "Class can't be externally completed without an external source");
1561 assert(hasDefinition() &&
1562 "Forward declarations can't be externally completed");
1563 data().ExternallyCompleted
= true;
1566 void ObjCInterfaceDecl::setHasDesignatedInitializers() {
1567 // Check for a complete definition and recover if not so.
1568 if (!isThisDeclarationADefinition())
1570 data().HasDesignatedInitializers
= true;
1573 bool ObjCInterfaceDecl::hasDesignatedInitializers() const {
1574 // Check for a complete definition and recover if not so.
1575 if (!isThisDeclarationADefinition())
1577 if (data().ExternallyCompleted
)
1578 LoadExternalDefinition();
1580 return data().HasDesignatedInitializers
;
1584 ObjCInterfaceDecl::getObjCRuntimeNameAsString() const {
1585 if (const auto *ObjCRTName
= getAttr
<ObjCRuntimeNameAttr
>())
1586 return ObjCRTName
->getMetadataName();
1592 ObjCImplementationDecl::getObjCRuntimeNameAsString() const {
1593 if (ObjCInterfaceDecl
*ID
=
1594 const_cast<ObjCImplementationDecl
*>(this)->getClassInterface())
1595 return ID
->getObjCRuntimeNameAsString();
1600 ObjCImplementationDecl
*ObjCInterfaceDecl::getImplementation() const {
1601 if (const ObjCInterfaceDecl
*Def
= getDefinition()) {
1602 if (data().ExternallyCompleted
)
1603 LoadExternalDefinition();
1605 return getASTContext().getObjCImplementation(
1606 const_cast<ObjCInterfaceDecl
*>(Def
));
1609 // FIXME: Should make sure no callers ever do this.
1613 void ObjCInterfaceDecl::setImplementation(ObjCImplementationDecl
*ImplD
) {
1614 getASTContext().setObjCImplementation(getDefinition(), ImplD
);
1619 struct SynthesizeIvarChunk
{
1623 SynthesizeIvarChunk(uint64_t size
, ObjCIvarDecl
*ivar
)
1624 : Size(size
), Ivar(ivar
) {}
1627 bool operator<(const SynthesizeIvarChunk
& LHS
,
1628 const SynthesizeIvarChunk
&RHS
) {
1629 return LHS
.Size
< RHS
.Size
;
1634 /// all_declared_ivar_begin - return first ivar declared in this class,
1635 /// its extensions and its implementation. Lazily build the list on first
1638 /// Caveat: The list returned by this method reflects the current
1639 /// state of the parser. The cache will be updated for every ivar
1640 /// added by an extension or the implementation when they are
1642 /// See also ObjCIvarDecl::Create().
1643 ObjCIvarDecl
*ObjCInterfaceDecl::all_declared_ivar_begin() {
1644 // FIXME: Should make sure no callers ever do this.
1645 if (!hasDefinition())
1648 ObjCIvarDecl
*curIvar
= nullptr;
1649 if (!data().IvarList
) {
1650 // Force ivar deserialization upfront, before building IvarList.
1652 for (const auto *Ext
: known_extensions()) {
1653 (void)Ext
->ivar_empty();
1655 if (!ivar_empty()) {
1656 ObjCInterfaceDecl::ivar_iterator I
= ivar_begin(), E
= ivar_end();
1657 data().IvarList
= *I
; ++I
;
1658 for (curIvar
= data().IvarList
; I
!= E
; curIvar
= *I
, ++I
)
1659 curIvar
->setNextIvar(*I
);
1662 for (const auto *Ext
: known_extensions()) {
1663 if (!Ext
->ivar_empty()) {
1664 ObjCCategoryDecl::ivar_iterator
1665 I
= Ext
->ivar_begin(),
1666 E
= Ext
->ivar_end();
1667 if (!data().IvarList
) {
1668 data().IvarList
= *I
; ++I
;
1669 curIvar
= data().IvarList
;
1671 for ( ;I
!= E
; curIvar
= *I
, ++I
)
1672 curIvar
->setNextIvar(*I
);
1675 data().IvarListMissingImplementation
= true;
1678 // cached and complete!
1679 if (!data().IvarListMissingImplementation
)
1680 return data().IvarList
;
1682 if (ObjCImplementationDecl
*ImplDecl
= getImplementation()) {
1683 data().IvarListMissingImplementation
= false;
1684 if (!ImplDecl
->ivar_empty()) {
1685 SmallVector
<SynthesizeIvarChunk
, 16> layout
;
1686 for (auto *IV
: ImplDecl
->ivars()) {
1687 if (IV
->getSynthesize() && !IV
->isInvalidDecl()) {
1688 layout
.push_back(SynthesizeIvarChunk(
1689 IV
->getASTContext().getTypeSize(IV
->getType()), IV
));
1692 if (!data().IvarList
)
1693 data().IvarList
= IV
;
1695 curIvar
->setNextIvar(IV
);
1699 if (!layout
.empty()) {
1700 // Order synthesized ivars by their size.
1701 llvm::stable_sort(layout
);
1702 unsigned Ix
= 0, EIx
= layout
.size();
1703 if (!data().IvarList
) {
1704 data().IvarList
= layout
[0].Ivar
; Ix
++;
1705 curIvar
= data().IvarList
;
1707 for ( ; Ix
!= EIx
; curIvar
= layout
[Ix
].Ivar
, Ix
++)
1708 curIvar
->setNextIvar(layout
[Ix
].Ivar
);
1712 return data().IvarList
;
1715 /// FindCategoryDeclaration - Finds category declaration in the list of
1716 /// categories for this class and returns it. Name of the category is passed
1717 /// in 'CategoryId'. If category not found, return 0;
1720 ObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo
*CategoryId
) const {
1721 // FIXME: Should make sure no callers ever do this.
1722 if (!hasDefinition())
1725 if (data().ExternallyCompleted
)
1726 LoadExternalDefinition();
1728 for (auto *Cat
: visible_categories())
1729 if (Cat
->getIdentifier() == CategoryId
)
1736 ObjCInterfaceDecl::getCategoryInstanceMethod(Selector Sel
) const {
1737 for (const auto *Cat
: visible_categories()) {
1738 if (ObjCCategoryImplDecl
*Impl
= Cat
->getImplementation())
1739 if (ObjCMethodDecl
*MD
= Impl
->getInstanceMethod(Sel
))
1746 ObjCMethodDecl
*ObjCInterfaceDecl::getCategoryClassMethod(Selector Sel
) const {
1747 for (const auto *Cat
: visible_categories()) {
1748 if (ObjCCategoryImplDecl
*Impl
= Cat
->getImplementation())
1749 if (ObjCMethodDecl
*MD
= Impl
->getClassMethod(Sel
))
1756 /// ClassImplementsProtocol - Checks that 'lProto' protocol
1757 /// has been implemented in IDecl class, its super class or categories (if
1758 /// lookupCategory is true).
1759 bool ObjCInterfaceDecl::ClassImplementsProtocol(ObjCProtocolDecl
*lProto
,
1760 bool lookupCategory
,
1761 bool RHSIsQualifiedID
) {
1762 if (!hasDefinition())
1765 ObjCInterfaceDecl
*IDecl
= this;
1766 // 1st, look up the class.
1767 for (auto *PI
: IDecl
->protocols()){
1768 if (getASTContext().ProtocolCompatibleWithProtocol(lProto
, PI
))
1770 // This is dubious and is added to be compatible with gcc. In gcc, it is
1771 // also allowed assigning a protocol-qualified 'id' type to a LHS object
1772 // when protocol in qualified LHS is in list of protocols in the rhs 'id'
1773 // object. This IMO, should be a bug.
1774 // FIXME: Treat this as an extension, and flag this as an error when GCC
1775 // extensions are not enabled.
1776 if (RHSIsQualifiedID
&&
1777 getASTContext().ProtocolCompatibleWithProtocol(PI
, lProto
))
1781 // 2nd, look up the category.
1783 for (const auto *Cat
: visible_categories()) {
1784 for (auto *PI
: Cat
->protocols())
1785 if (getASTContext().ProtocolCompatibleWithProtocol(lProto
, PI
))
1789 // 3rd, look up the super class(s)
1790 if (IDecl
->getSuperClass())
1792 IDecl
->getSuperClass()->ClassImplementsProtocol(lProto
, lookupCategory
,
1798 //===----------------------------------------------------------------------===//
1800 //===----------------------------------------------------------------------===//
1802 void ObjCIvarDecl::anchor() {}
1804 ObjCIvarDecl
*ObjCIvarDecl::Create(ASTContext
&C
, ObjCContainerDecl
*DC
,
1805 SourceLocation StartLoc
,
1806 SourceLocation IdLoc
, IdentifierInfo
*Id
,
1807 QualType T
, TypeSourceInfo
*TInfo
,
1808 AccessControl ac
, Expr
*BW
,
1811 // Ivar's can only appear in interfaces, implementations (via synthesized
1812 // properties), and class extensions (via direct declaration, or synthesized
1815 // FIXME: This should really be asserting this:
1816 // (isa<ObjCCategoryDecl>(DC) &&
1817 // cast<ObjCCategoryDecl>(DC)->IsClassExtension()))
1818 // but unfortunately we sometimes place ivars into non-class extension
1819 // categories on error. This breaks an AST invariant, and should not be
1821 assert((isa
<ObjCInterfaceDecl
>(DC
) || isa
<ObjCImplementationDecl
>(DC
) ||
1822 isa
<ObjCCategoryDecl
>(DC
)) &&
1823 "Invalid ivar decl context!");
1824 // Once a new ivar is created in any of class/class-extension/implementation
1825 // decl contexts, the previously built IvarList must be rebuilt.
1826 auto *ID
= dyn_cast
<ObjCInterfaceDecl
>(DC
);
1828 if (auto *IM
= dyn_cast
<ObjCImplementationDecl
>(DC
))
1829 ID
= IM
->getClassInterface();
1831 ID
= cast
<ObjCCategoryDecl
>(DC
)->getClassInterface();
1833 ID
->setIvarList(nullptr);
1836 return new (C
, DC
) ObjCIvarDecl(DC
, StartLoc
, IdLoc
, Id
, T
, TInfo
, ac
, BW
,
1840 ObjCIvarDecl
*ObjCIvarDecl::CreateDeserialized(ASTContext
&C
, unsigned ID
) {
1841 return new (C
, ID
) ObjCIvarDecl(nullptr, SourceLocation(), SourceLocation(),
1842 nullptr, QualType(), nullptr,
1843 ObjCIvarDecl::None
, nullptr, false);
1846 ObjCInterfaceDecl
*ObjCIvarDecl::getContainingInterface() {
1847 auto *DC
= cast
<ObjCContainerDecl
>(getDeclContext());
1849 switch (DC
->getKind()) {
1851 case ObjCCategoryImpl
:
1853 llvm_unreachable("invalid ivar container!");
1855 // Ivars can only appear in class extension categories.
1856 case ObjCCategory
: {
1857 auto *CD
= cast
<ObjCCategoryDecl
>(DC
);
1858 assert(CD
->IsClassExtension() && "invalid container for ivar!");
1859 return CD
->getClassInterface();
1862 case ObjCImplementation
:
1863 return cast
<ObjCImplementationDecl
>(DC
)->getClassInterface();
1866 return cast
<ObjCInterfaceDecl
>(DC
);
1870 QualType
ObjCIvarDecl::getUsageType(QualType objectType
) const {
1871 return getType().substObjCMemberType(objectType
, getDeclContext(),
1872 ObjCSubstitutionContext::Property
);
1875 //===----------------------------------------------------------------------===//
1876 // ObjCAtDefsFieldDecl
1877 //===----------------------------------------------------------------------===//
1879 void ObjCAtDefsFieldDecl::anchor() {}
1882 *ObjCAtDefsFieldDecl::Create(ASTContext
&C
, DeclContext
*DC
,
1883 SourceLocation StartLoc
, SourceLocation IdLoc
,
1884 IdentifierInfo
*Id
, QualType T
, Expr
*BW
) {
1885 return new (C
, DC
) ObjCAtDefsFieldDecl(DC
, StartLoc
, IdLoc
, Id
, T
, BW
);
1888 ObjCAtDefsFieldDecl
*ObjCAtDefsFieldDecl::CreateDeserialized(ASTContext
&C
,
1890 return new (C
, ID
) ObjCAtDefsFieldDecl(nullptr, SourceLocation(),
1891 SourceLocation(), nullptr, QualType(),
1895 //===----------------------------------------------------------------------===//
1897 //===----------------------------------------------------------------------===//
1899 void ObjCProtocolDecl::anchor() {}
1901 ObjCProtocolDecl::ObjCProtocolDecl(ASTContext
&C
, DeclContext
*DC
,
1902 IdentifierInfo
*Id
, SourceLocation nameLoc
,
1903 SourceLocation atStartLoc
,
1904 ObjCProtocolDecl
*PrevDecl
)
1905 : ObjCContainerDecl(ObjCProtocol
, DC
, Id
, nameLoc
, atStartLoc
),
1906 redeclarable_base(C
) {
1907 setPreviousDecl(PrevDecl
);
1909 Data
= PrevDecl
->Data
;
1912 ObjCProtocolDecl
*ObjCProtocolDecl::Create(ASTContext
&C
, DeclContext
*DC
,
1914 SourceLocation nameLoc
,
1915 SourceLocation atStartLoc
,
1916 ObjCProtocolDecl
*PrevDecl
) {
1918 new (C
, DC
) ObjCProtocolDecl(C
, DC
, Id
, nameLoc
, atStartLoc
, PrevDecl
);
1919 Result
->Data
.setInt(!C
.getLangOpts().Modules
);
1923 ObjCProtocolDecl
*ObjCProtocolDecl::CreateDeserialized(ASTContext
&C
,
1925 ObjCProtocolDecl
*Result
=
1926 new (C
, ID
) ObjCProtocolDecl(C
, nullptr, nullptr, SourceLocation(),
1927 SourceLocation(), nullptr);
1928 Result
->Data
.setInt(!C
.getLangOpts().Modules
);
1932 bool ObjCProtocolDecl::isNonRuntimeProtocol() const {
1933 return hasAttr
<ObjCNonRuntimeProtocolAttr
>();
1936 void ObjCProtocolDecl::getImpliedProtocols(
1937 llvm::DenseSet
<const ObjCProtocolDecl
*> &IPs
) const {
1938 std::queue
<const ObjCProtocolDecl
*> WorkQueue
;
1939 WorkQueue
.push(this);
1941 while (!WorkQueue
.empty()) {
1942 const auto *PD
= WorkQueue
.front();
1944 for (const auto *Parent
: PD
->protocols()) {
1945 const auto *Can
= Parent
->getCanonicalDecl();
1946 auto Result
= IPs
.insert(Can
);
1948 WorkQueue
.push(Parent
);
1953 ObjCProtocolDecl
*ObjCProtocolDecl::lookupProtocolNamed(IdentifierInfo
*Name
) {
1954 ObjCProtocolDecl
*PDecl
= this;
1956 if (Name
== getIdentifier())
1959 for (auto *I
: protocols())
1960 if ((PDecl
= I
->lookupProtocolNamed(Name
)))
1966 // lookupMethod - Lookup a instance/class method in the protocol and protocols
1968 ObjCMethodDecl
*ObjCProtocolDecl::lookupMethod(Selector Sel
,
1969 bool isInstance
) const {
1970 ObjCMethodDecl
*MethodDecl
= nullptr;
1972 // If there is no definition or the definition is hidden, we don't find
1974 const ObjCProtocolDecl
*Def
= getDefinition();
1975 if (!Def
|| !Def
->isUnconditionallyVisible())
1978 if ((MethodDecl
= getMethod(Sel
, isInstance
)))
1981 for (const auto *I
: protocols())
1982 if ((MethodDecl
= I
->lookupMethod(Sel
, isInstance
)))
1987 void ObjCProtocolDecl::allocateDefinitionData() {
1988 assert(!Data
.getPointer() && "Protocol already has a definition!");
1989 Data
.setPointer(new (getASTContext()) DefinitionData
);
1990 Data
.getPointer()->Definition
= this;
1993 void ObjCProtocolDecl::startDefinition() {
1994 allocateDefinitionData();
1996 // Update all of the declarations with a pointer to the definition.
1997 for (auto *RD
: redecls())
1998 RD
->Data
= this->Data
;
2001 void ObjCProtocolDecl::collectPropertiesToImplement(PropertyMap
&PM
,
2002 PropertyDeclOrder
&PO
) const {
2003 if (const ObjCProtocolDecl
*PDecl
= getDefinition()) {
2004 for (auto *Prop
: PDecl
->properties()) {
2005 // Insert into PM if not there already.
2006 PM
.insert(std::make_pair(
2007 std::make_pair(Prop
->getIdentifier(), Prop
->isClassProperty()),
2011 // Scan through protocol's protocols.
2012 for (const auto *PI
: PDecl
->protocols())
2013 PI
->collectPropertiesToImplement(PM
, PO
);
2017 void ObjCProtocolDecl::collectInheritedProtocolProperties(
2018 const ObjCPropertyDecl
*Property
, ProtocolPropertySet
&PS
,
2019 PropertyDeclOrder
&PO
) const {
2020 if (const ObjCProtocolDecl
*PDecl
= getDefinition()) {
2021 if (!PS
.insert(PDecl
).second
)
2023 for (auto *Prop
: PDecl
->properties()) {
2024 if (Prop
== Property
)
2026 if (Prop
->getIdentifier() == Property
->getIdentifier()) {
2031 // Scan through protocol's protocols which did not have a matching property.
2032 for (const auto *PI
: PDecl
->protocols())
2033 PI
->collectInheritedProtocolProperties(Property
, PS
, PO
);
2038 ObjCProtocolDecl::getObjCRuntimeNameAsString() const {
2039 if (const auto *ObjCRTName
= getAttr
<ObjCRuntimeNameAttr
>())
2040 return ObjCRTName
->getMetadataName();
2045 //===----------------------------------------------------------------------===//
2047 //===----------------------------------------------------------------------===//
2049 void ObjCCategoryDecl::anchor() {}
2051 ObjCCategoryDecl::ObjCCategoryDecl(DeclContext
*DC
, SourceLocation AtLoc
,
2052 SourceLocation ClassNameLoc
,
2053 SourceLocation CategoryNameLoc
,
2054 IdentifierInfo
*Id
, ObjCInterfaceDecl
*IDecl
,
2055 ObjCTypeParamList
*typeParamList
,
2056 SourceLocation IvarLBraceLoc
,
2057 SourceLocation IvarRBraceLoc
)
2058 : ObjCContainerDecl(ObjCCategory
, DC
, Id
, ClassNameLoc
, AtLoc
),
2059 ClassInterface(IDecl
), CategoryNameLoc(CategoryNameLoc
),
2060 IvarLBraceLoc(IvarLBraceLoc
), IvarRBraceLoc(IvarRBraceLoc
) {
2061 setTypeParamList(typeParamList
);
2064 ObjCCategoryDecl
*ObjCCategoryDecl::Create(ASTContext
&C
, DeclContext
*DC
,
2065 SourceLocation AtLoc
,
2066 SourceLocation ClassNameLoc
,
2067 SourceLocation CategoryNameLoc
,
2069 ObjCInterfaceDecl
*IDecl
,
2070 ObjCTypeParamList
*typeParamList
,
2071 SourceLocation IvarLBraceLoc
,
2072 SourceLocation IvarRBraceLoc
) {
2074 new (C
, DC
) ObjCCategoryDecl(DC
, AtLoc
, ClassNameLoc
, CategoryNameLoc
, Id
,
2075 IDecl
, typeParamList
, IvarLBraceLoc
,
2078 // Link this category into its class's category list.
2079 CatDecl
->NextClassCategory
= IDecl
->getCategoryListRaw();
2080 if (IDecl
->hasDefinition()) {
2081 IDecl
->setCategoryListRaw(CatDecl
);
2082 if (ASTMutationListener
*L
= C
.getASTMutationListener())
2083 L
->AddedObjCCategoryToInterface(CatDecl
, IDecl
);
2090 ObjCCategoryDecl
*ObjCCategoryDecl::CreateDeserialized(ASTContext
&C
,
2092 return new (C
, ID
) ObjCCategoryDecl(nullptr, SourceLocation(),
2093 SourceLocation(), SourceLocation(),
2094 nullptr, nullptr, nullptr);
2097 ObjCCategoryImplDecl
*ObjCCategoryDecl::getImplementation() const {
2098 return getASTContext().getObjCImplementation(
2099 const_cast<ObjCCategoryDecl
*>(this));
2102 void ObjCCategoryDecl::setImplementation(ObjCCategoryImplDecl
*ImplD
) {
2103 getASTContext().setObjCImplementation(this, ImplD
);
2106 void ObjCCategoryDecl::setTypeParamList(ObjCTypeParamList
*TPL
) {
2107 TypeParamList
= TPL
;
2110 // Set the declaration context of each of the type parameters.
2111 for (auto *typeParam
: *TypeParamList
)
2112 typeParam
->setDeclContext(this);
2115 //===----------------------------------------------------------------------===//
2116 // ObjCCategoryImplDecl
2117 //===----------------------------------------------------------------------===//
2119 void ObjCCategoryImplDecl::anchor() {}
2121 ObjCCategoryImplDecl
*
2122 ObjCCategoryImplDecl::Create(ASTContext
&C
, DeclContext
*DC
,
2124 ObjCInterfaceDecl
*ClassInterface
,
2125 SourceLocation nameLoc
,
2126 SourceLocation atStartLoc
,
2127 SourceLocation CategoryNameLoc
) {
2128 if (ClassInterface
&& ClassInterface
->hasDefinition())
2129 ClassInterface
= ClassInterface
->getDefinition();
2130 return new (C
, DC
) ObjCCategoryImplDecl(DC
, Id
, ClassInterface
, nameLoc
,
2131 atStartLoc
, CategoryNameLoc
);
2134 ObjCCategoryImplDecl
*ObjCCategoryImplDecl::CreateDeserialized(ASTContext
&C
,
2136 return new (C
, ID
) ObjCCategoryImplDecl(nullptr, nullptr, nullptr,
2137 SourceLocation(), SourceLocation(),
2141 ObjCCategoryDecl
*ObjCCategoryImplDecl::getCategoryDecl() const {
2142 // The class interface might be NULL if we are working with invalid code.
2143 if (const ObjCInterfaceDecl
*ID
= getClassInterface())
2144 return ID
->FindCategoryDeclaration(getIdentifier());
2148 void ObjCImplDecl::anchor() {}
2150 void ObjCImplDecl::addPropertyImplementation(ObjCPropertyImplDecl
*property
) {
2151 // FIXME: The context should be correct before we get here.
2152 property
->setLexicalDeclContext(this);
2156 void ObjCImplDecl::setClassInterface(ObjCInterfaceDecl
*IFace
) {
2157 ASTContext
&Ctx
= getASTContext();
2159 if (auto *ImplD
= dyn_cast_or_null
<ObjCImplementationDecl
>(this)) {
2161 Ctx
.setObjCImplementation(IFace
, ImplD
);
2163 } else if (auto *ImplD
= dyn_cast_or_null
<ObjCCategoryImplDecl
>(this)) {
2164 if (ObjCCategoryDecl
*CD
= IFace
->FindCategoryDeclaration(getIdentifier()))
2165 Ctx
.setObjCImplementation(CD
, ImplD
);
2168 ClassInterface
= IFace
;
2171 /// FindPropertyImplIvarDecl - This method lookup the ivar in the list of
2172 /// properties implemented in this \@implementation block and returns
2173 /// the implemented property that uses it.
2174 ObjCPropertyImplDecl
*ObjCImplDecl::
2175 FindPropertyImplIvarDecl(IdentifierInfo
*ivarId
) const {
2176 for (auto *PID
: property_impls())
2177 if (PID
->getPropertyIvarDecl() &&
2178 PID
->getPropertyIvarDecl()->getIdentifier() == ivarId
)
2183 /// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl
2184 /// added to the list of those properties \@synthesized/\@dynamic in this
2185 /// category \@implementation block.
2186 ObjCPropertyImplDecl
*ObjCImplDecl::
2187 FindPropertyImplDecl(IdentifierInfo
*Id
,
2188 ObjCPropertyQueryKind QueryKind
) const {
2189 ObjCPropertyImplDecl
*ClassPropImpl
= nullptr;
2190 for (auto *PID
: property_impls())
2191 // If queryKind is unknown, we return the instance property if one
2192 // exists; otherwise we return the class property.
2193 if (PID
->getPropertyDecl()->getIdentifier() == Id
) {
2194 if ((QueryKind
== ObjCPropertyQueryKind::OBJC_PR_query_unknown
&&
2195 !PID
->getPropertyDecl()->isClassProperty()) ||
2196 (QueryKind
== ObjCPropertyQueryKind::OBJC_PR_query_class
&&
2197 PID
->getPropertyDecl()->isClassProperty()) ||
2198 (QueryKind
== ObjCPropertyQueryKind::OBJC_PR_query_instance
&&
2199 !PID
->getPropertyDecl()->isClassProperty()))
2202 if (PID
->getPropertyDecl()->isClassProperty())
2203 ClassPropImpl
= PID
;
2206 if (QueryKind
== ObjCPropertyQueryKind::OBJC_PR_query_unknown
)
2207 // We can't find the instance property, return the class property.
2208 return ClassPropImpl
;
2213 raw_ostream
&clang::operator<<(raw_ostream
&OS
,
2214 const ObjCCategoryImplDecl
&CID
) {
2215 OS
<< CID
.getName();
2219 //===----------------------------------------------------------------------===//
2220 // ObjCImplementationDecl
2221 //===----------------------------------------------------------------------===//
2223 void ObjCImplementationDecl::anchor() {}
2225 ObjCImplementationDecl
*
2226 ObjCImplementationDecl::Create(ASTContext
&C
, DeclContext
*DC
,
2227 ObjCInterfaceDecl
*ClassInterface
,
2228 ObjCInterfaceDecl
*SuperDecl
,
2229 SourceLocation nameLoc
,
2230 SourceLocation atStartLoc
,
2231 SourceLocation superLoc
,
2232 SourceLocation IvarLBraceLoc
,
2233 SourceLocation IvarRBraceLoc
) {
2234 if (ClassInterface
&& ClassInterface
->hasDefinition())
2235 ClassInterface
= ClassInterface
->getDefinition();
2236 return new (C
, DC
) ObjCImplementationDecl(DC
, ClassInterface
, SuperDecl
,
2237 nameLoc
, atStartLoc
, superLoc
,
2238 IvarLBraceLoc
, IvarRBraceLoc
);
2241 ObjCImplementationDecl
*
2242 ObjCImplementationDecl::CreateDeserialized(ASTContext
&C
, unsigned ID
) {
2243 return new (C
, ID
) ObjCImplementationDecl(nullptr, nullptr, nullptr,
2244 SourceLocation(), SourceLocation());
2247 void ObjCImplementationDecl::setIvarInitializers(ASTContext
&C
,
2248 CXXCtorInitializer
** initializers
,
2249 unsigned numInitializers
) {
2250 if (numInitializers
> 0) {
2251 NumIvarInitializers
= numInitializers
;
2252 auto **ivarInitializers
= new (C
) CXXCtorInitializer
*[NumIvarInitializers
];
2253 memcpy(ivarInitializers
, initializers
,
2254 numInitializers
* sizeof(CXXCtorInitializer
*));
2255 IvarInitializers
= ivarInitializers
;
2259 ObjCImplementationDecl::init_const_iterator
2260 ObjCImplementationDecl::init_begin() const {
2261 return IvarInitializers
.get(getASTContext().getExternalSource());
2264 raw_ostream
&clang::operator<<(raw_ostream
&OS
,
2265 const ObjCImplementationDecl
&ID
) {
2270 //===----------------------------------------------------------------------===//
2271 // ObjCCompatibleAliasDecl
2272 //===----------------------------------------------------------------------===//
2274 void ObjCCompatibleAliasDecl::anchor() {}
2276 ObjCCompatibleAliasDecl
*
2277 ObjCCompatibleAliasDecl::Create(ASTContext
&C
, DeclContext
*DC
,
2280 ObjCInterfaceDecl
* AliasedClass
) {
2281 return new (C
, DC
) ObjCCompatibleAliasDecl(DC
, L
, Id
, AliasedClass
);
2284 ObjCCompatibleAliasDecl
*
2285 ObjCCompatibleAliasDecl::CreateDeserialized(ASTContext
&C
, unsigned ID
) {
2286 return new (C
, ID
) ObjCCompatibleAliasDecl(nullptr, SourceLocation(),
2290 //===----------------------------------------------------------------------===//
2292 //===----------------------------------------------------------------------===//
2294 void ObjCPropertyDecl::anchor() {}
2296 ObjCPropertyDecl
*ObjCPropertyDecl::Create(ASTContext
&C
, DeclContext
*DC
,
2299 SourceLocation AtLoc
,
2300 SourceLocation LParenLoc
,
2302 TypeSourceInfo
*TSI
,
2303 PropertyControl propControl
) {
2304 return new (C
, DC
) ObjCPropertyDecl(DC
, L
, Id
, AtLoc
, LParenLoc
, T
, TSI
,
2308 ObjCPropertyDecl
*ObjCPropertyDecl::CreateDeserialized(ASTContext
&C
,
2310 return new (C
, ID
) ObjCPropertyDecl(nullptr, SourceLocation(), nullptr,
2311 SourceLocation(), SourceLocation(),
2312 QualType(), nullptr, None
);
2315 QualType
ObjCPropertyDecl::getUsageType(QualType objectType
) const {
2316 return DeclType
.substObjCMemberType(objectType
, getDeclContext(),
2317 ObjCSubstitutionContext::Property
);
2320 bool ObjCPropertyDecl::isDirectProperty() const {
2321 return (PropertyAttributes
& ObjCPropertyAttribute::kind_direct
) &&
2322 !getASTContext().getLangOpts().ObjCDisableDirectMethodsForTesting
;
2325 //===----------------------------------------------------------------------===//
2326 // ObjCPropertyImplDecl
2327 //===----------------------------------------------------------------------===//
2329 ObjCPropertyImplDecl
*ObjCPropertyImplDecl::Create(ASTContext
&C
,
2331 SourceLocation atLoc
,
2333 ObjCPropertyDecl
*property
,
2336 SourceLocation ivarLoc
) {
2337 return new (C
, DC
) ObjCPropertyImplDecl(DC
, atLoc
, L
, property
, PK
, ivar
,
2341 ObjCPropertyImplDecl
*ObjCPropertyImplDecl::CreateDeserialized(ASTContext
&C
,
2343 return new (C
, ID
) ObjCPropertyImplDecl(nullptr, SourceLocation(),
2344 SourceLocation(), nullptr, Dynamic
,
2345 nullptr, SourceLocation());
2348 SourceRange
ObjCPropertyImplDecl::getSourceRange() const {
2349 SourceLocation EndLoc
= getLocation();
2350 if (IvarLoc
.isValid())
2353 return SourceRange(AtLoc
, EndLoc
);