From f5fc20ff49b9adae90bfb30c60c7ade7d8be98e4 Mon Sep 17 00:00:00 2001 From: Ted Kremenek <kremenek@apple.com> Date: Sat, 23 Nov 2013 22:29:06 +0000 Subject: [PATCH] Move logic to check if a class is tagged with objc_suppress_protocol_methods into a helper. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@195559 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclObjC.h | 4 ++++ lib/AST/DeclObjC.cpp | 30 ++++++++++++++++++------------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 23778cb368a..def5817793f 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -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. /// diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index a4857b60731..69de6a3c859 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -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; -- GitLab