aboutsummaryrefslogtreecommitdiff
path: root/lib/AST
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2009-01-09 15:36:25 +0000
committerSteve Naroff <snaroff@apple.com>2009-01-09 15:36:25 +0000
commit09c4719788a5cea09897525e528fa00420f1677b (patch)
treeb10b6b07b9f1b390eb9fea9f6ff1050079b9afb8 /lib/AST
parent1fd80116b49782c367ff5d5f50a8b76dd8a5d7f7 (diff)
Move property API's up to ObjCContainerDecl (removing a lot of duplicate code).
Add isa/cast/dyncast support for ObjCContainerDecl. Renamed classprop_iterator/begin/end to prop_iterator/begin/end (the class prefix was confusing). More simplifications to Sema::ActOnAtEnd()... Added/changed some FIXME's as a result of the above work. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61988 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST')
-rw-r--r--lib/AST/DeclBase.cpp1
-rw-r--r--lib/AST/DeclObjC.cpp129
-rw-r--r--lib/AST/TranslationUnit.cpp8
3 files changed, 32 insertions, 106 deletions
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp
index 83f8fa411f..f1ce3f3d0d 100644
--- a/lib/AST/DeclBase.cpp
+++ b/lib/AST/DeclBase.cpp
@@ -224,6 +224,7 @@ void Decl::addDeclKind(Kind k) {
case Field: nFieldDecls++; break;
case Record: nSUC++; break;
case Enum: nEnumDecls++; break;
+ case ObjCContainer: break; // is abstract...no need to account for.
case ObjCInterface: nInterfaceDecls++; break;
case ObjCClass: nClassDecls++; break;
case ObjCMethod: nMethodDecls++; break;
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index cf3bd0abea..7e62fa1130 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -62,11 +62,11 @@ ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C,
}
ObjCContainerDecl::~ObjCContainerDecl() {
+ delete [] PropertyDecl;
}
ObjCInterfaceDecl::~ObjCInterfaceDecl() {
delete [] Ivars;
- delete [] PropertyDecl;
// FIXME: CategoryList?
}
@@ -274,37 +274,6 @@ bool ObjCInterfaceDecl::isPropertyReadonly(ObjCPropertyDecl *PDecl) const
return true;
}
-/// FindPropertyDeclaration - Finds declaration of the property given its name
-/// in 'PropertyId' and returns it. It returns 0, if not found.
-///
-ObjCPropertyDecl *
- ObjCInterfaceDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
- for (ObjCInterfaceDecl::classprop_iterator I = classprop_begin(),
- E = classprop_end(); I != E; ++I) {
- ObjCPropertyDecl *property = *I;
- if (property->getIdentifier() == PropertyId)
- return property;
- }
- // Look through categories.
- for (ObjCCategoryDecl *Category = getCategoryList();
- Category; Category = Category->getNextClassCategory()) {
- ObjCPropertyDecl *property = Category->FindPropertyDeclaration(PropertyId);
- if (property)
- return property;
- }
- // Look through protocols.
- for (ObjCInterfaceDecl::protocol_iterator I = protocol_begin(),
- E = protocol_end(); I != E; ++I) {
- ObjCProtocolDecl *Protocol = *I;
- ObjCPropertyDecl *property = Protocol->FindPropertyDeclaration(PropertyId);
- if (property)
- return property;
- }
- if (getSuperClass())
- return getSuperClass()->FindPropertyDeclaration(PropertyId);
- return 0;
-}
-
/// FindCategoryDeclaration - Finds category declaration in the list of
/// categories for this class and returns it. Name of the category is passed
/// in 'CategoryId'. If category not found, return 0;
@@ -377,43 +346,6 @@ void ObjCImplementationDecl::ObjCAddInstanceVariablesToClassImpl(
}
}
-/// addProperties - Insert property declaration AST nodes into
-/// ObjCInterfaceDecl's PropertyDecl field.
-///
-void ObjCInterfaceDecl::addProperties(ObjCPropertyDecl **Properties,
- unsigned NumProperties) {
- if (NumProperties == 0) return;
-
- NumPropertyDecl = NumProperties;
- PropertyDecl = new ObjCPropertyDecl*[NumProperties];
- memcpy(PropertyDecl, Properties, NumProperties*sizeof(ObjCPropertyDecl*));
-}
-
-/// mergeProperties - Adds properties to the end of list of current properties
-/// for this class.
-
-void ObjCInterfaceDecl::mergeProperties(ObjCPropertyDecl **Properties,
- unsigned NumNewProperties) {
- if (NumNewProperties == 0) return;
-
- if (PropertyDecl) {
- ObjCPropertyDecl **newPropertyDecl =
- new ObjCPropertyDecl*[NumNewProperties + NumPropertyDecl];
- ObjCPropertyDecl **buf = newPropertyDecl;
- // put back original properties in buffer.
- memcpy(buf, PropertyDecl, NumPropertyDecl*sizeof(ObjCPropertyDecl*));
- // Add new properties to this buffer.
- memcpy(buf+NumPropertyDecl, Properties,
- NumNewProperties*sizeof(ObjCPropertyDecl*));
- delete[] PropertyDecl;
- PropertyDecl = newPropertyDecl;
- NumPropertyDecl += NumNewProperties;
- }
- else {
- addProperties(Properties, NumNewProperties);
- }
-}
-
// 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 {
@@ -447,9 +379,9 @@ unsigned ObjCContainerDecl::getNumClassMethods() const {
}
/// mergeProperties - Adds properties to the end of list of current properties
-/// for this category.
+/// for this class.
-void ObjCCategoryDecl::mergeProperties(ObjCPropertyDecl **Properties,
+void ObjCContainerDecl::mergeProperties(ObjCPropertyDecl **Properties,
unsigned NumNewProperties) {
if (NumNewProperties == 0) return;
@@ -472,22 +404,10 @@ void ObjCCategoryDecl::mergeProperties(ObjCPropertyDecl **Properties,
}
/// addProperties - Insert property declaration AST nodes into
-/// ObjCProtocolDecl's PropertyDecl field.
-///
-void ObjCProtocolDecl::addProperties(ObjCPropertyDecl **Properties,
- unsigned NumProperties) {
- if (NumProperties == 0) return;
-
- NumPropertyDecl = NumProperties;
- PropertyDecl = new ObjCPropertyDecl*[NumProperties];
- memcpy(PropertyDecl, Properties, NumProperties*sizeof(ObjCPropertyDecl*));
-}
-
-/// addProperties - Insert property declaration AST nodes into
-/// ObjCCategoryDecl's PropertyDecl field.
+/// ObjCContainerDecl's PropertyDecl field.
///
-void ObjCCategoryDecl::addProperties(ObjCPropertyDecl **Properties,
- unsigned NumProperties) {
+void ObjCContainerDecl::addProperties(ObjCPropertyDecl **Properties,
+ unsigned NumProperties) {
if (NumProperties == 0) return;
NumPropertyDecl = NumProperties;
@@ -499,26 +419,31 @@ void ObjCCategoryDecl::addProperties(ObjCPropertyDecl **Properties,
/// in 'PropertyId' and returns it. It returns 0, if not found.
///
ObjCPropertyDecl *
-ObjCCategoryDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
- for (ObjCCategoryDecl::classprop_iterator I = classprop_begin(),
- E = classprop_end(); I != E; ++I) {
+ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
+ for (prop_iterator I = prop_begin(), E = prop_end(); I != E; ++I) {
ObjCPropertyDecl *property = *I;
if (property->getIdentifier() == PropertyId)
return property;
}
- return 0;
-}
-
-/// FindPropertyDeclaration - Finds declaration of the property given its name
-/// in 'PropertyId' and returns it. It returns 0, if not found.
-///
-ObjCPropertyDecl *
-ObjCProtocolDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
- for (ObjCProtocolDecl::classprop_iterator I = classprop_begin(),
- E = classprop_end(); I != E; ++I) {
- ObjCPropertyDecl *property = *I;
- if (property->getIdentifier() == PropertyId)
- return property;
+ const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(this);
+ if (OID) {
+ // Look through categories.
+ for (ObjCCategoryDecl *Category = OID->getCategoryList();
+ Category; Category = Category->getNextClassCategory()) {
+ ObjCPropertyDecl *property = Category->FindPropertyDeclaration(PropertyId);
+ if (property)
+ return property;
+ }
+ // Look through protocols.
+ for (ObjCInterfaceDecl::protocol_iterator I = OID->protocol_begin(),
+ E = OID->protocol_end(); I != E; ++I) {
+ ObjCProtocolDecl *Protocol = *I;
+ ObjCPropertyDecl *property = Protocol->FindPropertyDeclaration(PropertyId);
+ if (property)
+ return property;
+ }
+ if (OID->getSuperClass())
+ return OID->getSuperClass()->FindPropertyDeclaration(PropertyId);
}
return 0;
}
diff --git a/lib/AST/TranslationUnit.cpp b/lib/AST/TranslationUnit.cpp
index adf687678a..c02db82dab 100644
--- a/lib/AST/TranslationUnit.cpp
+++ b/lib/AST/TranslationUnit.cpp
@@ -46,8 +46,8 @@ TranslationUnit::~TranslationUnit() {
// eventually be fixed when the ownership of ObjCPropertyDecls gets
// cleaned up.
if (ObjCInterfaceDecl* IDecl = dyn_cast<ObjCInterfaceDecl>(*I))
- for (ObjCInterfaceDecl::classprop_iterator ID=IDecl->classprop_begin(),
- ED=IDecl->classprop_end(); ID!=ED; ++ID) {
+ for (ObjCInterfaceDecl::prop_iterator ID=IDecl->prop_begin(),
+ ED=IDecl->prop_end(); ID!=ED; ++ID) {
if (!*ID || Killed.count(*ID)) continue;
Killed.insert(*ID);
(*ID)->Destroy(*Context);
@@ -59,8 +59,8 @@ TranslationUnit::~TranslationUnit() {
// eventually be fixed when the ownership of ObjCPropertyDecls gets
// cleaned up.
if (ObjCProtocolDecl* PDecl = dyn_cast<ObjCProtocolDecl>(*I))
- for (ObjCProtocolDecl::classprop_iterator ID=PDecl->classprop_begin(),
- ED=PDecl->classprop_end(); ID!=ED; ++ID) {
+ for (ObjCProtocolDecl::prop_iterator ID=PDecl->prop_begin(),
+ ED=PDecl->prop_end(); ID!=ED; ++ID) {
if (!*ID || Killed.count(*ID)) continue;
Killed.insert(*ID);
(*ID)->Destroy(*Context);