aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2008-12-02 00:19:12 +0000
committerFariborz Jahanian <fjahanian@apple.com>2008-12-02 00:19:12 +0000
commitb85cce6498c8c1c20f701571d85a3b2fe53338eb (patch)
tree6fb5fa22255c996c9882554e3bf2016313432600
parentadcac8824a9cff13f1ef61a69e38c1041cba12ee (diff)
This patch corrects problem in searching for a setter/getter method for
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
-rw-r--r--include/clang/AST/DeclObjC.h10
-rw-r--r--lib/AST/DeclObjC.cpp42
-rw-r--r--lib/Sema/SemaDeclObjC.cpp6
3 files changed, 28 insertions, 30 deletions
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index 43750c4474..19fd11d1da 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -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;
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index e631bac452..a313acf200 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -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
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index b9fc5b719a..3a78024f90 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -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);
}