diff options
-rw-r--r-- | include/clang/AST/DeclObjC.h | 10 | ||||
-rw-r--r-- | lib/AST/DeclObjC.cpp | 42 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 6 |
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); } |