]> granicus.if.org Git - clang/commitdiff
Add addPropertyMethods implementations for
authorDaniel Dunbar <daniel@zuster.org>
Wed, 27 Aug 2008 02:09:39 +0000 (02:09 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 27 Aug 2008 02:09:39 +0000 (02:09 +0000)
ObjC{Category,Protocol}Decl.
 - No functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55404 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclObjC.h
lib/AST/DeclObjC.cpp

index df95847124160e69cf6a8a84fcf32405d71d1752..260acc7e40068546b941e1205759cbaefdb32fb4 100644 (file)
@@ -625,6 +625,10 @@ public:
   ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; }
   
   void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
+
+  void addPropertyMethods(ASTContext &Context,
+                          ObjCPropertyDecl* Property,
+                          llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods);
   
   typedef ObjCPropertyDecl * const * classprop_iterator;
   classprop_iterator classprop_begin() const { return PropertyDecl; }
@@ -862,6 +866,10 @@ public:
   ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; }
   
   void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
+
+  void addPropertyMethods(ASTContext &Context,
+                          ObjCPropertyDecl* Property,
+                          llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods);
   
   ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const;
   
index e74e21dbbca2555695b64b885dfaeef3fb940356..8fb4406eff1114f9b8f7505360b88277ffb8e79b 100644 (file)
@@ -402,14 +402,28 @@ void ObjCInterfaceDecl::mergeProperties(ObjCPropertyDecl **Properties,
   }
 }
 
-/// 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) {
+static void 
+addPropertyMethods(Decl *D,
+                   ASTContext &Context,
+                   ObjCPropertyDecl *property,
+                   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
   // almost always synthesize these methods unless the user explicitly
   // provided prototypes (which is odd, but allowed). Sema should be
@@ -417,7 +431,6 @@ void ObjCInterfaceDecl::addPropertyMethods(
   // it is not currently).
 
   // Find the default getter and if one not found, add one.
-  ObjCMethodDecl *GetterDecl = getInstanceMethod(property->getGetterName());
   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 
@@ -427,7 +440,7 @@ void ObjCInterfaceDecl::addPropertyMethods(
                              property->getLocation(), 
                              property->getGetterName(), 
                              property->getType(),
-                             this,
+                             D,
                              true, false, true, ObjCMethodDecl::Required);
     insMethods.push_back(GetterDecl);
   }
@@ -438,7 +451,6 @@ void ObjCInterfaceDecl::addPropertyMethods(
     return;
 
   // Find the default setter and if one not found, add one.
-  ObjCMethodDecl *SetterDecl = getInstanceMethod(property->getSetterName());
   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 
@@ -448,7 +460,7 @@ void ObjCInterfaceDecl::addPropertyMethods(
                              property->getLocation(), 
                              property->getSetterName(), 
                              Context.VoidTy,
-                             this,
+                             D,
                              true, false, true, ObjCMethodDecl::Required);
     insMethods.push_back(SetterDecl);
 
@@ -466,6 +478,39 @@ void ObjCInterfaceDecl::addPropertyMethods(
   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
 /// ObjCProtocolDecl's PropertyDecl field.
 ///