Move logic to check if a class is tagged with objc_suppress_protocol_methods into a helper.

llvm-svn: 195559
This commit is contained in:
Ted Kremenek 2013-11-23 22:29:06 +00:00
parent d480b1bf34
commit 33f504328f
2 changed files with 22 additions and 12 deletions

View File

@ -925,6 +925,10 @@ public:
: superCls;
}
/// \brief Returns true if this class is marked to suppress being
/// used to determine if a subclass conforms to a protocol.
bool shouldSuppressProtocol(const ObjCProtocolDecl *P) const;
/// \brief Iterator that walks over the list of categories, filtering out
/// those that do not meet specific criteria.
///

View File

@ -256,6 +256,22 @@ ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
void ObjCInterfaceDecl::anchor() { }
bool ObjCInterfaceDecl::shouldSuppressProtocol(const ObjCProtocolDecl *P) const{
if (!hasAttrs())
return false;
const AttrVec &V = getAttrs();
const IdentifierInfo *PI = P->getIdentifier();
for (AttrVec::const_iterator I = V.begin(), E = V.end(); I != E; ++I) {
if (const ObjCSuppressProtocolAttr *A =
dyn_cast<ObjCSuppressProtocolAttr>(*I)){
if (A->getProtocol() == PI) {
return true;
}
}
}
return false;
}
/// FindPropertyVisibleInPrimaryClass - Finds declaration of the property
/// with name 'PropertyId' in the primary class; including those in protocols
/// (direct or indirect) used by the primary class.
@ -477,18 +493,8 @@ ObjCMethodDecl *ObjCInterfaceDecl::lookupMethod(Selector Sel,
// If we are looking for a method that is part of protocol conformance,
// check if the superclass has been marked to suppress conformance
// of that protocol.
if (P && ClassDecl->hasAttrs()) {
const AttrVec &V = ClassDecl->getAttrs();
const IdentifierInfo *PI = P->getIdentifier();
for (AttrVec::const_iterator I = V.begin(), E = V.end(); I != E; ++I) {
if (const ObjCSuppressProtocolAttr *A =
dyn_cast<ObjCSuppressProtocolAttr>(*I)){
if (A->getProtocol() == PI) {
return 0;
}
}
}
}
if (P && ClassDecl->shouldSuppressProtocol(P))
return 0;
if ((MethodDecl = ClassDecl->getMethod(Sel, isInstance)))
return MethodDecl;