Removed ObjCContainerDecl::getPropertyMethods()...doesn't belong in the AST.

Moved logic to Sema::ProcessPropertyDecl().

llvm-svn: 61936
This commit is contained in:
Steve Naroff 2009-01-08 20:15:03 +00:00
parent 11b387fee0
commit e538c5f3ae
2 changed files with 53 additions and 73 deletions

View File

@ -449,78 +449,6 @@ unsigned ObjCContainerDecl::getNumClassMethods() const {
return sum;
}
/// 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 ObjCContainerDecl::getPropertyMethods(
ASTContext &Context, ObjCPropertyDecl *property,
ObjCMethodDecl *& GetterDecl, ObjCMethodDecl *&SetterDecl) {
// FIXME: The synthesized property we set here is misleading. We
// almost always synthesize these methods unless the user explicitly
// provided prototypes (which is odd, but allowed). Sema should be
// typechecking that the declarations jive in that situation (which
// it is not currently).
// Find the default getter and if one not found, add one.
if (!GetterDecl) {
// No instance method of same name as property getter name was found.
// Declare a getter method and add it to the list of methods
// for this class.
GetterDecl =
ObjCMethodDecl::Create(Context, property->getLocation(),
property->getLocation(),
property->getGetterName(),
property->getType(), this,
true, false, true,
(property->getPropertyImplementation() ==
ObjCPropertyDecl::Optional) ?
ObjCMethodDecl::Optional :
ObjCMethodDecl::Required);
}
else
// A user declared getter will be synthesize when @synthesize of
// the property with the same name is seen in the @implementation
GetterDecl->setIsSynthesized();
property->setGetterMethodDecl(GetterDecl);
// Skip setter if property is read-only.
if (property->isReadOnly())
return;
// Find the default setter and if one not found, add one.
if (!SetterDecl) {
// No instance method of same name as property setter name was found.
// Declare a setter method and add it to the list of methods
// for this class.
SetterDecl =
ObjCMethodDecl::Create(Context, property->getLocation(),
property->getLocation(),
property->getSetterName(),
Context.VoidTy, this,
true, false, true,
(property->getPropertyImplementation() ==
ObjCPropertyDecl::Optional) ?
ObjCMethodDecl::Optional :
ObjCMethodDecl::Required);
// Invent the arguments for the setter. We don't bother making a
// nice name for the argument.
ParmVarDecl *Argument = ParmVarDecl::Create(Context,
SetterDecl,
SourceLocation(),
property->getIdentifier(),
property->getType(),
VarDecl::None,
0, 0);
SetterDecl->setMethodParams(&Argument, 1);
}
else
// A user declared setter will be synthesize when @synthesize of
// the property with the same name is seen in the @implementation
SetterDecl->setIsSynthesized();
property->setSetterMethodDecl(SetterDecl);
}
/// mergeProperties - Adds properties to the end of list of current properties
/// for this category.

View File

@ -1037,6 +1037,54 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
}
// Synthesize getter/setter methods if none exist.
// Find the default getter and if one not found, add one.
if (!GetterMethod) {
// No instance method of same name as property getter name was found.
// Declare a getter method and add it to the list of methods
// for this class.
GetterMethod = ObjCMethodDecl::Create(Context, property->getLocation(),
property->getLocation(), property->getGetterName(),
property->getType(), CD, true, false, true,
(property->getPropertyImplementation() ==
ObjCPropertyDecl::Optional) ?
ObjCMethodDecl::Optional :
ObjCMethodDecl::Required);
} else
// A user declared getter will be synthesize when @synthesize of
// the property with the same name is seen in the @implementation
GetterMethod->setIsSynthesized();
property->setGetterMethodDecl(GetterMethod);
// Skip setter if property is read-only.
if (!property->isReadOnly()) {
// Find the default setter and if one not found, add one.
if (!SetterMethod) {
// No instance method of same name as property setter name was found.
// Declare a setter method and add it to the list of methods
// for this class.
SetterMethod = ObjCMethodDecl::Create(Context, property->getLocation(),
property->getLocation(),
property->getSetterName(),
Context.VoidTy, CD, true, false, true,
(property->getPropertyImplementation() ==
ObjCPropertyDecl::Optional) ?
ObjCMethodDecl::Optional :
ObjCMethodDecl::Required);
// Invent the arguments for the setter. We don't bother making a
// nice name for the argument.
ParmVarDecl *Argument = ParmVarDecl::Create(Context, SetterMethod,
SourceLocation(),
property->getIdentifier(),
property->getType(),
VarDecl::None,
0, 0);
SetterMethod->setMethodParams(&Argument, 1);
} else
// A user declared setter will be synthesize when @synthesize of
// the property with the same name is seen in the @implementation
SetterMethod->setIsSynthesized();
property->setSetterMethodDecl(SetterMethod);
}
// Add any synthesized methods to the global pool. This allows us to
// handle the following, which is supported by GCC (and part of the design).
//
@ -1049,7 +1097,11 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
// double bar = [foo bar];
// }
//
CD->getPropertyMethods(Context, property, GetterMethod, SetterMethod);
// FIXME: The synthesized property we set here is misleading. We
// almost always synthesize these methods unless the user explicitly
// provided prototypes (which is odd, but allowed). Sema should be
// typechecking that the declarations jive in that situation (which
// it is not currently).
if (GetterMethod) {
CD->addDecl(Context, GetterMethod);
AddInstanceMethodToGlobalPool(GetterMethod);