diff options
author | Steve Naroff <snaroff@apple.com> | 2009-01-08 17:28:14 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2009-01-08 17:28:14 +0000 |
commit | 0701bbb228dfd87e1fe82a0a4b7b9facfecb43da (patch) | |
tree | 0e6483e9a1755c00b458662c0cd52c26d132b70e /lib/AST/DeclObjC.cpp | |
parent | 7e5d6ed47dcedce35043de59ee00464b681bc786 (diff) |
This is a large/messy diff that unifies the ObjC AST's with DeclContext.
- ObjCContainerDecl's (ObjCInterfaceDecl/ObjCCategoryDecl/ObjCProtocolDecl), ObjCCategoryImpl, & ObjCImplementation are all DeclContexts.
- ObjCMethodDecl is now a ScopedDecl (so it can play nicely with DeclContext).
- ObjCContainerDecl now does iteration/lookup using DeclContext infrastructure (no more linear search:-)
- Removed ASTContext argument to DeclContext::lookup(). It wasn't being used and complicated it's use from an ObjC AST perspective.
- Added Sema::ProcessPropertyDecl() and removed Sema::diagnosePropertySetterGetterMismatch().
- Simplified Sema::ActOnAtEnd() considerably. Still more work to do.
- Fixed an incorrect casting assumption in Sema::getCurFunctionOrMethodDecl(), now that ObjCMethodDecl is a ScopedDecl.
- Removed addPropertyMethods from ObjCInterfaceDecl/ObjCCategoryDecl/ObjCProtocolDecl.
This passes all the tests on my machine. Since many of the changes are central to the way ObjC finds it's methods, I expect some fallout (and there are still a handful of FIXME's). Nevertheless, this should be a step in the right direction.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61929 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclObjC.cpp')
-rw-r--r-- | lib/AST/DeclObjC.cpp | 127 |
1 files changed, 44 insertions, 83 deletions
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 2bfad5a7be..0b6eff1af5 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -24,7 +24,7 @@ ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, - Decl *contextDecl, + DeclContext *contextDecl, bool isInstance, bool isVariadic, bool isSynthesized, @@ -61,8 +61,6 @@ ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, } ObjCContainerDecl::~ObjCContainerDecl() { - delete [] InstanceMethods; - delete [] ClassMethods; } ObjCInterfaceDecl::~ObjCInterfaceDecl() { @@ -362,7 +360,7 @@ FieldDecl *ObjCInterfaceDecl::lookupFieldDeclForIvar(ASTContext &Context, assert(RecordForDecl && "lookupFieldDeclForIvar no storage for class"); DeclarationName Member = ivar->getDeclName(); DeclContext::lookup_result Lookup = (const_cast< RecordDecl *>(RecordForDecl)) - ->lookup(Context, Member); + ->lookup(Member); assert((Lookup.first != Lookup.second) && "field decl not found"); FieldDecl *MemberDecl = dyn_cast<FieldDecl>(*Lookup.first); assert(MemberDecl && "field decl not found"); @@ -382,27 +380,6 @@ void ObjCImplementationDecl::ObjCAddInstanceVariablesToClassImpl( } } -/// addMethods - Insert instance and methods declarations into -/// ObjCInterfaceDecl's InsMethods and ClsMethods fields. -/// -void ObjCContainerDecl::addMethods(ObjCMethodDecl **insMethods, - unsigned numInsMembers, - ObjCMethodDecl **clsMethods, - unsigned numClsMembers, - SourceLocation endLoc) { - NumInstanceMethods = numInsMembers; - if (numInsMembers) { - InstanceMethods = new ObjCMethodDecl*[numInsMembers]; - memcpy(InstanceMethods, insMethods, numInsMembers*sizeof(ObjCMethodDecl*)); - } - NumClassMethods = numClsMembers; - if (numClsMembers) { - ClassMethods = new ObjCMethodDecl*[numClsMembers]; - memcpy(ClassMethods, clsMethods, numClsMembers*sizeof(ObjCMethodDecl*)); - } - AtEndLoc = endLoc; -} - /// addProperties - Insert property declaration AST nodes into /// ObjCInterfaceDecl's PropertyDecl field. /// @@ -440,18 +417,45 @@ void ObjCInterfaceDecl::mergeProperties(ObjCPropertyDecl **Properties, } } -static void -addPropertyMethods(Decl *D, - ASTContext &Context, - ObjCPropertyDecl *property, - llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods, - llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap) { - ObjCMethodDecl *GetterDecl, *SetterDecl = 0; - - GetterDecl = const_cast<ObjCMethodDecl*>(InsMap[property->getGetterName()]); - if (!property->isReadOnly()) - SetterDecl = const_cast<ObjCMethodDecl*>(InsMap[property->getSetterName()]); - +// Get the local instance method declared in this interface. +// FIXME: handle overloading, instance & class methods can have the same name. +ObjCMethodDecl *ObjCContainerDecl::getInstanceMethod(Selector Sel) const { + lookup_const_result MethodResult = lookup(Sel); + if (MethodResult.first) + return const_cast<ObjCMethodDecl*>( + dyn_cast<ObjCMethodDecl>(*MethodResult.first)); + return 0; +} + +// Get the local class method declared in this interface. +ObjCMethodDecl *ObjCContainerDecl::getClassMethod(Selector Sel) const { + lookup_const_result MethodResult = lookup(Sel); + if (MethodResult.first) + return const_cast<ObjCMethodDecl*>( + dyn_cast<ObjCMethodDecl>(*MethodResult.first)); + return 0; +} + +unsigned ObjCContainerDecl::getNumInstanceMethods() const { + unsigned sum = 0; + for (instmeth_iterator I=instmeth_begin(), E=instmeth_end(); I != E; ++I) + sum++; + return sum; +} +unsigned ObjCContainerDecl::getNumClassMethods() const { + unsigned sum = 0; + for (classmeth_iterator I=classmeth_begin(), E=classmeth_end(); I != E; ++I) + sum++; + return sum; +} + +/// addPropertyMethods - Goes through list of properties declared in this class +/// and builds setter/getter method declartions depending on the setter/getter +/// attributes of the property. +/// +void ObjCContainerDecl::getPropertyMethods( + ASTContext &Context, ObjCPropertyDecl *property, + ObjCMethodDecl *& GetterDecl, ObjCMethodDecl *&SetterDecl) { // 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 @@ -467,15 +471,12 @@ addPropertyMethods(Decl *D, ObjCMethodDecl::Create(Context, property->getLocation(), property->getLocation(), property->getGetterName(), - property->getType(), - D, + property->getType(), this, true, false, true, (property->getPropertyImplementation() == ObjCPropertyDecl::Optional) ? ObjCMethodDecl::Optional : ObjCMethodDecl::Required); - insMethods.push_back(GetterDecl); - InsMap[property->getGetterName()] = GetterDecl; } else // A user declared getter will be synthesize when @synthesize of @@ -496,15 +497,12 @@ addPropertyMethods(Decl *D, ObjCMethodDecl::Create(Context, property->getLocation(), property->getLocation(), property->getSetterName(), - Context.VoidTy, - D, + Context.VoidTy, this, true, false, true, (property->getPropertyImplementation() == ObjCPropertyDecl::Optional) ? ObjCMethodDecl::Optional : 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, @@ -523,30 +521,6 @@ addPropertyMethods(Decl *D, property->setSetterMethodDecl(SetterDecl); } -/// addPropertyMethods - Goes through list of properties declared in this class -/// and builds setter/getter method declartions depending on the setter/getter -/// attributes of the property. -/// -void ObjCInterfaceDecl::addPropertyMethods( - ASTContext &Context, - ObjCPropertyDecl *property, - 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 -/// and builds setter/getter method declartions depending on the setter/getter -/// attributes of the property. -/// -void ObjCCategoryDecl::addPropertyMethods( - ASTContext &Context, - ObjCPropertyDecl *property, - llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods, - llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap) { - ::addPropertyMethods(this, Context, property, insMethods, InsMap); -} - /// mergeProperties - Adds properties to the end of list of current properties /// for this category. @@ -572,18 +546,6 @@ void ObjCCategoryDecl::mergeProperties(ObjCPropertyDecl **Properties, } } -/// addPropertyMethods - Goes through list of properties declared in this class -/// and builds setter/getter method declartions depending on the setter/getter -/// attributes of the property. -/// -void ObjCProtocolDecl::addPropertyMethods( - ASTContext &Context, - ObjCPropertyDecl *property, - llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods, - llvm::DenseMap<Selector, const ObjCMethodDecl*> &InsMap) { - ::addPropertyMethods(this, Context, property, insMethods, InsMap); -} - /// addProperties - Insert property declaration AST nodes into /// ObjCProtocolDecl's PropertyDecl field. /// @@ -850,9 +812,8 @@ unsigned ObjCMethodDecl::getSynthesizedMethodSize() const { // Get length of this name. unsigned length = 3; // _I_ or _C_ length += getClassInterface()->getNameAsString().size()+1; // extra for _ - NamedDecl *MethodContext = getMethodContext(); if (ObjCCategoryImplDecl *CID = - dyn_cast<ObjCCategoryImplDecl>(MethodContext)) + dyn_cast<ObjCCategoryImplDecl>(getMethodContext())) length += CID->getNameAsString().size()+1; length += getSelector().getAsString().size(); // selector name return length; |