forked from OSchip/llvm-project
[Sema] Prefer to use ObjCInterfaceDecl's protocol_begin()/protocol_end() iterators instead of
ObjCInterfaceDecl::getReferencedProtocols(), because the iterators are safe to use even if the caller did not check that the interface is a definition. llvm-svn: 152597
This commit is contained in:
parent
3b60cffa22
commit
e7f3ef39bf
|
@ -651,6 +651,7 @@ public:
|
|||
void setExternallyCompleted();
|
||||
|
||||
const ObjCProtocolList &getReferencedProtocols() const {
|
||||
assert(hasDefinition() && "Caller did not check for forward reference!");
|
||||
if (data().ExternallyCompleted)
|
||||
LoadExternalDefinition();
|
||||
|
||||
|
|
|
@ -334,10 +334,9 @@ ObjCMethodDecl *ObjCInterfaceDecl::lookupMethod(Selector Sel,
|
|||
return MethodDecl;
|
||||
|
||||
// Didn't find one yet - look through protocols.
|
||||
const ObjCList<ObjCProtocolDecl> &Protocols =
|
||||
ClassDecl->getReferencedProtocols();
|
||||
for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
|
||||
E = Protocols.end(); I != E; ++I)
|
||||
for (ObjCInterfaceDecl::protocol_iterator I = ClassDecl->protocol_begin(),
|
||||
E = ClassDecl->protocol_end();
|
||||
I != E; ++I)
|
||||
if ((MethodDecl = (*I)->lookupMethod(Sel, isInstance)))
|
||||
return MethodDecl;
|
||||
if (!noCategoryLookup) {
|
||||
|
@ -850,11 +849,8 @@ bool ObjCInterfaceDecl::ClassImplementsProtocol(ObjCProtocolDecl *lProto,
|
|||
|
||||
ObjCInterfaceDecl *IDecl = this;
|
||||
// 1st, look up the class.
|
||||
const ObjCList<ObjCProtocolDecl> &Protocols =
|
||||
IDecl->getReferencedProtocols();
|
||||
|
||||
for (ObjCList<ObjCProtocolDecl>::iterator PI = Protocols.begin(),
|
||||
E = Protocols.end(); PI != E; ++PI) {
|
||||
for (ObjCInterfaceDecl::protocol_iterator
|
||||
PI = IDecl->protocol_begin(), E = IDecl->protocol_end(); PI != E; ++PI){
|
||||
if (getASTContext().ProtocolCompatibleWithProtocol(lProto, *PI))
|
||||
return true;
|
||||
// This is dubious and is added to be compatible with gcc. In gcc, it is
|
||||
|
|
|
@ -2070,9 +2070,9 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) {
|
|||
}
|
||||
// Collect the names of referenced protocols
|
||||
SmallVector<std::string, 16> Protocols;
|
||||
const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols();
|
||||
for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(),
|
||||
E = Protos.end(); I != E; ++I)
|
||||
for (ObjCInterfaceDecl::protocol_iterator
|
||||
I = ClassDecl->protocol_begin(),
|
||||
E = ClassDecl->protocol_end(); I != E; ++I)
|
||||
Protocols.push_back((*I)->getNameAsString());
|
||||
|
||||
|
||||
|
|
|
@ -6283,10 +6283,10 @@ void RewriteModernObjC::RewriteObjCCategoryImplDecl(ObjCCategoryImplDecl *IDecl,
|
|||
// Protocols referenced in class declaration?
|
||||
// Protocol's super protocol list
|
||||
std::vector<ObjCProtocolDecl *> RefedProtocols;
|
||||
const ObjCList<ObjCProtocolDecl> &Protocols = CDecl->getReferencedProtocols();
|
||||
for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
|
||||
E = Protocols.end();
|
||||
I != E; ++I) {
|
||||
for (ObjCInterfaceDecl::protocol_iterator I = CDecl->protocol_begin(),
|
||||
E = CDecl->protocol_end();
|
||||
|
||||
I != E; ++I) {
|
||||
RefedProtocols.push_back(*I);
|
||||
// Must write out all protocol definitions in current qualifier list,
|
||||
// and in their nested qualifiers before writing out current definition.
|
||||
|
|
|
@ -4708,9 +4708,8 @@ static void AddObjCMethods(ObjCContainerDecl *Container,
|
|||
return;
|
||||
|
||||
// Add methods in protocols.
|
||||
const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols();
|
||||
for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
|
||||
E = Protocols.end();
|
||||
for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(),
|
||||
E = IFace->protocol_end();
|
||||
I != E; ++I)
|
||||
AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents,
|
||||
CurContext, Selectors, AllowSameLength, Results, false);
|
||||
|
|
Loading…
Reference in New Issue