Add addPropertyMethods implementations for

ObjC{Category,Protocol}Decl.
 - No functionality change.

llvm-svn: 55404
This commit is contained in:
Daniel Dunbar 2008-08-27 02:09:39 +00:00
parent 912c28444f
commit e7ecbc539e
2 changed files with 65 additions and 12 deletions

View File

@ -626,6 +626,10 @@ public:
void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
void addPropertyMethods(ASTContext &Context,
ObjCPropertyDecl* Property,
llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods);
typedef ObjCPropertyDecl * const * classprop_iterator; typedef ObjCPropertyDecl * const * classprop_iterator;
classprop_iterator classprop_begin() const { return PropertyDecl; } classprop_iterator classprop_begin() const { return PropertyDecl; }
classprop_iterator classprop_end() const { classprop_iterator classprop_end() const {
@ -863,6 +867,10 @@ public:
void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
void addPropertyMethods(ASTContext &Context,
ObjCPropertyDecl* Property,
llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods);
ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const; ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const;
typedef ObjCPropertyDecl * const * classprop_iterator; typedef ObjCPropertyDecl * const * classprop_iterator;

View File

@ -402,14 +402,28 @@ void ObjCInterfaceDecl::mergeProperties(ObjCPropertyDecl **Properties,
} }
} }
/// addPropertyMethods - Goes through list of properties declared in this class static void
/// and builds setter/getter method declartions depending on the setter/getter addPropertyMethods(Decl *D,
/// attributes of the property.
///
void ObjCInterfaceDecl::addPropertyMethods(
ASTContext &Context, ASTContext &Context,
ObjCPropertyDecl *property, ObjCPropertyDecl *property,
llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) { llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) {
ObjCMethodDecl *GetterDecl, *SetterDecl;
if (ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(D)) {
GetterDecl = OID->getInstanceMethod(property->getGetterName());
if (!property->isReadOnly())
SetterDecl = OID->getInstanceMethod(property->getSetterName());
} else if (ObjCCategoryDecl *OCD = dyn_cast<ObjCCategoryDecl>(D)) {
GetterDecl = OCD->getInstanceMethod(property->getGetterName());
if (!property->isReadOnly())
SetterDecl = OCD->getInstanceMethod(property->getSetterName());
} else {
ObjCProtocolDecl *OPD = cast<ObjCProtocolDecl>(D);
GetterDecl = OPD->getInstanceMethod(property->getGetterName());
if (!property->isReadOnly())
SetterDecl = OPD->getInstanceMethod(property->getSetterName());
}
// FIXME: The synthesized property we set here is misleading. We // FIXME: The synthesized property we set here is misleading. We
// almost always synthesize these methods unless the user explicitly // almost always synthesize these methods unless the user explicitly
// provided prototypes (which is odd, but allowed). Sema should be // provided prototypes (which is odd, but allowed). Sema should be
@ -417,7 +431,6 @@ void ObjCInterfaceDecl::addPropertyMethods(
// it is not currently). // it is not currently).
// Find the default getter and if one not found, add one. // Find the default getter and if one not found, add one.
ObjCMethodDecl *GetterDecl = getInstanceMethod(property->getGetterName());
if (!GetterDecl) { if (!GetterDecl) {
// No instance method of same name as property getter name was found. // No instance method of same name as property getter name was found.
// Declare a getter method and add it to the list of methods // Declare a getter method and add it to the list of methods
@ -427,7 +440,7 @@ void ObjCInterfaceDecl::addPropertyMethods(
property->getLocation(), property->getLocation(),
property->getGetterName(), property->getGetterName(),
property->getType(), property->getType(),
this, D,
true, false, true, ObjCMethodDecl::Required); true, false, true, ObjCMethodDecl::Required);
insMethods.push_back(GetterDecl); insMethods.push_back(GetterDecl);
} }
@ -438,7 +451,6 @@ void ObjCInterfaceDecl::addPropertyMethods(
return; return;
// Find the default setter and if one not found, add one. // Find the default setter and if one not found, add one.
ObjCMethodDecl *SetterDecl = getInstanceMethod(property->getSetterName());
if (!SetterDecl) { if (!SetterDecl) {
// No instance method of same name as property setter name was found. // No instance method of same name as property setter name was found.
// Declare a setter method and add it to the list of methods // Declare a setter method and add it to the list of methods
@ -448,7 +460,7 @@ void ObjCInterfaceDecl::addPropertyMethods(
property->getLocation(), property->getLocation(),
property->getSetterName(), property->getSetterName(),
Context.VoidTy, Context.VoidTy,
this, D,
true, false, true, ObjCMethodDecl::Required); true, false, true, ObjCMethodDecl::Required);
insMethods.push_back(SetterDecl); insMethods.push_back(SetterDecl);
@ -466,6 +478,39 @@ void ObjCInterfaceDecl::addPropertyMethods(
property->setSetterMethodDecl(SetterDecl); property->setSetterMethodDecl(SetterDecl);
} }
/// addPropertyMethods - Goes through list of properties declared in this class
/// and builds setter/getter method declartions depending on the setter/getter
/// attributes of the property.
///
void ObjCInterfaceDecl::addPropertyMethods(
ASTContext &Context,
ObjCPropertyDecl *property,
llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) {
::addPropertyMethods(this, Context, property, insMethods);
}
/// addPropertyMethods - Goes through list of properties declared in this class
/// and builds setter/getter method declartions depending on the setter/getter
/// attributes of the property.
///
void ObjCCategoryDecl::addPropertyMethods(
ASTContext &Context,
ObjCPropertyDecl *property,
llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) {
::addPropertyMethods(this, Context, property, insMethods);
}
/// addPropertyMethods - Goes through list of properties declared in this class
/// and builds setter/getter method declartions depending on the setter/getter
/// attributes of the property.
///
void ObjCProtocolDecl::addPropertyMethods(
ASTContext &Context,
ObjCPropertyDecl *property,
llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) {
::addPropertyMethods(this, Context, property, insMethods);
}
/// addProperties - Insert property declaration AST nodes into /// addProperties - Insert property declaration AST nodes into
/// ObjCProtocolDecl's PropertyDecl field. /// ObjCProtocolDecl's PropertyDecl field.
/// ///