Refactored checking on readonly property into a method.

llvm-svn: 60050
This commit is contained in:
Fariborz Jahanian 2008-11-25 21:48:26 +00:00
parent e9eeb0d562
commit 829b908b74
3 changed files with 28 additions and 18 deletions

View File

@ -339,6 +339,7 @@ public:
ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const;
ObjCCategoryDecl *FindCategoryDeclaration(IdentifierInfo *CategoryId) const;
ObjCIvarDecl *FindIvarDeclaration(IdentifierInfo *IvarId) const;
bool isPropertyReadonly(ObjCPropertyDecl *PropertyDecl) const;
typedef ObjCList<ObjCProtocolDecl>::iterator protocol_iterator;
protocol_iterator protocol_begin() const {return ReferencedProtocols.begin();}

View File

@ -257,6 +257,26 @@ void ObjCMethodDecl::setMethodParams(ParmVarDecl **NewParamInfo,
}
}
/// isPropertyReadonly - Return true if property is a readonly, by seaching
/// for the property in the class and in its categories.
///
bool ObjCInterfaceDecl::isPropertyReadonly(ObjCPropertyDecl *PDecl) const
{
if (PDecl->isReadOnly()) {
// Main class has the property as 'readyonly'. Must search
// through the category list to see if the property's
// attribute has been over-ridden to 'readwrite'.
for (ObjCCategoryDecl *Category = getCategoryList();
Category; Category = Category->getNextClassCategory()) {
PDecl= Category->FindPropertyDeclaration(PDecl->getIdentifier());
if (PDecl && !PDecl->isReadOnly())
return false;
}
return true;
}
return false;
}
/// FindPropertyDeclaration - Finds declaration of the property given its name
/// in 'PropertyId' and returns it. It returns 0, if not found.
///

View File

@ -551,24 +551,13 @@ Expr::isModifiableLvalueResult Expr::isModifiableLvalue(ASTContext &Ctx) const {
if (getStmtClass() == ObjCPropertyRefExprClass) {
const ObjCPropertyRefExpr* PropExpr = cast<ObjCPropertyRefExpr>(this);
if (ObjCPropertyDecl *PDecl = PropExpr->getProperty()) {
if (PDecl->isReadOnly()) {
// Main class has the property as 'readyonly'. Must search
// through the category list to see if the property's
// attribute has been over-ridden to 'readwrite'.
const Expr *BaseExpr = PropExpr->getBase();
QualType BaseType = BaseExpr->getType();
const PointerType *PTy = BaseType->getAsPointerType();
const ObjCInterfaceType *IFTy =
PTy->getPointeeType()->getAsObjCInterfaceType();
ObjCInterfaceDecl *IFace = IFTy->getDecl();
for (ObjCCategoryDecl *Category = IFace->getCategoryList();
Category; Category = Category->getNextClassCategory()) {
PDecl= Category->FindPropertyDeclaration(PDecl->getIdentifier());
if (PDecl && !PDecl->isReadOnly())
return MLV_Valid;
}
return MLV_ReadonlyProperty;
}
QualType BaseType = PropExpr->getBase()->getType();
if (const PointerType *PTy = BaseType->getAsPointerType())
if (const ObjCInterfaceType *IFTy =
PTy->getPointeeType()->getAsObjCInterfaceType())
if (ObjCInterfaceDecl *IFace = IFTy->getDecl())
if (IFace->isPropertyReadonly(PDecl))
return MLV_ReadonlyProperty;
}
}
// Assigning to an 'implicit' property?