]> granicus.if.org Git - clang/commitdiff
This patch corrects problem in searching for a setter/getter method for
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 2 Dec 2008 00:19:12 +0000 (00:19 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 2 Dec 2008 00:19:12 +0000 (00:19 +0000)
a property. Previous scheme of seaching in interface's list of methods
would not work because this list is not yet constructed. This is in preparation
for doing semantic check on viability of setter/getter method declarations.

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

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

index 43750c4474f705b9047831eb99e6b0697bf7aefd..19fd11d1da254fd1a4a15300bb4d834d1c25c7ea 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "clang/AST/Decl.h"
 #include "clang/Basic/IdentifierTable.h"
+#include "llvm/ADT/DenseMap.h"
 
 namespace clang {
 class Expr;
@@ -385,7 +386,8 @@ public:
   
   void addPropertyMethods(ASTContext &Context,
                           ObjCPropertyDecl* Property,
-                          llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods);
+                          llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods,
+                          llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap);
   
   typedef ObjCPropertyDecl * const * classprop_iterator;
   classprop_iterator classprop_begin() const { return PropertyDecl; }
@@ -641,7 +643,8 @@ public:
 
   void addPropertyMethods(ASTContext &Context,
                           ObjCPropertyDecl* Property,
-                          llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods);
+                          llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods,
+                          llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap);
   
   typedef ObjCPropertyDecl * const * classprop_iterator;
   classprop_iterator classprop_begin() const { return PropertyDecl; }
@@ -882,7 +885,8 @@ public:
 
   void addPropertyMethods(ASTContext &Context,
                           ObjCPropertyDecl* Property,
-                          llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods);
+                          llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods,
+                          llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap);
   
   ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const;
   
index e631bac452e2054ecb3ab93329053c09082eb263..a313acf20078b83c82ff99ff8b17fe5e24c482e0 100644 (file)
@@ -426,24 +426,14 @@ static void
 addPropertyMethods(Decl *D,
                    ASTContext &Context,
                    ObjCPropertyDecl *property,
-                   llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) {
+                   llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods,
+                   llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap) {
   ObjCMethodDecl *GetterDecl, *SetterDecl = 0;
-
-  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());
-  }
-
+  
+  GetterDecl = const_cast<ObjCMethodDecl*>(InsMap[property->getGetterName()]);
+  if (!property->isReadOnly())
+    SetterDecl = const_cast<ObjCMethodDecl*>(InsMap[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
@@ -463,6 +453,7 @@ addPropertyMethods(Decl *D,
                              D,
                              true, false, true, ObjCMethodDecl::Required);
     insMethods.push_back(GetterDecl);
+    InsMap[property->getGetterName()] = GetterDecl;
   }
   property->setGetterMethodDecl(GetterDecl);
 
@@ -483,7 +474,7 @@ addPropertyMethods(Decl *D,
                              D,
                              true, false, true, ObjCMethodDecl::Required);
     insMethods.push_back(SetterDecl);
-
+    InsMap[property->getSetterName()] = SetterDecl;
     // Invent the arguments for the setter. We don't bother making a
     // nice name for the argument.
     ParmVarDecl *Argument = ParmVarDecl::Create(Context, 
@@ -505,8 +496,9 @@ addPropertyMethods(Decl *D,
 void ObjCInterfaceDecl::addPropertyMethods(
        ASTContext &Context,
        ObjCPropertyDecl *property,
-       llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) {
-  ::addPropertyMethods(this, Context, property, insMethods);
+       llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods,
+       llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap) {
+  ::addPropertyMethods(this, Context, property, insMethods, InsMap);
 }
 
 /// addPropertyMethods - Goes through list of properties declared in this class
@@ -516,8 +508,9 @@ void ObjCInterfaceDecl::addPropertyMethods(
 void ObjCCategoryDecl::addPropertyMethods(
        ASTContext &Context,
        ObjCPropertyDecl *property,
-       llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) {
-  ::addPropertyMethods(this, Context, property, insMethods);
+       llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods, 
+       llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap) {
+  ::addPropertyMethods(this, Context, property, insMethods, InsMap);
 }
 
 /// addPropertyMethods - Goes through list of properties declared in this class
@@ -527,8 +520,9 @@ void ObjCCategoryDecl::addPropertyMethods(
 void ObjCProtocolDecl::addPropertyMethods(
        ASTContext &Context,
        ObjCPropertyDecl *property,
-       llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods) {
-  ::addPropertyMethods(this, Context, property, insMethods);
+       llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods,
+       llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap) {
+  ::addPropertyMethods(this, Context, property, insMethods, InsMap);
 }
 
 /// addProperties - Insert property declaration AST nodes into
index b9fc5b719a21fd2aa9b4cfacc6e4b26df17301d2..3a78024f90da692e67dc480382dc052f64bc85db 100644 (file)
@@ -941,14 +941,14 @@ void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl,
     MergeProtocolPropertiesIntoClass(I, I);
     for (ObjCInterfaceDecl::classprop_iterator i = I->classprop_begin(),
            e = I->classprop_end(); i != e; ++i)
-      I->addPropertyMethods(Context, *i, insMethods);
+      I->addPropertyMethods(Context, *i, insMethods, InsMap);
     I->addMethods(&insMethods[0], insMethods.size(),
                   &clsMethods[0], clsMethods.size(), AtEndLoc);
     
   } else if (ObjCProtocolDecl *P = dyn_cast<ObjCProtocolDecl>(ClassDecl)) {
     for (ObjCProtocolDecl::classprop_iterator i = P->classprop_begin(),
            e = P->classprop_end(); i != e; ++i)
-      P->addPropertyMethods(Context, *i, insMethods);
+      P->addPropertyMethods(Context, *i, insMethods, InsMap);
     P->addMethods(&insMethods[0], insMethods.size(),
                   &clsMethods[0], clsMethods.size(), AtEndLoc);
   }
@@ -959,7 +959,7 @@ void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl,
     // merge them into category as well?
     for (ObjCCategoryDecl::classprop_iterator i = C->classprop_begin(),
            e = C->classprop_end(); i != e; ++i)
-      C->addPropertyMethods(Context, *i, insMethods);
+      C->addPropertyMethods(Context, *i, insMethods, InsMap);
     C->addMethods(&insMethods[0], insMethods.size(),
                   &clsMethods[0], clsMethods.size(), AtEndLoc);
   }