From 446ee4eb4fc4c705a59365252df7a5c253daafa1 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Wed, 27 May 2009 16:21:00 +0000 Subject: [PATCH] Convert ObjC qualified type clients over to using iterators. This allows me to remove some API that I don't want to carry over to ObjCObjectPointerType. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72475 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Type.h | 20 -------------------- lib/AST/ASTContext.cpp | 12 ++++++------ lib/AST/Type.cpp | 7 +++---- lib/Frontend/PCHWriter.cpp | 10 ++++++---- lib/Sema/SemaExprObjC.cpp | 33 +++++++++++++++++++-------------- 5 files changed, 34 insertions(+), 48 deletions(-) diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index ff3d89c354..78cd8de133 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -1623,10 +1623,6 @@ public: /// interface type, or 0 if there are none. inline unsigned getNumProtocols() const; - /// getProtocol - Return the specified qualifying protocol. - inline ObjCProtocolDecl *getProtocol(unsigned i) const; - - virtual void getAsStringInternal(std::string &InnerString) const; static bool classof(const Type *T) { return T->getTypeClass() == ObjCInterface || @@ -1654,9 +1650,6 @@ class ObjCQualifiedInterfaceType : public ObjCInterfaceType, friend class ASTContext; // ASTContext creates these. public: - ObjCProtocolDecl *getProtocol(unsigned i) const { - return Protocols[i]; - } unsigned getNumProtocols() const { return Protocols.size(); } @@ -1699,13 +1692,6 @@ inline unsigned ObjCInterfaceType::getNumProtocols() const { return 0; } -/// getProtocol - Return the specified qualifying protocol. -inline ObjCProtocolDecl *ObjCInterfaceType::getProtocol(unsigned i) const { - return cast(this)->getProtocol(i); -} - - - /// ObjCQualifiedIdType - to represent id. /// /// Duplicate protocols are removed and protocol list is canonicalized to be in @@ -1723,15 +1709,9 @@ class ObjCQualifiedIdType : public Type, friend class ASTContext; // ASTContext creates these. public: - ObjCProtocolDecl *getProtocols(unsigned i) const { - return Protocols[i]; - } unsigned getNumProtocols() const { return Protocols.size(); } - ObjCProtocolDecl **getReferencedProtocols() { - return &Protocols[0]; - } typedef llvm::SmallVector::const_iterator qual_iterator; qual_iterator qual_begin() const { return Protocols.begin(); } diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index e85096021b..c168e98ea4 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -2350,10 +2350,10 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, // Only when doing ivar or property encoding. const ObjCQualifiedIdType *QIDT = T->getAsObjCQualifiedIdType(); S += '"'; - for (unsigned i =0; i < QIDT->getNumProtocols(); i++) { - ObjCProtocolDecl *Proto = QIDT->getProtocols(i); + for (ObjCQualifiedIdType::qual_iterator I = QIDT->qual_begin(), + E = QIDT->qual_end(); I != E; ++I) { S += '<'; - S += Proto->getNameAsString(); + S += (*I)->getNameAsString(); S += '>'; } S += '"'; @@ -2416,10 +2416,10 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, ObjCInterfaceDecl *OI = OIT->getDecl(); S += '"'; S += OI->getNameAsCString(); - for (unsigned i =0; i < OIT->getNumProtocols(); i++) { - ObjCProtocolDecl *Proto = OIT->getProtocol(i); + for (ObjCInterfaceType::qual_iterator I = OIT->qual_begin(), + E = OIT->qual_end(); I != E; ++I) { S += '<'; - S += Proto->getNameAsString(); + S += (*I)->getNameAsString(); S += '>'; } S += '"'; diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index fd498d534c..6093352021 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -1531,10 +1531,9 @@ void ObjCQualifiedIdType::getAsStringInternal(std::string &InnerString) const { InnerString = ' ' + InnerString; std::string ObjCQIString = "id"; ObjCQIString += '<'; - int num = getNumProtocols(); - for (int i = 0; i < num; i++) { - ObjCQIString += getProtocols(i)->getNameAsString(); - if (i < num-1) + for (qual_iterator I = qual_begin(), E = qual_end(); I != E; ++I) { + ObjCQIString += (*I)->getNameAsString(); + if (I+1 != E) ObjCQIString += ','; } ObjCQIString += '>'; diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 6769d8c9c2..2d3ca17036 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -218,15 +218,17 @@ PCHTypeWriter::VisitObjCQualifiedInterfaceType( const ObjCQualifiedInterfaceType *T) { VisitObjCInterfaceType(T); Record.push_back(T->getNumProtocols()); - for (unsigned I = 0, N = T->getNumProtocols(); I != N; ++I) - Writer.AddDeclRef(T->getProtocol(I), Record); + for (ObjCInterfaceType::qual_iterator I = T->qual_begin(), + E = T->qual_end(); I != E; ++I) + Writer.AddDeclRef(*I, Record); Code = pch::TYPE_OBJC_QUALIFIED_INTERFACE; } void PCHTypeWriter::VisitObjCQualifiedIdType(const ObjCQualifiedIdType *T) { Record.push_back(T->getNumProtocols()); - for (unsigned I = 0, N = T->getNumProtocols(); I != N; ++I) - Writer.AddDeclRef(T->getProtocols(I), Record); + for (ObjCQualifiedIdType::qual_iterator I = T->qual_begin(), + E = T->qual_end(); I != E; ++I) + Writer.AddDeclRef(*I, Record); Code = pch::TYPE_OBJC_QUALIFIED_ID; } diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 3bee461cf6..eabc87d7f3 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -571,10 +571,11 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, // We allow sending a message to a qualified ID ("id"), which is ok as // long as one of the protocols implements the selector (if not, warn). - if (ObjCQualifiedIdType *QIT = dyn_cast(ReceiverCType)) { + if (ObjCQualifiedIdType *QIdTy = dyn_cast(ReceiverCType)) { // Search protocols for instance methods. - for (unsigned i = 0; i < QIT->getNumProtocols(); i++) { - ObjCProtocolDecl *PDecl = QIT->getProtocols(i); + for (ObjCQualifiedIdType::qual_iterator I = QIdTy->qual_begin(), + E = QIdTy->qual_end(); I != E; ++I) { + ObjCProtocolDecl *PDecl = *I; if (PDecl && (Method = PDecl->lookupInstanceMethod(Context, Sel))) break; // Since we aren't supporting "Class", look for a class method. @@ -750,11 +751,12 @@ bool Sema::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, // make sure we check the class hierarchy. if (const ObjCInterfaceType *IT = rtype->getAsObjCInterfaceType()) { ObjCInterfaceDecl *rhsID = IT->getDecl(); - for (unsigned i = 0; i != lhsQID->getNumProtocols(); ++i) { + for (ObjCQualifiedIdType::qual_iterator I = lhsQID->qual_begin(), + E = lhsQID->qual_end(); I != E; ++I) { // when comparing an id

on lhs with a static type on rhs, // see if static class implements all of id's protocols, directly or // through its super class and categories. - if (!ClassImplementsProtocol(lhsQID->getProtocols(i), rhsID, true)) + if (!ClassImplementsProtocol(*I, rhsID, true)) return false; } return true; @@ -773,8 +775,9 @@ bool Sema::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, return false; } - for (unsigned i =0; i < lhsQID->getNumProtocols(); i++) { - ObjCProtocolDecl *lhsProto = lhsQID->getProtocols(i); + for (ObjCQualifiedIdType::qual_iterator I = lhsQID->qual_begin(), + E = lhsQID->qual_end(); I != E; ++I) { + ObjCProtocolDecl *lhsProto = *I; bool match = false; // when comparing an id

on lhs with a static type on rhs, @@ -793,11 +796,12 @@ bool Sema::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, // make sure we check the class hierarchy. if (const ObjCInterfaceType *IT = rtype->getAsObjCInterfaceType()) { ObjCInterfaceDecl *rhsID = IT->getDecl(); - for (unsigned i = 0; i != lhsQID->getNumProtocols(); ++i) { + for (ObjCQualifiedIdType::qual_iterator I = lhsQID->qual_begin(), + E = lhsQID->qual_end(); I != E; ++I) { // when comparing an id

on lhs with a static type on rhs, // see if static class implements all of id's protocols, directly or // through its super class and categories. - if (ClassImplementsProtocol(lhsQID->getProtocols(i), rhsID, true)) { + if (ClassImplementsProtocol(*I, rhsID, true)) { match = true; break; } @@ -825,8 +829,9 @@ bool Sema::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, for (; LHSProtoI != LHSProtoE; ++LHSProtoI) { bool match = false; ObjCProtocolDecl *lhsProto = *LHSProtoI; - for (unsigned j = 0; j < rhsQID->getNumProtocols(); j++) { - ObjCProtocolDecl *rhsProto = rhsQID->getProtocols(j); + for (ObjCQualifiedIdType::qual_iterator I = rhsQID->qual_begin(), + E = rhsQID->qual_end(); I != E; ++I) { + ObjCProtocolDecl *rhsProto = *I; if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { match = true; @@ -843,9 +848,9 @@ bool Sema::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, // for static type vs. qualified 'id' type, check that class implements // all of 'id's protocols. ObjCInterfaceDecl *lhsID = IT->getDecl(); - for (unsigned j = 0; j < rhsQID->getNumProtocols(); j++) { - ObjCProtocolDecl *rhsProto = rhsQID->getProtocols(j); - if (!ClassImplementsProtocol(rhsProto, lhsID, compare, true)) + for (ObjCQualifiedIdType::qual_iterator I = rhsQID->qual_begin(), + E = rhsQID->qual_end(); I != E; ++I) { + if (!ClassImplementsProtocol(*I, lhsID, compare, true)) return false; } return true; -- 2.40.0