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.

llvm-svn: 72475
This commit is contained in:
Steve Naroff 2009-05-27 16:21:00 +00:00
parent 98cee2fde0
commit 4fc95aa0d4
5 changed files with 34 additions and 48 deletions

View File

@ -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<ObjCQualifiedInterfaceType>(this)->getProtocol(i);
}
/// ObjCQualifiedIdType - to represent id<protocol-list>.
///
/// 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<ObjCProtocolDecl*, 8>::const_iterator qual_iterator;
qual_iterator qual_begin() const { return Protocols.begin(); }

View File

@ -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 += '"';

View File

@ -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 += '>';

View File

@ -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;
}

View File

@ -571,10 +571,11 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel,
// We allow sending a message to a qualified ID ("id<foo>"), which is ok as
// long as one of the protocols implements the selector (if not, warn).
if (ObjCQualifiedIdType *QIT = dyn_cast<ObjCQualifiedIdType>(ReceiverCType)) {
if (ObjCQualifiedIdType *QIdTy = dyn_cast<ObjCQualifiedIdType>(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<foo>", 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<P> 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<P> 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<P> 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;