From e538c5f3ae285ad47f0c314cc78c4ccc582f4447 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Thu, 8 Jan 2009 20:15:03 +0000 Subject: [PATCH] Removed ObjCContainerDecl::getPropertyMethods()...doesn't belong in the AST. Moved logic to Sema::ProcessPropertyDecl(). llvm-svn: 61936 --- clang/lib/AST/DeclObjC.cpp | 72 --------------------------------- clang/lib/Sema/SemaDeclObjC.cpp | 54 ++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 73 deletions(-) diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp index 05d7e1149536..2263af7d906f 100644 --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -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. diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 69c45e9a6473..9fb69cb95b10 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -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);