forked from OSchip/llvm-project
Refactored checking on readonly property into a method.
llvm-svn: 60050
This commit is contained in:
parent
e9eeb0d562
commit
829b908b74
|
@ -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();}
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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?
|
||||
|
|
Loading…
Reference in New Issue