aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2009-01-11 12:47:58 +0000
committerSteve Naroff <snaroff@apple.com>2009-01-11 12:47:58 +0000
commit93983f8fa120330bf212bfde7e65da2709fb3be8 (patch)
tree0acc570d24b6537e81d3f3eae61b6ebe0591b0e5
parent6327e0d55c590b3c2766fa76ef1db241a0467df2 (diff)
Convert property implementation to DeclContext::addDecl().
This completes the ObjCContainerDecl AST cleanup (for now). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62037 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/DeclObjC.h26
-rw-r--r--lib/AST/DeclObjC.cpp14
-rw-r--r--lib/CodeGen/CGObjCMac.cpp25
-rw-r--r--lib/Sema/SemaDeclObjC.cpp14
4 files changed, 24 insertions, 55 deletions
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index bf9499be28..b83f51ad53 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -250,33 +250,25 @@ public:
/// Current sub-classes are ObjCInterfaceDecl, ObjCCategoryDecl, and
/// ObjCProtocolDecl.
/// FIXME: Use for ObjC implementation decls.
-/// FIXME: Convert property implementation to DeclContext::addDecl(). Holding
-/// off until we have an iterator adaptor that plays with DeclContext.
///
class ObjCContainerDecl : public ScopedDecl, public DeclContext {
- /// class properties
- ObjCPropertyDecl **PropertyDecl; // Null if no property
- unsigned NumPropertyDecl; // 0 if none.
-
SourceLocation AtEndLoc; // marks the end of the method container.
public:
ObjCContainerDecl(Kind DK, DeclContext *DC, SourceLocation L,
IdentifierInfo *Id)
- : ScopedDecl(DK, DC, L, Id), DeclContext(DK),
- PropertyDecl(0), NumPropertyDecl(0) {}
+ : ScopedDecl(DK, DC, L, Id), DeclContext(DK) {}
virtual ~ObjCContainerDecl();
- void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
-
- typedef ObjCPropertyDecl * const * prop_iterator;
- prop_iterator prop_begin() const { return PropertyDecl; }
- prop_iterator prop_end() const {
- return PropertyDecl+NumPropertyDecl;
+ // Iterator access to properties.
+ typedef specific_decl_iterator<ObjCPropertyDecl> prop_iterator;
+ prop_iterator prop_begin() const {
+ return prop_iterator(decls_begin(), decls_end());
+ }
+ prop_iterator prop_end() const {
+ return prop_iterator(decls_end(), decls_end());
}
-
- ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const;
// Iterator access to instance/class methods.
typedef specific_decl_iterator<ObjCMethodDecl> method_iterator;
@@ -311,6 +303,8 @@ public:
ObjCMethodDecl *getInstanceMethod(Selector Sel) const;
ObjCMethodDecl *getClassMethod(Selector Sel) const;
+ ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const;
+
// Get the number of methods, properties. These methods are slow, O(n).
unsigned getNumInstanceMethods() const;
unsigned getNumClassMethods() const;
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index bac9f7b344..c4caed1e00 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -62,7 +62,6 @@ ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C,
}
ObjCContainerDecl::~ObjCContainerDecl() {
- delete [] PropertyDecl;
}
ObjCInterfaceDecl::~ObjCInterfaceDecl() {
@@ -390,20 +389,9 @@ unsigned ObjCContainerDecl::getNumProperties() const {
return sum;
}
-/// addProperties - Insert property declaration AST nodes into
-/// ObjCContainerDecl's PropertyDecl field.
-///
-void ObjCContainerDecl::addProperties(ObjCPropertyDecl **Properties,
- unsigned NumProperties) {
- if (NumProperties == 0) return;
-
- NumPropertyDecl = NumProperties;
- PropertyDecl = new ObjCPropertyDecl*[NumProperties];
- memcpy(PropertyDecl, Properties, NumProperties*sizeof(ObjCPropertyDecl*));
-}
-
/// FindPropertyDeclaration - Finds declaration of the property given its name
/// in 'PropertyId' and returns it. It returns 0, if not found.
+/// FIXME: Convert to DeclContext lookup...
///
ObjCPropertyDecl *
ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index 637edf3fea..df4b2a1999 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -341,9 +341,8 @@ private:
/// EmitPropertyList - Emit the given property list. The return
/// value has type PropertyListPtrTy.
llvm::Constant *EmitPropertyList(const std::string &Name,
- const Decl *Container,
- ObjCPropertyDecl * const *begin,
- ObjCPropertyDecl * const *end);
+ const Decl *Container,
+ const ObjCContainerDecl *OCD);
/// GetOrEmitProtocol - Get the protocol object for the given
/// declaration, emitting it if necessary. The return value has type
@@ -783,9 +782,7 @@ CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD,
OptClassMethods);
Values[3] = EmitPropertyList("\01L_OBJC_$_PROP_PROTO_LIST_" +
PD->getNameAsString(),
- 0,
- PD->prop_begin(),
- PD->prop_end());
+ 0, PD);
// Return null if no extension bits are used.
if (Values[1]->isNullValue() && Values[2]->isNullValue() &&
@@ -863,11 +860,11 @@ CGObjCMac::EmitProtocolList(const std::string &Name,
*/
llvm::Constant *CGObjCMac::EmitPropertyList(const std::string &Name,
const Decl *Container,
- ObjCPropertyDecl * const *begin,
- ObjCPropertyDecl * const *end) {
+ const ObjCContainerDecl *OCD) {
std::vector<llvm::Constant*> Properties, Prop(2);
- for (; begin != end; ++begin) {
- const ObjCPropertyDecl *PD = *begin;
+ for (ObjCContainerDecl::prop_iterator I = OCD->prop_begin(),
+ E = OCD->prop_end(); I != E; ++I) {
+ const ObjCPropertyDecl *PD = *I;
Prop[0] = GetPropertyName(PD->getIdentifier());
Prop[1] = GetPropertyTypeString(PD, Container);
Properties.push_back(llvm::ConstantStruct::get(ObjCTypes.PropertyTy,
@@ -1003,9 +1000,7 @@ void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
// If there is no category @interface then there can be no properties.
if (Category) {
Values[6] = EmitPropertyList(std::string("\01L_OBJC_$_PROP_LIST_") + ExtName,
- OCD,
- Category->prop_begin(),
- Category->prop_end());
+ OCD, Category);
} else {
Values[6] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
}
@@ -1280,9 +1275,7 @@ CGObjCMac::EmitClassExtension(const ObjCImplementationDecl *ID) {
// FIXME: Output weak_ivar_layout string.
Values[1] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
Values[2] = EmitPropertyList("\01L_OBJC_$_PROP_LIST_" + ID->getNameAsString(),
- ID,
- ID->getClassInterface()->prop_begin(),
- ID->getClassInterface()->prop_end());
+ ID, ID->getClassInterface());
// Return null if no extension bits are used.
if (Values[1]->isNullValue() && Values[2]->isNullValue())
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index d47f98af25..c4b085dc1e 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -1143,14 +1143,7 @@ void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl,
|| isa<ObjCProtocolDecl>(ClassDecl);
bool checkIdenticalMethods = isa<ObjCImplementationDecl>(ClassDecl);
- if (pNum != 0) {
- if (ObjCContainerDecl *CDecl = dyn_cast<ObjCContainerDecl>(ClassDecl))
- CDecl->addProperties((ObjCPropertyDecl**)allProperties, pNum);
- else
- assert(false && "ActOnAtEnd - property declaration misplaced");
- }
DeclContext *DC = dyn_cast<DeclContext>(ClassDecl);
- assert(DC && "Missing DeclContext");
// FIXME: Remove these and use the ObjCContainerDecl/DeclContext.
llvm::DenseMap<Selector, const ObjCMethodDecl*> InsMap;
@@ -1525,10 +1518,11 @@ Sema::DeclTy *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
if (t->isArrayType() || t->isFunctionType())
Diag(AtLoc, diag::err_property_type) << T;
- ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, CurContext, AtLoc,
+ DeclContext *DC = dyn_cast<DeclContext>(ClassDecl);
+ assert(DC && "ClassDecl is not a DeclContext");
+ ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, DC, AtLoc,
FD.D.getIdentifier(), T);
- // FIXME: PushOnScopeChains?
- CurContext->addDecl(Context, PDecl);
+ DC->addDecl(Context, PDecl);
// Regardless of setter/getter attribute, we save the default getter/setter
// selector names in anticipation of declaration of setter/getter methods.