eliminate getReferencedProtocols from

ObjCQualifiedIdType/ObjCQualifiedInterfaceType, adding an interator 
interface instead.

llvm-svn: 49308
This commit is contained in:
Chris Lattner 2008-04-07 04:44:08 +00:00
parent f96084ee73
commit bd7981a978
2 changed files with 49 additions and 45 deletions

View File

@ -1087,7 +1087,7 @@ class ObjCQualifiedInterfaceType : public ObjCInterfaceType,
llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols;
ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D,
ObjCProtocolDecl **Protos, unsigned NumP) :
ObjCProtocolDecl **Protos, unsigned NumP) :
ObjCInterfaceType(ObjCQualifiedInterface, D),
Protocols(Protos, Protos+NumP) { }
friend class ASTContext; // ASTContext creates these.
@ -1099,9 +1099,11 @@ public:
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(); }
qual_iterator qual_end() const { return Protocols.end(); }
virtual void getAsStringInternal(std::string &InnerString) const;
void Profile(llvm::FoldingSetNodeID &ID);
@ -1135,7 +1137,11 @@ public:
}
ObjCProtocolDecl **getReferencedProtocols() {
return &Protocols[0];
}
}
typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator;
qual_iterator qual_begin() const { return Protocols.begin(); }
qual_iterator qual_end() const { return Protocols.end(); }
virtual void getAsStringInternal(std::string &InnerString) const;

View File

@ -811,9 +811,8 @@ QualType ASTContext::getObjCInterfaceType(ObjCInterfaceDecl *Decl) {
return QualType(Decl->TypeForDecl, 0);
}
/// getObjCQualifiedInterfaceType - Return a
/// ObjCQualifiedInterfaceType type for the given interface decl and
/// the conforming protocol list.
/// getObjCQualifiedInterfaceType - Return a ObjCQualifiedInterfaceType type for
/// the given interface decl and the conforming protocol list.
QualType ASTContext::getObjCQualifiedInterfaceType(ObjCInterfaceDecl *Decl,
ObjCProtocolDecl **Protocols, unsigned NumProtocols) {
llvm::FoldingSetNodeID ID;
@ -1443,6 +1442,9 @@ bool ASTContext::objcTypesAreCompatible(QualType LHS, QualType RHS) {
return false;
}
/// areCompatObjCQualInterfaces - Return true if the two qualified interface
/// types are compatible for assignment from RHS to LHS.
///
static bool
areCompatObjCQualInterfaces(const ObjCQualifiedInterfaceType *LHS,
const ObjCQualifiedInterfaceType *RHS) {
@ -1525,13 +1527,10 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
QualType PointeeTy = PT->getPointeeType();
if (isObjCIdType(PointeeTy) || PointeeTy->isVoidType())
return true;
}
else if (const PointerType *PT = rhs->getAsPointerType()) {
} else if (const PointerType *PT = rhs->getAsPointerType()) {
QualType PointeeTy = PT->getPointeeType();
if (isObjCIdType(PointeeTy) || PointeeTy->isVoidType())
return true;
}
ObjCQualifiedInterfaceType *lhsQI = 0;
@ -1558,15 +1557,13 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
if (!rhsQI && !rhsQID && !rhsID)
return false;
unsigned numRhsProtocols = 0;
ObjCProtocolDecl **rhsProtoList = 0;
ObjCQualifiedIdType::qual_iterator RHSProtoI, RHSProtoE;
if (rhsQI) {
numRhsProtocols = rhsQI->getNumProtocols();
rhsProtoList = rhsQI->getReferencedProtocols();
}
else if (rhsQID) {
numRhsProtocols = rhsQID->getNumProtocols();
rhsProtoList = rhsQID->getReferencedProtocols();
RHSProtoI = rhsQI->qual_begin();
RHSProtoE = rhsQI->qual_end();
} else if (rhsQID) {
RHSProtoI = rhsQID->qual_begin();
RHSProtoE = rhsQID->qual_end();
}
for (unsigned i =0; i < lhsQID->getNumProtocols(); i++) {
@ -1579,13 +1576,14 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
if (rhsID) {
if (ClassImplementsProtocol(lhsProto, rhsID, true))
match = true;
}
else for (unsigned j = 0; j < numRhsProtocols; j++) {
ObjCProtocolDecl *rhsProto = rhsProtoList[j];
if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto)) {
match = true;
break;
} else {
for (; RHSProtoI != RHSProtoE; ++RHSProtoI) {
ObjCProtocolDecl *rhsProto = *RHSProtoI;
if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto)) {
match = true;
break;
}
}
}
if (!match)
@ -1609,16 +1607,15 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
if (!lhsQI && !lhsQID && !lhsID)
return false;
unsigned numLhsProtocols = 0;
ObjCProtocolDecl **lhsProtoList = 0;
ObjCQualifiedIdType::qual_iterator LHSProtoI, LHSProtoE;
if (lhsQI) {
numLhsProtocols = lhsQI->getNumProtocols();
lhsProtoList = lhsQI->getReferencedProtocols();
LHSProtoI = lhsQI->qual_begin();
LHSProtoE = lhsQI->qual_end();
} else if (lhsQID) {
LHSProtoI = lhsQID->qual_begin();
LHSProtoE = lhsQID->qual_end();
}
else if (lhsQID) {
numLhsProtocols = lhsQID->getNumProtocols();
lhsProtoList = lhsQID->getReferencedProtocols();
}
bool match = false;
// for static type vs. qualified 'id' type, check that class implements
// one of 'id's protocols.
@ -1630,16 +1627,17 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
break;
}
}
}
else for (unsigned i =0; i < numLhsProtocols; i++) {
match = false;
ObjCProtocolDecl *lhsProto = lhsProtoList[i];
for (unsigned j = 0; j < rhsQID->getNumProtocols(); j++) {
ObjCProtocolDecl *rhsProto = rhsQID->getProtocols(j);
if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto)) {
match = true;
break;
} else {
for (; LHSProtoI != LHSProtoE; ++LHSProtoI) {
match = false;
ObjCProtocolDecl *lhsProto = *LHSProtoI;
for (unsigned j = 0; j < rhsQID->getNumProtocols(); j++) {
ObjCProtocolDecl *rhsProto = rhsQID->getProtocols(j);
if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto)) {
match = true;
break;
}
}
}
}