aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/DeclObjC.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2009-01-08 17:28:14 +0000
committerSteve Naroff <snaroff@apple.com>2009-01-08 17:28:14 +0000
commit0701bbb228dfd87e1fe82a0a4b7b9facfecb43da (patch)
tree0e6483e9a1755c00b458662c0cd52c26d132b70e /lib/AST/DeclObjC.cpp
parent7e5d6ed47dcedce35043de59ee00464b681bc786 (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.cpp127
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;