aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
}