forked from OSchip/llvm-project
Convert property implementation to DeclContext::addDecl().
This completes the ObjCContainerDecl AST cleanup (for now). llvm-svn: 62037
This commit is contained in:
parent
e3108148e2
commit
ba3dc38840
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue