aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/AST/DeclObjC.cpp42
-rw-r--r--lib/Sema/SemaDeclObjC.cpp6
2 files changed, 21 insertions, 27 deletions
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);
}