From: Chris Lattner Date: Fri, 20 Feb 2009 20:59:54 +0000 (+0000) Subject: rearrange the contents of DeclObjC to be by-class. Fix some 80 column issues X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ab35163a5b80bf1bd49f0eebb708970f2b0e04e9;p=clang rearrange the contents of DeclObjC to be by-class. Fix some 80 column issues and other non-semantic changes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65155 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 98343e7222..9e030d771a 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -17,7 +17,158 @@ using namespace clang; //===----------------------------------------------------------------------===// -// ObjC Decl Allocation/Deallocation Method Implementations +// ObjCInterfaceDecl +//===----------------------------------------------------------------------===// + +// 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( + dyn_cast(*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( + dyn_cast(*MethodResult.first)); + return 0; +} + +/// 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 { + for (prop_iterator I = prop_begin(), E = prop_end(); I != E; ++I) + if ((*I)->getIdentifier() == PropertyId) + return *I; + + const ObjCProtocolDecl *PID = dyn_cast(this); + if (PID) { + for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(), + E = PID->protocol_end(); I != E; ++I) + if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) + return P; + } + + if (const ObjCInterfaceDecl *OID = dyn_cast(this)) { + // Look through categories. + for (ObjCCategoryDecl *Category = OID->getCategoryList(); + Category; Category = Category->getNextClassCategory()) { + if (ObjCPropertyDecl *P = Category->FindPropertyDeclaration(PropertyId)) + return P; + } + // Look through protocols. + for (ObjCInterfaceDecl::protocol_iterator I = OID->protocol_begin(), + E = OID->protocol_end(); I != E; ++I) { + if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) + return P; + } + if (OID->getSuperClass()) + return OID->getSuperClass()->FindPropertyDeclaration(PropertyId); + } else if (const ObjCCategoryDecl *OCD = dyn_cast(this)) { + // Look through protocols. + for (ObjCInterfaceDecl::protocol_iterator I = OCD->protocol_begin(), + E = OCD->protocol_end(); I != E; ++I) { + if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId)) + return P; + } + } + return 0; +} + +ObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable( + IdentifierInfo *ID, ObjCInterfaceDecl *&clsDeclared) { + ObjCInterfaceDecl* ClassDecl = this; + while (ClassDecl != NULL) { + for (ivar_iterator I = ClassDecl->ivar_begin(), E = ClassDecl->ivar_end(); + I != E; ++I) { + if ((*I)->getIdentifier() == ID) { + clsDeclared = ClassDecl; + return *I; + } + } + ClassDecl = ClassDecl->getSuperClass(); + } + return NULL; +} + +/// lookupInstanceMethod - This method returns an instance method by looking in +/// the class, its categories, and its super classes (using a linear search). +ObjCMethodDecl *ObjCInterfaceDecl::lookupInstanceMethod(Selector Sel) { + ObjCInterfaceDecl* ClassDecl = this; + ObjCMethodDecl *MethodDecl = 0; + + while (ClassDecl != NULL) { + if ((MethodDecl = ClassDecl->getInstanceMethod(Sel))) + return MethodDecl; + + // Didn't find one yet - look through protocols. + const ObjCList &Protocols = + ClassDecl->getReferencedProtocols(); + for (ObjCList::iterator I = Protocols.begin(), + E = Protocols.end(); I != E; ++I) + if ((MethodDecl = (*I)->getInstanceMethod(Sel))) + return MethodDecl; + + // Didn't find one yet - now look through categories. + ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); + while (CatDecl) { + if ((MethodDecl = CatDecl->getInstanceMethod(Sel))) + return MethodDecl; + + // Didn't find one yet - look through protocols. + const ObjCList &Protocols = + CatDecl->getReferencedProtocols(); + for (ObjCList::iterator I = Protocols.begin(), + E = Protocols.end(); I != E; ++I) + if ((MethodDecl = (*I)->getInstanceMethod(Sel))) + return MethodDecl; + CatDecl = CatDecl->getNextClassCategory(); + } + ClassDecl = ClassDecl->getSuperClass(); + } + return NULL; +} + +// lookupClassMethod - This method returns a class method by looking in the +// class, its categories, and its super classes (using a linear search). +ObjCMethodDecl *ObjCInterfaceDecl::lookupClassMethod(Selector Sel) { + ObjCInterfaceDecl* ClassDecl = this; + ObjCMethodDecl *MethodDecl = 0; + + while (ClassDecl != NULL) { + if ((MethodDecl = ClassDecl->getClassMethod(Sel))) + return MethodDecl; + + // Didn't find one yet - look through protocols. + for (ObjCInterfaceDecl::protocol_iterator I = ClassDecl->protocol_begin(), + E = ClassDecl->protocol_end(); I != E; ++I) + if ((MethodDecl = (*I)->getClassMethod(Sel))) + return MethodDecl; + + // Didn't find one yet - now look through categories. + ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); + while (CatDecl) { + if ((MethodDecl = CatDecl->getClassMethod(Sel))) + return MethodDecl; + CatDecl = CatDecl->getNextClassCategory(); + } + ClassDecl = ClassDecl->getSuperClass(); + } + return NULL; +} + + + +//===----------------------------------------------------------------------===// +// ObjCMethodDecl //===----------------------------------------------------------------------===// ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, @@ -47,6 +198,64 @@ void ObjCMethodDecl::Destroy(ASTContext& C) { Decl::Destroy(C); } +void ObjCMethodDecl::createImplicitParams(ASTContext &Context, + const ObjCInterfaceDecl *OID) { + QualType selfTy; + if (isInstanceMethod()) { + // There may be no interface context due to error in declaration + // of the interface (which has been reported). Recover gracefully. + if (OID) { + selfTy =Context.getObjCInterfaceType(const_cast(OID)); + selfTy = Context.getPointerType(selfTy); + } else { + selfTy = Context.getObjCIdType(); + } + } else // we have a factory method. + selfTy = Context.getObjCClassType(); + + SelfDecl = ImplicitParamDecl::Create(Context, this, SourceLocation(), + &Context.Idents.get("self"), selfTy); + + CmdDecl = ImplicitParamDecl::Create(Context, this, SourceLocation(), + &Context.Idents.get("_cmd"), + Context.getObjCSelType()); +} + + + +/// getSynthesizedMethodSize - Compute size of synthesized method name +/// as done be the rewrite. +/// +unsigned ObjCMethodDecl::getSynthesizedMethodSize() const { + // syntesized method name is a concatenation of -/+[class-name selector] + // Get length of this name. + unsigned length = 3; // _I_ or _C_ + length += getClassInterface()->getNameAsString().size()+1; // extra for _ + if (const ObjCCategoryImplDecl *CID = + dyn_cast(getDeclContext())) + length += CID->getNameAsString().size()+1; + length += getSelector().getAsString().size(); // selector name + return length; +} + +ObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() { + if (ObjCInterfaceDecl *ID = dyn_cast(getDeclContext())) + return ID; + if (ObjCCategoryDecl *CD = dyn_cast(getDeclContext())) + return CD->getClassInterface(); + if (ObjCImplementationDecl *IMD = + dyn_cast(getDeclContext())) + return IMD->getClassInterface(); + if (ObjCCategoryImplDecl *CID = + dyn_cast(getDeclContext())) + return CID->getClassInterface(); + assert(false && "unknown method context"); + return 0; +} + +//===----------------------------------------------------------------------===// +// ObjCInterfaceDecl +//===----------------------------------------------------------------------===// ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, DeclContext *DC, @@ -81,6 +290,39 @@ void ObjCInterfaceDecl::Destroy(ASTContext &C) { } +/// 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; +/// +ObjCCategoryDecl * +ObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const { + for (ObjCCategoryDecl *Category = getCategoryList(); + Category; Category = Category->getNextClassCategory()) + if (Category->getIdentifier() == CategoryId) + return Category; + return 0; +} + +/// lookupFieldDeclForIvar - looks up a field decl' in the laid out +/// storage which matches this 'ivar'. +/// +FieldDecl *ObjCInterfaceDecl::lookupFieldDeclForIvar(ASTContext &Context, + const ObjCIvarDecl *IVar) { + const RecordDecl *RecordForDecl = Context.addRecordToClass(this); + assert(RecordForDecl && "lookupFieldDeclForIvar no storage for class"); + DeclarationName Member = IVar->getDeclName(); + DeclContext::lookup_result Lookup = + (const_cast< RecordDecl *>(RecordForDecl))->lookup(Member); + assert((Lookup.first != Lookup.second) && "field decl not found"); + FieldDecl *MemberDecl = dyn_cast(*Lookup.first); + assert(MemberDecl && "field decl not found"); + return MemberDecl; +} + +//===----------------------------------------------------------------------===// +// ObjCIvarDecl +//===----------------------------------------------------------------------===// + ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, QualType T, AccessControl ac, Expr *BW) { @@ -88,6 +330,11 @@ ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, DeclContext *DC, } + +//===----------------------------------------------------------------------===// +// ObjCAtDefsFieldDecl +//===----------------------------------------------------------------------===// + ObjCAtDefsFieldDecl *ObjCAtDefsFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *BW) { @@ -99,6 +346,10 @@ void ObjCAtDefsFieldDecl::Destroy(ASTContext& C) { C.Deallocate((void *)this); } +//===----------------------------------------------------------------------===// +// ObjCProtocolDecl +//===----------------------------------------------------------------------===// + ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id) { @@ -110,8 +361,37 @@ void ObjCProtocolDecl::Destroy(ASTContext &C) { ObjCContainerDecl::Destroy(C); } +// lookupInstanceMethod - Lookup a instance method in the protocol and protocols +// it inherited. +ObjCMethodDecl *ObjCProtocolDecl::lookupInstanceMethod(Selector Sel) { + ObjCMethodDecl *MethodDecl = NULL; + + if ((MethodDecl = getInstanceMethod(Sel))) + return MethodDecl; + + for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) + if ((MethodDecl = (*I)->lookupInstanceMethod(Sel))) + return MethodDecl; + return NULL; +} +// lookupInstanceMethod - Lookup a class method in the protocol and protocols +// it inherited. +ObjCMethodDecl *ObjCProtocolDecl::lookupClassMethod(Selector Sel) { + ObjCMethodDecl *MethodDecl = NULL; + + if ((MethodDecl = getClassMethod(Sel))) + return MethodDecl; + + for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) + if ((MethodDecl = (*I)->lookupClassMethod(Sel))) + return MethodDecl; + return NULL; +} +//===----------------------------------------------------------------------===// +// ObjCClassDecl +//===----------------------------------------------------------------------===// ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, @@ -134,6 +414,10 @@ void ObjCClassDecl::Destroy(ASTContext &C) { Decl::Destroy(C); } +//===----------------------------------------------------------------------===// +// ObjCForwardProtocolDecl +//===----------------------------------------------------------------------===// + ObjCForwardProtocolDecl * ObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, @@ -154,12 +438,20 @@ void ObjCForwardProtocolDecl::Destroy(ASTContext &C) { Decl::Destroy(C); } +//===----------------------------------------------------------------------===// +// ObjCCategoryDecl +//===----------------------------------------------------------------------===// + ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id) { return new (C) ObjCCategoryDecl(DC, L, Id); } +//===----------------------------------------------------------------------===// +// ObjCCategoryImplDecl +//===----------------------------------------------------------------------===// + ObjCCategoryImplDecl * ObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,IdentifierInfo *Id, @@ -167,249 +459,73 @@ ObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC, return new (C) ObjCCategoryImplDecl(DC, L, Id, ClassInterface); } -ObjCImplementationDecl * -ObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC, - SourceLocation L, - ObjCInterfaceDecl *ClassInterface, - ObjCInterfaceDecl *SuperDecl) { - return new (C) ObjCImplementationDecl(DC, L, ClassInterface, SuperDecl); -} - -/// Destroy - Call destructors and release memory. -void ObjCImplementationDecl::Destroy(ASTContext& C) { - IVars.clear(); - Decl::Destroy(C); -} - - -ObjCCompatibleAliasDecl * -ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC, - SourceLocation L, - IdentifierInfo *Id, - ObjCInterfaceDecl* AliasedClass) { - return new (C) ObjCCompatibleAliasDecl(DC, L, Id, AliasedClass); -} - -ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC, - SourceLocation L, - IdentifierInfo *Id, - QualType T, - PropertyControl propControl) { - return new (C) ObjCPropertyDecl(DC, L, Id, T); -} -//===----------------------------------------------------------------------===// -// Objective-C Decl Implementation -//===----------------------------------------------------------------------===// - -void ObjCMethodDecl::createImplicitParams(ASTContext &Context, - const ObjCInterfaceDecl *OID) { - QualType selfTy; - if (isInstanceMethod()) { - // There may be no interface context due to error in declaration - // of the interface (which has been reported). Recover gracefully. - if (OID) { - selfTy = Context.getObjCInterfaceType(const_cast(OID)); - selfTy = Context.getPointerType(selfTy); - } else { - selfTy = Context.getObjCIdType(); - } - } else // we have a factory method. - selfTy = Context.getObjCClassType(); - - SelfDecl = ImplicitParamDecl::Create(Context, this, - SourceLocation(), - &Context.Idents.get("self"), - selfTy); - - CmdDecl = ImplicitParamDecl::Create(Context, this, - SourceLocation(), - &Context.Idents.get("_cmd"), - Context.getObjCSelType()); -} - -/// 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; -/// -ObjCCategoryDecl * - ObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const { - for (ObjCCategoryDecl *Category = getCategoryList(); - Category; Category = Category->getNextClassCategory()) - if (Category->getIdentifier() == CategoryId) - return Category; - return 0; -} - -/// lookupFieldDeclForIvar - looks up a field decl' in the laid out -/// storage which matches this 'ivar'. +/// FindPropertyImplIvarDecl - This method lookup the ivar in the list of +/// properties implemented in this category @implementation block and returns +/// the implemented property that uses it. /// -FieldDecl *ObjCInterfaceDecl::lookupFieldDeclForIvar(ASTContext &Context, - const ObjCIvarDecl *ivar) { - const RecordDecl *RecordForDecl = Context.addRecordToClass(this); - assert(RecordForDecl && "lookupFieldDeclForIvar no storage for class"); - DeclarationName Member = ivar->getDeclName(); - DeclContext::lookup_result Lookup = (const_cast< RecordDecl *>(RecordForDecl)) - ->lookup(Member); - assert((Lookup.first != Lookup.second) && "field decl not found"); - FieldDecl *MemberDecl = dyn_cast(*Lookup.first); - assert(MemberDecl && "field decl not found"); - return MemberDecl; -} - - -// 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( - dyn_cast(*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( - dyn_cast(*MethodResult.first)); +ObjCPropertyImplDecl *ObjCCategoryImplDecl:: +FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const { + for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ + ObjCPropertyImplDecl *PID = *i; + if (PID->getPropertyIvarDecl() && + PID->getPropertyIvarDecl()->getIdentifier() == ivarId) + return PID; + } return 0; } -/// 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... +/// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl +/// added to the list of those properties @synthesized/@dynamic in this +/// category @implementation block. /// -ObjCPropertyDecl * -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; - } - const ObjCProtocolDecl *PID = dyn_cast(this); - if (PID) { - for (ObjCProtocolDecl::protocol_iterator P = PID->protocol_begin(), - E = PID->protocol_end(); - P != E; ++P) - if (ObjCPropertyDecl *property = - (*P)->FindPropertyDeclaration(PropertyId)) - return property; - } - - if (const ObjCInterfaceDecl *OID = dyn_cast(this)) { - // 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); - } - else if (const ObjCCategoryDecl *OCD = dyn_cast(this)) { - // Look through protocols. - for (ObjCInterfaceDecl::protocol_iterator I = OCD->protocol_begin(), - E = OCD->protocol_end(); I != E; ++I) { - ObjCProtocolDecl *Protocol = *I; - ObjCPropertyDecl *property = Protocol->FindPropertyDeclaration(PropertyId); - if (property) - return property; - } +ObjCPropertyImplDecl *ObjCCategoryImplDecl:: +FindPropertyImplDecl(IdentifierInfo *Id) const { + for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ + ObjCPropertyImplDecl *PID = *i; + if (PID->getPropertyDecl()->getIdentifier() == Id) + return PID; } return 0; } -ObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable( - IdentifierInfo *ID, ObjCInterfaceDecl *&clsDeclared) { - ObjCInterfaceDecl* ClassDecl = this; - while (ClassDecl != NULL) { - for (ivar_iterator I = ClassDecl->ivar_begin(), E = ClassDecl->ivar_end(); - I != E; ++I) { - if ((*I)->getIdentifier() == ID) { - clsDeclared = ClassDecl; - return *I; - } - } - ClassDecl = ClassDecl->getSuperClass(); - } +// lookupInstanceMethod - This method returns an instance method by looking in +// the class implementation. Unlike interfaces, we don't look outside the +// implementation. +ObjCMethodDecl *ObjCCategoryImplDecl::getInstanceMethod(Selector Sel) const { + for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) + if ((*I)->getSelector() == Sel) + return *I; return NULL; } -/// lookupInstanceMethod - This method returns an instance method by looking in -/// the class, its categories, and its super classes (using a linear search). -ObjCMethodDecl *ObjCInterfaceDecl::lookupInstanceMethod(Selector Sel) { - ObjCInterfaceDecl* ClassDecl = this; - ObjCMethodDecl *MethodDecl = 0; - - while (ClassDecl != NULL) { - if ((MethodDecl = ClassDecl->getInstanceMethod(Sel))) - return MethodDecl; - - // Didn't find one yet - look through protocols. - const ObjCList &Protocols = - ClassDecl->getReferencedProtocols(); - for (ObjCList::iterator I = Protocols.begin(), - E = Protocols.end(); I != E; ++I) - if ((MethodDecl = (*I)->getInstanceMethod(Sel))) - return MethodDecl; - - // Didn't find one yet - now look through categories. - ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); - while (CatDecl) { - if ((MethodDecl = CatDecl->getInstanceMethod(Sel))) - return MethodDecl; - - // Didn't find one yet - look through protocols. - const ObjCList &Protocols = - CatDecl->getReferencedProtocols(); - for (ObjCList::iterator I = Protocols.begin(), - E = Protocols.end(); I != E; ++I) - if ((MethodDecl = (*I)->getInstanceMethod(Sel))) - return MethodDecl; - CatDecl = CatDecl->getNextClassCategory(); - } - ClassDecl = ClassDecl->getSuperClass(); - } +// lookupClassMethod - This method returns an instance method by looking in +// the class implementation. Unlike interfaces, we don't look outside the +// implementation. +ObjCMethodDecl *ObjCCategoryImplDecl::getClassMethod(Selector Sel) const { + for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); + I != E; ++I) + if ((*I)->getSelector() == Sel) + return *I; return NULL; } -// lookupClassMethod - This method returns a class method by looking in the -// class, its categories, and its super classes (using a linear search). -ObjCMethodDecl *ObjCInterfaceDecl::lookupClassMethod(Selector Sel) { - ObjCInterfaceDecl* ClassDecl = this; - ObjCMethodDecl *MethodDecl = 0; +//===----------------------------------------------------------------------===// +// ObjCImplementationDecl +//===----------------------------------------------------------------------===// - while (ClassDecl != NULL) { - if ((MethodDecl = ClassDecl->getClassMethod(Sel))) - return MethodDecl; +ObjCImplementationDecl * +ObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC, + SourceLocation L, + ObjCInterfaceDecl *ClassInterface, + ObjCInterfaceDecl *SuperDecl) { + return new (C) ObjCImplementationDecl(DC, L, ClassInterface, SuperDecl); +} - // Didn't find one yet - look through protocols. - for (ObjCInterfaceDecl::protocol_iterator I = ClassDecl->protocol_begin(), - E = ClassDecl->protocol_end(); I != E; ++I) - if ((MethodDecl = (*I)->getClassMethod(Sel))) - return MethodDecl; - - // Didn't find one yet - now look through categories. - ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList(); - while (CatDecl) { - if ((MethodDecl = CatDecl->getClassMethod(Sel))) - return MethodDecl; - CatDecl = CatDecl->getNextClassCategory(); - } - ClassDecl = ClassDecl->getSuperClass(); - } - return NULL; +/// Destroy - Call destructors and release memory. +void ObjCImplementationDecl::Destroy(ASTContext& C) { + IVars.clear(); + Decl::Destroy(C); } /// getInstanceMethod - This method returns an instance method by @@ -437,8 +553,9 @@ ObjCMethodDecl *ObjCImplementationDecl::getClassMethod(Selector Sel) const { /// added to the list of those properties @synthesized/@dynamic in this /// @implementation block. /// -ObjCPropertyImplDecl *ObjCImplementationDecl::FindPropertyImplDecl(IdentifierInfo *Id) const { - for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i) { +ObjCPropertyImplDecl *ObjCImplementationDecl:: +FindPropertyImplDecl(IdentifierInfo *Id) const { + for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ ObjCPropertyImplDecl *PID = *i; if (PID->getPropertyDecl()->getIdentifier() == Id) return PID; @@ -450,21 +567,7 @@ ObjCPropertyImplDecl *ObjCImplementationDecl::FindPropertyImplDecl(IdentifierInf /// properties implemented in this @implementation block and returns the /// implemented property that uses it. /// -ObjCPropertyImplDecl *ObjCImplementationDecl::FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const { - for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i) { - ObjCPropertyImplDecl *PID = *i; - if (PID->getPropertyIvarDecl() && - PID->getPropertyIvarDecl()->getIdentifier() == ivarId) - return PID; - } - return 0; -} - -/// FindPropertyImplIvarDecl - This method lookup the ivar in the list of -/// properties implemented in this category @implementation block and returns -/// the implemented property that uses it. -/// -ObjCPropertyImplDecl *ObjCCategoryImplDecl:: +ObjCPropertyImplDecl *ObjCImplementationDecl:: FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const { for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ ObjCPropertyImplDecl *PID = *i; @@ -475,98 +578,34 @@ FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const { return 0; } -/// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl -/// added to the list of those properties @synthesized/@dynamic in this -/// category @implementation block. -/// -ObjCPropertyImplDecl *ObjCCategoryImplDecl:: -FindPropertyImplDecl(IdentifierInfo *Id) const { - for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){ - ObjCPropertyImplDecl *PID = *i; - if (PID->getPropertyDecl()->getIdentifier() == Id) - return PID; - } - return 0; -} - -// lookupInstanceMethod - This method returns an instance method by looking in -// the class implementation. Unlike interfaces, we don't look outside the -// implementation. -ObjCMethodDecl *ObjCCategoryImplDecl::getInstanceMethod(Selector Sel) const { - for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); I != E; ++I) - if ((*I)->getSelector() == Sel) - return *I; - return NULL; -} - -// lookupClassMethod - This method returns an instance method by looking in -// the class implementation. Unlike interfaces, we don't look outside the -// implementation. -ObjCMethodDecl *ObjCCategoryImplDecl::getClassMethod(Selector Sel) const { - for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); - I != E; ++I) - if ((*I)->getSelector() == Sel) - return *I; - return NULL; -} +//===----------------------------------------------------------------------===// +// ObjCCompatibleAliasDecl +//===----------------------------------------------------------------------===// -// lookupInstanceMethod - Lookup a instance method in the protocol and protocols -// it inherited. -ObjCMethodDecl *ObjCProtocolDecl::lookupInstanceMethod(Selector Sel) { - ObjCMethodDecl *MethodDecl = NULL; - - if ((MethodDecl = getInstanceMethod(Sel))) - return MethodDecl; - - for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) - if ((MethodDecl = (*I)->lookupInstanceMethod(Sel))) - return MethodDecl; - return NULL; +ObjCCompatibleAliasDecl * +ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC, + SourceLocation L, + IdentifierInfo *Id, + ObjCInterfaceDecl* AliasedClass) { + return new (C) ObjCCompatibleAliasDecl(DC, L, Id, AliasedClass); } -// lookupInstanceMethod - Lookup a class method in the protocol and protocols -// it inherited. -ObjCMethodDecl *ObjCProtocolDecl::lookupClassMethod(Selector Sel) { - ObjCMethodDecl *MethodDecl = NULL; +//===----------------------------------------------------------------------===// +// ObjCPropertyDecl +//===----------------------------------------------------------------------===// - if ((MethodDecl = getClassMethod(Sel))) - return MethodDecl; - - for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I) - if ((MethodDecl = (*I)->lookupClassMethod(Sel))) - return MethodDecl; - return NULL; +ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC, + SourceLocation L, + IdentifierInfo *Id, + QualType T, + PropertyControl propControl) { + return new (C) ObjCPropertyDecl(DC, L, Id, T); } -/// getSynthesizedMethodSize - Compute size of synthesized method name -/// as done be the rewrite. -/// -unsigned ObjCMethodDecl::getSynthesizedMethodSize() const { - // syntesized method name is a concatenation of -/+[class-name selector] - // Get length of this name. - unsigned length = 3; // _I_ or _C_ - length += getClassInterface()->getNameAsString().size()+1; // extra for _ - if (const ObjCCategoryImplDecl *CID = - dyn_cast(getDeclContext())) - length += CID->getNameAsString().size()+1; - length += getSelector().getAsString().size(); // selector name - return length; -} -ObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() { - if (ObjCInterfaceDecl *ID = dyn_cast(getDeclContext())) - return ID; - if (ObjCCategoryDecl *CD = dyn_cast(getDeclContext())) - return CD->getClassInterface(); - if (ObjCImplementationDecl *IMD = - dyn_cast(getDeclContext())) - return IMD->getClassInterface(); - if (ObjCCategoryImplDecl *CID = - dyn_cast(getDeclContext())) - return CID->getClassInterface(); - assert(false && "unknown method context"); - return 0; -} +//===----------------------------------------------------------------------===// +// ObjCPropertyImplDecl +//===----------------------------------------------------------------------===// ObjCPropertyImplDecl *ObjCPropertyImplDecl::Create(ASTContext &C, DeclContext *DC,