DeclObjC.h revision a0fb5861dec7aa1da0d21d5759678d76b00464f4
1980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//===--- DeclObjC.h - Classes for representing declarations -----*- C++ -*-===// 2980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// 3980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// The LLVM Compiler Infrastructure 4980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 7980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// 8980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//===----------------------------------------------------------------------===// 9980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// 10980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// This file defines the DeclObjC interface and subclasses. 11980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// 12980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//===----------------------------------------------------------------------===// 13980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 14980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#ifndef LLVM_CLANG_AST_DECLOBJC_H 15980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#define LLVM_CLANG_AST_DECLOBJC_H 16980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 17980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/Decl.h" 18c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner#include "clang/Basic/IdentifierTable.h" 19980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 20980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffnamespace clang { 21980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass Expr; 22980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass Stmt; 23980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass FunctionDecl; 24980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass AttributeList; 25a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCIvarDecl; 26a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCMethodDecl; 27a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCProtocolDecl; 28a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCCategoryDecl; 29a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCPropertyDecl; 30f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanianclass ObjCPropertyImplDecl; 3158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 32a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCMethodDecl - Represents an instance or class method declaration. 3358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// ObjC methods can be declared within 4 contexts: class interfaces, 3458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// categories, protocols, and class implementations. While C++ member 3558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// functions leverage C syntax, Objective-C method syntax is modeled after 3658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Smalltalk (using colons to specify argument types/expressions). 3758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Here are some brief examples: 3858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// 3958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Setter/getter instance methods: 4058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (void)setMenu:(NSMenu *)menu; 4158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (NSMenu *)menu; 4258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// 4358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Instance method that takes 2 NSView arguments: 4458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView; 4558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// 4658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Getter class method: 4758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// + (NSMenu *)defaultMenu; 4858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// 4958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// A selector represents a unique name for a method. The selector names for 5058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu. 5158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// 52b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass ObjCMethodDecl : public Decl, public DeclContext { 5358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroffpublic: 5458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff enum ImplementationControl { None, Required, Optional }; 5558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroffprivate: 5658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff /// Bitfields must be first fields in this class so they pack with those 5758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff /// declared in class Decl. 5858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff /// instance (true) or class (false) method. 5958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff bool IsInstance : 1; 6058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff bool IsVariadic : 1; 6158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 624607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian // Synthesized declaration method for a property setter/getter 634607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian bool IsSynthesized : 1; 644607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian 65ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek // NOTE: VC++ treats enums as signed, avoid using ImplementationControl enum 6658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff /// @required/@optional 67ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek unsigned DeclImplementation : 2; 6858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 69ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek // NOTE: VC++ treats enums as signed, avoid using the ObjCDeclQualifier enum 7058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff /// in, inout, etc. 71ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek unsigned objcDeclQualifier : 6; 7258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 7358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Context this method is declared in. 7458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff NamedDecl *MethodContext; 7558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 7658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // A unigue name for this method. 7758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff Selector SelName; 7858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 7958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Type of this method. 8058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff QualType MethodDeclType; 8158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff /// ParamInfo - new[]'d array of pointers to VarDecls for the formal 8258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff /// parameters of this Method. This is null if there are no formals. 8358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff ParmVarDecl **ParamInfo; 8458cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner unsigned NumMethodParams; 8558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 8658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff /// List of attributes for this method declaration. 8758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff AttributeList *MethodAttrs; 8858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 8958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff SourceLocation EndLoc; // the location of the ';' or '{'. 9058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 9158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // The following are only used for method definitions, null otherwise. 9258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // FIXME: space savings opportunity, consider a sub-class. 9358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff Stmt *Body; 944111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner // Decls for implicit parameters 954111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner ImplicitParamDecl *SelfDecl; 964111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner ImplicitParamDecl *CmdDecl; 976c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 98a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl(SourceLocation beginLoc, SourceLocation endLoc, 9958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff Selector SelInfo, QualType T, 10058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff Decl *contextDecl, 10158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff AttributeList *M = 0, bool isInstance = true, 10258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff bool isVariadic = false, 1034607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian bool isSynthesized = false, 10458cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner ImplementationControl impControl = None) 105a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : Decl(ObjCMethod, beginLoc), 106b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner DeclContext(ObjCMethod), 10758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff IsInstance(isInstance), IsVariadic(isVariadic), 1084607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian IsSynthesized(isSynthesized), 10958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None), 11058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff MethodContext(static_cast<NamedDecl*>(contextDecl)), 11158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff SelName(SelInfo), MethodDeclType(T), 1124111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner ParamInfo(0), NumMethodParams(0), MethodAttrs(M), 1134111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner EndLoc(endLoc), Body(0), SelfDecl(0), CmdDecl(0) {} 1148a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 1151c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek virtual ~ObjCMethodDecl(); 1161c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 1176c4ae5de0c356777446f823b573821fb95560d91Chris Lattnerpublic: 1188a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 1198a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek /// Destroy - Call destructors and release memory. 1208a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek virtual void Destroy(ASTContext& C); 1216c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 1220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCMethodDecl *Create(ASTContext &C, 1230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation beginLoc, 1246c4ae5de0c356777446f823b573821fb95560d91Chris Lattner SourceLocation endLoc, Selector SelInfo, 1256c4ae5de0c356777446f823b573821fb95560d91Chris Lattner QualType T, Decl *contextDecl, 1266c4ae5de0c356777446f823b573821fb95560d91Chris Lattner AttributeList *M = 0, bool isInstance = true, 1276c4ae5de0c356777446f823b573821fb95560d91Chris Lattner bool isVariadic = false, 1284607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian bool isSynthesized = false, 129b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner ImplementationControl impControl = None); 13058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 131ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek ObjCDeclQualifier getObjCDeclQualifier() const { 132ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek return ObjCDeclQualifier(objcDeclQualifier); 133ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek } 134a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setObjCDeclQualifier(ObjCDeclQualifier QV) { objcDeclQualifier = QV; } 13558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 13658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Location information, modeled after the Stmt API. 13758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff SourceLocation getLocStart() const { return getLocation(); } 13858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 13958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 14058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff NamedDecl *getMethodContext() const { return MethodContext; } 14158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 1425619688510185081cbb4621d703daf7ee24cf39aChris Lattner ObjCInterfaceDecl *getClassInterface(); 1435619688510185081cbb4621d703daf7ee24cf39aChris Lattner const ObjCInterfaceDecl *getClassInterface() const { 1445619688510185081cbb4621d703daf7ee24cf39aChris Lattner return const_cast<ObjCMethodDecl*>(this)->getClassInterface(); 145e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner } 14658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 14758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff Selector getSelector() const { return SelName; } 148faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian unsigned getSynthesizedMethodSize() const; 14958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff QualType getResultType() const { return MethodDeclType; } 15058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 151d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner // Iterator access to formal parameters. 15258cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner unsigned param_size() const { return NumMethodParams; } 153d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner typedef ParmVarDecl **param_iterator; 154d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner typedef ParmVarDecl * const *param_const_iterator; 155d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner param_iterator param_begin() { return ParamInfo; } 156d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner param_iterator param_end() { return ParamInfo+param_size(); } 157d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner param_const_iterator param_begin() const { return ParamInfo; } 158d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner param_const_iterator param_end() const { return ParamInfo+param_size(); } 159d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner 16058cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner unsigned getNumParams() const { return NumMethodParams; } 16158cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner ParmVarDecl *getParamDecl(unsigned i) const { 16258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff assert(i < getNumParams() && "Illegal param #"); 16358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return ParamInfo[i]; 16458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 1652338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian void setParamDecl(int i, ParmVarDecl *pDecl) { 1662338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian ParamInfo[i] = pDecl; 1672338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian } 16858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams); 1694111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 1704111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner ImplicitParamDecl * getSelfDecl() const { return SelfDecl; } 1714111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner void setSelfDecl(ImplicitParamDecl *decl) { SelfDecl = decl; } 1724111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner ImplicitParamDecl * getCmdDecl() const { return CmdDecl; } 1734111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner void setCmdDecl(ImplicitParamDecl *decl) { CmdDecl = decl; } 17458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 17558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff AttributeList *getMethodAttrs() const {return MethodAttrs;} 17658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff bool isInstance() const { return IsInstance; } 17758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff bool isVariadic() const { return IsVariadic; } 17858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 1794607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian bool isSynthesized() const { return IsSynthesized; } 1804607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian 18158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Related to protocols declared in @protocol 18258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff void setDeclImplementation(ImplementationControl ic) { 18358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff DeclImplementation = ic; 18458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 18558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff ImplementationControl getImplementationControl() const { 186ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek return ImplementationControl(DeclImplementation); 18758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 188792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek 189792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek Stmt *getBody() const { return Body; } 19058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff void setBody(Stmt *B) { Body = B; } 191792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek 192792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek virtual Stmt* getCodeBody() const { return getBody(); } 19358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 19458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Implement isa/cast/dyncast/etc. 195a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCMethod; } 196a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCMethodDecl *D) { return true; } 19758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff}; 198b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian 199a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCInterfaceDecl - Represents an ObjC class declaration. For example: 2000c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2010c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// // MostPrimitive declares no super class (not particularly useful). 2020c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface MostPrimitive 2030c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// // no instance variables or methods. 2040c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 2050c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 206fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner/// // NSResponder inherits from NSObject & implements NSCoding (a protocol). 2070c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSResponder : NSObject <NSCoding> 208a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// { // instance variables are represented by ObjCIvarDecl. 2090c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id nextResponder; // nextResponder instance variable. 2100c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// } 2110c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSResponder *)nextResponder; // return a pointer to NSResponder. 2120c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)mouseMoved:(NSEvent *)theEvent; // return void, takes a pointer 2130c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end // to an NSEvent. 2140c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2150c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C/C++, forward class declarations are accomplished with @class. 2160c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C/C++, @class allows for a list of classes to be forward declared. 2170c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes 2180c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// typically inherit from NSObject (an exception is NSProxy). 2190c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 220b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass ObjCInterfaceDecl : public NamedDecl, public DeclContext { 2213110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff /// TypeForDecl - This indicates the Type object that represents this 2223110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff /// TypeDecl. It is a cache maintained by ASTContext::getObjCInterfaceType 2233110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff Type *TypeForDecl; 2243110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff friend class ASTContext; 225980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 226980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Class's super class. 227a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *SuperClass; 228980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 229980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Protocols referenced in interface header declaration 230a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **ReferencedProtocols; // Null if none 231c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned NumReferencedProtocols; // 0 if none 232980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 233980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Ivars/NumIvars - This is a new[]'d array of pointers to Decls. 234a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCIvarDecl **Ivars; // Null if not defined. 235f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner unsigned NumIvars; // 0 if none. 236980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 237980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// instance methods 238a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **InstanceMethods; // Null if not defined 239b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner unsigned NumInstanceMethods; // 0 if none. 240980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 241980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// class methods 242a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **ClassMethods; // Null if not defined 24362db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned NumClassMethods; // 0 if none 244980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 245980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// List of categories defined for this class. 246a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl *CategoryList; 24782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 24882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian /// class properties 249a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCPropertyDecl **PropertyDecl; // Null if no property 25055d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner unsigned NumPropertyDecl; // 0 if none. 251980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 2523a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian bool ForwardDecl:1; // declared with @class. 2533a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian bool InternalInterface:1; // true - no @interface for @implementation 25460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 255d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation ClassLoc; // location of the class identifier. 256d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation SuperClassLoc; // location of the super class identifier. 257f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation EndLoc; // marks the '>', '}', or identifier. 258f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 2590e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner 2600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCInterfaceDecl(SourceLocation atLoc, 2610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner unsigned numRefProtos, 262d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff IdentifierInfo *Id, SourceLocation CLoc, 263d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff bool FD, bool isInternal) 264b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner : NamedDecl(ObjCInterface, atLoc, Id), DeclContext(ObjCInterface), 2650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner TypeForDecl(0), SuperClass(0), 266c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian ReferencedProtocols(0), NumReferencedProtocols(0), Ivars(0), 267f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner NumIvars(0), 268b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner InstanceMethods(0), NumInstanceMethods(0), 26962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner ClassMethods(0), NumClassMethods(0), 270f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner CategoryList(0), PropertyDecl(0), NumPropertyDecl(0), 271d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff ForwardDecl(FD), InternalInterface(isInternal), 272d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff ClassLoc(CLoc) { 273980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AllocIntfRefProtocols(numRefProtos); 274980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 2758a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 2761c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek virtual ~ObjCInterfaceDecl(); 2778a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 2780e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattnerpublic: 2790e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner 2808a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek /// Destroy - Call destructors and release memory. 2818a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek virtual void Destroy(ASTContext& C); 2828a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 2830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCInterfaceDecl *Create(ASTContext &C, 2840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation atLoc, 285d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff unsigned numRefProtos, 286d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff IdentifierInfo *Id, 287d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation ClassLoc = SourceLocation(), 2880e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner bool ForwardDecl = false, 2890e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner bool isInternal = false); 290a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff 291a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff // This is necessary when converting a forward declaration to a definition. 292980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void AllocIntfRefProtocols(unsigned numRefProtos) { 293980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff if (numRefProtos) { 294a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ReferencedProtocols = new ObjCProtocolDecl*[numRefProtos]; 2957ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian memset(ReferencedProtocols, '\0', 296a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek numRefProtos*sizeof(ObjCProtocolDecl*)); 2977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumReferencedProtocols = numRefProtos; 298980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 299980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 300980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 301a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **getReferencedProtocols() const { 3027ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian return ReferencedProtocols; 3037ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian } 304c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned getNumIntfRefProtocols() const { return NumReferencedProtocols; } 305980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 306559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const; 307559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian ObjCCategoryDecl *FindCategoryDeclaration(IdentifierInfo *CategoryId) const; 308559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian ObjCIvarDecl *FindIvarDeclaration(IdentifierInfo *IvarId) const; 309559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 310aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian typedef ObjCProtocolDecl * const * protocol_iterator; 311aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian protocol_iterator protocol_begin() const { return ReferencedProtocols; } 312aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian protocol_iterator protocol_end() const { 313aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian return ReferencedProtocols+NumReferencedProtocols; 314aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian } 315aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian 316a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCIvarDecl * const *ivar_iterator; 317be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner ivar_iterator ivar_begin() const { return Ivars; } 3185564e07af5e62875f3b83fc2e5a8823588b5adeaChris Lattner ivar_iterator ivar_end() const { return Ivars + ivar_size();} 319f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner unsigned ivar_size() const { return NumIvars; } 320a0fb5861dec7aa1da0d21d5759678d76b00464f4Ted Kremenek bool ivar_empty() const { return NumIvars == 0; } 321be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner 322b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner unsigned getNumInstanceMethods() const { return NumInstanceMethods; } 32362db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned getNumClassMethods() const { return NumClassMethods; } 324980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 325a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * instmeth_iterator; 3264c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner instmeth_iterator instmeth_begin() const { return InstanceMethods; } 3274c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner instmeth_iterator instmeth_end() const { 328b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner return InstanceMethods+NumInstanceMethods; 3294c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner } 3304c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner 331a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * classmeth_iterator; 3324c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner classmeth_iterator classmeth_begin() const { return ClassMethods; } 3334c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner classmeth_iterator classmeth_end() const { 33462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return ClassMethods+NumClassMethods; 3354c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner } 3364c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner 337a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addInstanceVariablesToClass(ObjCIvarDecl **ivars, unsigned numIvars, 33860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation RBracLoc); 339980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 340a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers, 341a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, unsigned numClsMembers, 34260fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEnd); 343980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 34455d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); 34555d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner 346aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian void mergeProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); 347aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian 34833de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian void addPropertyMethods(ASTContext &Context, 34933de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCPropertyDecl* Property, 35033de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods); 35133de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian 3523dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian typedef ObjCPropertyDecl * const * classprop_iterator; 3533dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_begin() const { return PropertyDecl; } 3543dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_end() const { 3553dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian return PropertyDecl+NumPropertyDecl; 3563dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian } 35755d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner 358768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff bool isForwardDecl() const { return ForwardDecl; } 359768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff void setForwardDecl(bool val) { ForwardDecl = val; } 360980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 361a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setIntfRefProtocols(unsigned idx, ObjCProtocolDecl *OID) { 3627ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian assert((idx < NumReferencedProtocols) && "index out of range"); 3637ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 364980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 365980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 366a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *getSuperClass() const { return SuperClass; } 367a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setSuperClass(ObjCInterfaceDecl * superCls) { SuperClass = superCls; } 368980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 369a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl* getCategoryList() const { return CategoryList; } 370a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setCategoryList(ObjCCategoryDecl *category) { 37153efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner CategoryList = category; 372980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 37353efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner 37453efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner /// isSuperClassOf - Return true if this class is the specified class or is a 37553efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner /// super class of the specified interface class. 37653efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner bool isSuperClassOf(const ObjCInterfaceDecl *I) const { 37753efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner // If RHS is derived from LHS it is OK; else it is not OK. 37853efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner while (I != NULL) { 37953efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner if (this == I) 38053efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner return true; 38153efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner I = I->getSuperClass(); 38253efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner } 38353efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner return false; 38453efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner } 38553efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner 386a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *ivarName, 387a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *&clsDeclared); 388c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner 38958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local instance method declared in this interface. 39053efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner ObjCMethodDecl *getInstanceMethod(Selector Sel) { 39158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 3920e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner I != E; ++I) { 39358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 39458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 39558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 3960e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner return 0; 39758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 39858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local class method declared in this interface. 39953efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner ObjCMethodDecl *getClassMethod(Selector Sel) { 40058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 4010e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner I != E; ++I) { 40258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 40358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 40458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 4050e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner return 0; 40658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 40794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Lookup a method. First, we search locally. If a method isn't 40894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // found, we search referenced protocols and class categories. 409a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *lookupInstanceMethod(Selector Sel); 410a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *lookupClassMethod(Selector Sel); 41160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 412f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff // Location information, modeled after the Stmt API. 41360fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'interface 414f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 415f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 41660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 417d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation getClassLoc() const { return ClassLoc; } 418d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff void setSuperClassLoc(SourceLocation Loc) { SuperClassLoc = Loc; } 419d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation getSuperClassLoc() const { return SuperClassLoc; } 420d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff 42160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff // We also need to record the @end location. 422f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 42382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 424f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner unsigned getNumPropertyDecl() const { return NumPropertyDecl; } 42582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 42655d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; } 427a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; } 428f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff 4294b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian /// ImplicitInterfaceDecl - check that this is an implicitely declared 430a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek /// ObjCInterfaceDecl node. This is for legacy objective-c @implementation 4314b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian /// declaration without an @interface declaration. 4323a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian bool ImplicitInterfaceDecl() const { return InternalInterface; } 4334b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian 434a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCInterface; } 435a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCInterfaceDecl *D) { return true; } 436980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 437980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 438a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCIvarDecl - Represents an ObjC instance variable. In general, ObjC 4390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C 4400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example: 4410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 4420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface IvarExample : NSObject 4430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// { 4440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id defaultToPrivate; // same as C++. 4450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @public: 4460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBePublic; // same as C++. 4470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protected: 4480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBeProtected; // same as C++. 4490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @package: 4500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBePackage; // framework visibility (not available in C++). 4510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// } 4520c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 453a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCIvarDecl : public FieldDecl { 454b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner ObjCIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T) 455b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner : FieldDecl(ObjCIvar, L, Id, T) {} 4560e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattnerpublic: 457b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner static ObjCIvarDecl *Create(ASTContext &C, SourceLocation L, 4580e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner IdentifierInfo *Id, QualType T); 459980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 460980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff enum AccessControl { 461980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff None, Private, Protected, Public, Package 462980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff }; 463980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setAccessControl(AccessControl ac) { DeclAccess = ac; } 464ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek AccessControl getAccessControl() const { return AccessControl(DeclAccess); } 465980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 466980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff // Implement isa/cast/dyncast/etc. 467a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCIvar; } 468a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCIvarDecl *D) { return true; } 469980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate: 470ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek // NOTE: VC++ treats enums as signed, avoid using the AccessControl enum 471ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek unsigned DeclAccess : 3; 472980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 473980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 474980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 475a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCProtocolDecl - Represents a protocol declaration. ObjC protocols 4760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted). 4770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++ 4780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example: 4790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 480eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// @protocol NSDraggingInfo <refproto1, refproto2> 4810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow; 4820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage; 4830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 4840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 485eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// This says that NSDraggingInfo requires two methods and requires everything 486eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// that the two "referenced protocols" 'refproto1' and 'refproto2' require as 487eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// well. 488eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// 4890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo> 4900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 4910c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 492a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjC protocols inspired Java interfaces. Unlike Java, ObjC classes and 4930c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both 4940c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result, 4950c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows: 4960c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 4970c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo; 4980c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 499a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCProtocolDecl : public NamedDecl { 500980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// referenced protocols 501a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **ReferencedProtocols; // Null if none 502c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned NumReferencedProtocols; // 0 if none 503980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 504980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// protocol instance methods 505a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **InstanceMethods; // Null if not defined 50662db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned NumInstanceMethods; // 0 if none 507980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 508980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// protocol class methods 509a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **ClassMethods; // Null if not defined 51062db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned NumClassMethods; // 0 if none 5113dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5123dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian /// protocol properties 5133dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian ObjCPropertyDecl **PropertyDecl; // Null if no property 5143dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian unsigned NumPropertyDecl; // 0 if none 5153dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 516980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff bool isForwardProtoDecl; // declared with @protocol. 517423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 518423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation EndLoc; // marks the '>' or identifier. 519423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 520cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner 521c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner ObjCProtocolDecl(SourceLocation L, unsigned numRefProtos, IdentifierInfo *Id) 522a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : NamedDecl(ObjCProtocol, L, Id), 523c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian ReferencedProtocols(0), NumReferencedProtocols(0), 52462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner InstanceMethods(0), NumInstanceMethods(0), 52562db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner ClassMethods(0), NumClassMethods(0), 5263dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian PropertyDecl(0), NumPropertyDecl(0), 527c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner isForwardProtoDecl(true) { 528cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner AllocReferencedProtocols(numRefProtos); 529cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner } 5301c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 5311c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek virtual ~ObjCProtocolDecl(); 5321c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 533cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattnerpublic: 5341c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 5351c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek /// Destroy - Call destructors and release memory. 5361c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek virtual void Destroy(ASTContext& C); 5371c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 538cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner static ObjCProtocolDecl *Create(ASTContext &C, SourceLocation L, 539c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner unsigned numRefProtos, IdentifierInfo *Id); 540cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner 541980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void AllocReferencedProtocols(unsigned numRefProtos) { 542980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff if (numRefProtos) { 543a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ReferencedProtocols = new ObjCProtocolDecl*[numRefProtos]; 544980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff memset(ReferencedProtocols, '\0', 545a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek numRefProtos*sizeof(ObjCProtocolDecl*)); 546980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff NumReferencedProtocols = numRefProtos; 547980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 548980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 549a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers, 550a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, unsigned numClsMembers, 55160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEndLoc); 552980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 553a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setReferencedProtocols(unsigned idx, ObjCProtocolDecl *OID) { 554980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff assert((idx < NumReferencedProtocols) && "index out of range"); 555980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ReferencedProtocols[idx] = OID; 556980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 557980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 558a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl** getReferencedProtocols() const { 559980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff return ReferencedProtocols; 560980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 561c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned getNumReferencedProtocols() const { return NumReferencedProtocols; } 562aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian typedef ObjCProtocolDecl * const * protocol_iterator; 563aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian protocol_iterator protocol_begin() const { return ReferencedProtocols; } 564aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian protocol_iterator protocol_end() const { 565aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian return ReferencedProtocols+NumReferencedProtocols; 566aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian } 567aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian 568c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner unsigned getNumInstanceMethods() const { return NumInstanceMethods; } 56962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned getNumClassMethods() const { return NumClassMethods; } 5703d2c22b1d334fa74d26a5f21841cb55df5dfdd1aSteve Naroff 5713d2c22b1d334fa74d26a5f21841cb55df5dfdd1aSteve Naroff ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const; 5723dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5733dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian unsigned getNumPropertyDecl() const { return NumPropertyDecl; } 5743dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5753dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; } 5763dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; } 5773dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5783dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); 5793dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5803dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian typedef ObjCPropertyDecl * const * classprop_iterator; 5813dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_begin() const { return PropertyDecl; } 5823dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_end() const { 5833dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian return PropertyDecl+NumPropertyDecl; 5843dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian } 58558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 586a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * instmeth_iterator; 58758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff instmeth_iterator instmeth_begin() const { return InstanceMethods; } 58858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff instmeth_iterator instmeth_end() const { 58962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return InstanceMethods+NumInstanceMethods; 59058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 59158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 592a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * classmeth_iterator; 59358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff classmeth_iterator classmeth_begin() const { return ClassMethods; } 59458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff classmeth_iterator classmeth_end() const { 59562db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return ClassMethods+NumClassMethods; 59658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 59758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 59858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local instance method declared in this interface. 59962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner ObjCMethodDecl *getInstanceMethod(Selector Sel) { 60062db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 60162db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner I != E; ++I) { 60258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 60358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 60458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 60562db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return 0; 60658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 60758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local class method declared in this interface. 60862db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner ObjCMethodDecl *getClassMethod(Selector Sel) { 60958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 61062db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner I != E; ++I) { 61158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 61258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 61358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 61462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return 0; 61558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 616980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 61794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Lookup a method. First, we search locally. If a method isn't 61894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // found, we search referenced protocols and class categories. 619a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *lookupInstanceMethod(Selector Sel); 620a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *lookupClassMethod(Selector Sel); 6217dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian 622768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff bool isForwardDecl() const { return isForwardProtoDecl; } 623768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff void setForwardDecl(bool val) { isForwardProtoDecl = val; } 624980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 625423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // Location information, modeled after the Stmt API. 626423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'protocol 627423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocEnd() const { return EndLoc; } 628423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 629423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 630423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // We also need to record the @end location. 631423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 632423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 633a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCProtocol; } 634a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCProtocolDecl *D) { return true; } 635980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 636980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 637a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCClassDecl - Specifies a list of forward class declarations. For example: 63806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// 63906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow; 6400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 641a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCClassDecl : public Decl { 642a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl **ForwardDecls; 6437e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner unsigned NumForwardDecls; 64461f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 645a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCClassDecl(SourceLocation L, ObjCInterfaceDecl **Elts, unsigned nElts) 646a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : Decl(ObjCClass, L) { 64706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff if (nElts) { 648a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ForwardDecls = new ObjCInterfaceDecl*[nElts]; 649a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(ForwardDecls, Elts, nElts*sizeof(ObjCInterfaceDecl*)); 6507e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner } else { 6517e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner ForwardDecls = 0; 65206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 65306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff NumForwardDecls = nElts; 65406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 655400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 656400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek virtual ~ObjCClassDecl(); 657400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 65861f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic: 659400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 660400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek /// Destroy - Call destructors and release memory. 661400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek virtual void Destroy(ASTContext& C); 662400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 66361f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner static ObjCClassDecl *Create(ASTContext &C, SourceLocation L, 66461f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner ObjCInterfaceDecl **Elts, unsigned nElts); 66561f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 666a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setInterfaceDecl(unsigned idx, ObjCInterfaceDecl *OID) { 6677e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner assert(idx < NumForwardDecls && "index out of range"); 66806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff ForwardDecls[idx] = OID; 66906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 670a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl** getForwardDecls() const { return ForwardDecls; } 6717e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff int getNumForwardDecls() const { return NumForwardDecls; } 6727e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff 673400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek typedef ObjCInterfaceDecl * const * iterator; 674400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek iterator begin() const { return ForwardDecls; } 675400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek iterator end() const { return ForwardDecls+NumForwardDecls; } 676400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 677a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCClass; } 678a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCClassDecl *D) { return true; } 67906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff}; 68006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff 681a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCForwardProtocolDecl - Specifies a list of forward protocol declarations. 68206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example: 68306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// 6840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo; 6850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 686a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCForwardProtocolDecl : public Decl { 687a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **ReferencedProtocols; 6889fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner unsigned NumReferencedProtocols; 68961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 6900ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCForwardProtocolDecl(SourceLocation L, 691a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **Elts, unsigned nElts) 692a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : Decl(ObjCForwardProtocol, L) { 693b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner NumReferencedProtocols = nElts; 69406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff if (nElts) { 695a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ReferencedProtocols = new ObjCProtocolDecl*[nElts]; 696a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjCProtocolDecl*)); 6979fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } else { 6989fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner ReferencedProtocols = 0; 699980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 70006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 70105ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek 70205ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek virtual ~ObjCForwardProtocolDecl(); 70305ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek 70461f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic: 70561f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner static ObjCForwardProtocolDecl *Create(ASTContext &C, SourceLocation L, 70661f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner ObjCProtocolDecl **Elts, unsigned Num); 70761f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 70861f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 709a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setForwardProtocolDecl(unsigned idx, ObjCProtocolDecl *OID) { 7109fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 7117ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 71206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 7139fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 7149fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner unsigned getNumForwardDecls() const { return NumReferencedProtocols; } 7159fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 716a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl *getForwardProtocolDecl(unsigned idx) { 7179fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 7189fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner return ReferencedProtocols[idx]; 7199fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } 720a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek const ObjCProtocolDecl *getForwardProtocolDecl(unsigned idx) const { 7219fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 7229fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner return ReferencedProtocols[idx]; 7239fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } 7249fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 72505ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek typedef ObjCProtocolDecl * const * iterator; 72605ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek iterator begin() const { return ReferencedProtocols; } 72705ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek iterator end() const { return ReferencedProtocols+NumReferencedProtocols; } 72805ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek 72906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff static bool classof(const Decl *D) { 730a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek return D->getKind() == ObjCForwardProtocol; 73106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 732a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCForwardProtocolDecl *D) { return true; } 733980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 734980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 735a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCategoryDecl - Represents a category declaration. A category allows 7360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying 7370c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow 7380c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all 7390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process: 7400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 7410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods) 7420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod; 7430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 7440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 7450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across 7460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++). 7470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 7480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common 74968c82cf61228102aba1194efef222fa1478af2a8Chris Lattner/// Lisp and Smalltalk. More traditional class-based languages (C++, Java) 7500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous. 7510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 752a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCCategoryDecl : public NamedDecl { 753980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Interface belonging to this category 754a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *ClassInterface; 755980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 75668c82cf61228102aba1194efef222fa1478af2a8Chris Lattner /// referenced protocols in this category. 757a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **ReferencedProtocols; // Null if none 758c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned NumReferencedProtocols; // 0 if none 759980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 760980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// category instance methods 761a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **InstanceMethods; // Null if not defined 762c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner unsigned NumInstanceMethods; // 0 if none 763980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 764980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// category class methods 765a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **ClassMethods; // Null if not defined 766a906135721c350435319347d2672bbb3bf494f91Chris Lattner unsigned NumClassMethods; // 0 if not defined 767980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 768980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Next category belonging to this class 769a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl *NextClassCategory; 770ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian 7717e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian /// category properties 7727e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian ObjCPropertyDecl **PropertyDecl; // Null if no property 7737e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian unsigned NumPropertyDecl; // 0 if none 7747e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian 775423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation EndLoc; // marks the '>' or identifier. 776423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 77761f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 77868c82cf61228102aba1194efef222fa1478af2a8Chris Lattner ObjCCategoryDecl(SourceLocation L, IdentifierInfo *Id) 779a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : NamedDecl(ObjCCategory, L, Id), 780c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(0), 781c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner InstanceMethods(0), NumInstanceMethods(0), 782a906135721c350435319347d2672bbb3bf494f91Chris Lattner ClassMethods(0), NumClassMethods(0), 7837e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian NextClassCategory(0), PropertyDecl(0), NumPropertyDecl(0) { 784a906135721c350435319347d2672bbb3bf494f91Chris Lattner } 78561f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic: 78661f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 7870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCCategoryDecl *Create(ASTContext &C, 7880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id); 78961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 790e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ObjCInterfaceDecl *getClassInterface() { return ClassInterface; } 791e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; } 792a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setClassInterface(ObjCInterfaceDecl *IDecl) { ClassInterface = IDecl; } 793980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 79468c82cf61228102aba1194efef222fa1478af2a8Chris Lattner void setReferencedProtocolList(ObjCProtocolDecl **List, unsigned NumRPs); 79568c82cf61228102aba1194efef222fa1478af2a8Chris Lattner 796a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setCatReferencedProtocols(unsigned idx, ObjCProtocolDecl *OID) { 7977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian assert((idx < NumReferencedProtocols) && "index out of range"); 7987ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 799980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 800980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 801a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **getReferencedProtocols() const { 8027ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian return ReferencedProtocols; 8038f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian } 804c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned getNumReferencedProtocols() const { return NumReferencedProtocols; } 805c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner unsigned getNumInstanceMethods() const { return NumInstanceMethods; } 806a906135721c350435319347d2672bbb3bf494f91Chris Lattner unsigned getNumClassMethods() const { return NumClassMethods; } 80758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 8087e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian unsigned getNumPropertyDecl() const { return NumPropertyDecl; } 8097e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian 8107e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; } 8117e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian 8123dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); 8133dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 814559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const; 815559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 8163dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian typedef ObjCPropertyDecl * const * classprop_iterator; 8173dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_begin() const { return PropertyDecl; } 8183dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_end() const { 8193dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian return PropertyDecl+NumPropertyDecl; 8203dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian } 8213dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 822a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * instmeth_iterator; 82358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff instmeth_iterator instmeth_begin() const { return InstanceMethods; } 82458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff instmeth_iterator instmeth_end() const { 825c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner return InstanceMethods+NumInstanceMethods; 82658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 82758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 828a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * classmeth_iterator; 82958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff classmeth_iterator classmeth_begin() const { return ClassMethods; } 83058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff classmeth_iterator classmeth_end() const { 831a906135721c350435319347d2672bbb3bf494f91Chris Lattner return ClassMethods+NumClassMethods; 83258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 83358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 83458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local instance method declared in this interface. 83568c82cf61228102aba1194efef222fa1478af2a8Chris Lattner ObjCMethodDecl *getInstanceMethod(Selector Sel) { 83658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 83768c82cf61228102aba1194efef222fa1478af2a8Chris Lattner I != E; ++I) { 83858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 83958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 84058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 84168c82cf61228102aba1194efef222fa1478af2a8Chris Lattner return 0; 84258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 84358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local class method declared in this interface. 84468c82cf61228102aba1194efef222fa1478af2a8Chris Lattner ObjCMethodDecl *getClassMethod(Selector Sel) { 84558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 84668c82cf61228102aba1194efef222fa1478af2a8Chris Lattner I != E; ++I) { 84758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 84858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 84958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 85068c82cf61228102aba1194efef222fa1478af2a8Chris Lattner return 0; 85158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 8528f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 853a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers, 854a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, unsigned numClsMembers, 85560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEndLoc); 856980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 857a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl *getNextClassCategory() const { return NextClassCategory; } 858980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void insertNextClassCategory() { 8593d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff NextClassCategory = ClassInterface->getCategoryList(); 8603d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff ClassInterface->setCategoryList(this); 861980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 862423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // Location information, modeled after the Stmt API. 863423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'interface 864423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocEnd() const { return EndLoc; } 865423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 866423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 867423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // We also need to record the @end location. 868423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 869ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian 870a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCCategory; } 871a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCCategoryDecl *D) { return true; } 872980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 8730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff 874a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCategoryImplDecl - An object of this class encapsulates a category 875559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @implementation declaration. If a category class has declaration of a 876559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// property, its implementation must be specified in the category's 877559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @implementation declaration. Example: 878559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @interface I @end 879559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @interface I(CATEGORY) 880559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @property int p1, d1; 881559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @end 882559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @implementation I(CATEGORY) 883559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @dynamic p1,d1; 884559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @end 885559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// 886a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCCategoryImplDecl : public NamedDecl { 8878f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian /// Class interface for this category implementation 888a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *ClassInterface; 8898f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 890e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff /// implemented instance methods 891a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek llvm::SmallVector<ObjCMethodDecl*, 32> InstanceMethods; 8928f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 893e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff /// implemented class methods 894a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek llvm::SmallVector<ObjCMethodDecl*, 32> ClassMethods; 895f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 896559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian /// Property Implementations in this category 897f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian llvm::SmallVector<ObjCPropertyImplDecl*, 8> PropertyImplementations; 898e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 899e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff SourceLocation EndLoc; 90075c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner 901a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryImplDecl(SourceLocation L, IdentifierInfo *Id, 902a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *classInterface) 903a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : NamedDecl(ObjCCategoryImpl, L, Id), ClassInterface(classInterface) {} 90475c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattnerpublic: 9050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCCategoryImplDecl *Create(ASTContext &C, 9060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 90775c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner ObjCInterfaceDecl *classInterface); 9088f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 909e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; } 910e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ObjCInterfaceDecl *getClassInterface() { return ClassInterface; } 9118f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 912ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner unsigned getNumInstanceMethods() const { return InstanceMethods.size(); } 913ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner unsigned getNumClassMethods() const { return ClassMethods.size(); } 914e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 915a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addInstanceMethod(ObjCMethodDecl *method) { 916e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff InstanceMethods.push_back(method); 917e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff } 918a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addClassMethod(ObjCMethodDecl *method) { 919e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff ClassMethods.push_back(method); 920f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian } 92194a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Get the instance method definition for this implementation. 922a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *getInstanceMethod(Selector Sel); 92394a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff 92494a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Get the class method definition for this implementation. 925a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *getClassMethod(Selector Sel); 926f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 927f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian void addPropertyImplementation(ObjCPropertyImplDecl *property) { 928f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian PropertyImplementations.push_back(property); 929f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian } 930e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 931f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian unsigned getNumPropertyImplementations() const 932f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian { return PropertyImplementations.size(); } 933f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 934559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 935559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian typedef llvm::SmallVector<ObjCPropertyImplDecl*, 8>::const_iterator 936559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator; 937559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator propimpl_begin() const { 938559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return PropertyImplementations.begin(); 939559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian } 940559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator propimpl_end() const { 941559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return PropertyImplementations.end(); 942559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian } 943559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 944a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator 945ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner instmeth_iterator; 946ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); } 947ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner instmeth_iterator instmeth_end() const { return InstanceMethods.end(); } 948ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner 949a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator 950ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner classmeth_iterator; 951ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); } 952ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner classmeth_iterator classmeth_end() const { return ClassMethods.end(); } 953ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner 954ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner 955e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff // Location information, modeled after the Stmt API. 956e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff SourceLocation getLocStart() const { return getLocation(); } 957e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 958e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 959e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 960a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCCategoryImpl;} 961a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCCategoryImplDecl *D) { return true; } 9628f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian}; 9638f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 964a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCImplementationDecl - Represents a class definition - this is where 9650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example: 9660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 9670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass 9680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ } 9690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 9700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 9710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface, 9720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we 9730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When 9740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we 9750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing 9760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations 9770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-) 9780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 979a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCImplementationDecl : public NamedDecl { 980dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian /// Class interface for this implementation 981a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *ClassInterface; 982f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian 983980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Implementation Class's super class. 984a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *SuperClass; 985980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 986980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls. 987a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCIvarDecl **Ivars; // Null if not specified 988f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner unsigned NumIvars; // 0 if none. 9890416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff 990980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// implemented instance methods 991a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek llvm::SmallVector<ObjCMethodDecl*, 32> InstanceMethods; 9920416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff 993980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// implemented class methods 994a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek llvm::SmallVector<ObjCMethodDecl*, 32> ClassMethods; 9950416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff 996f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian /// Propertys' being implemented 997f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian llvm::SmallVector<ObjCPropertyImplDecl*, 8> PropertyImplementations; 998f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 9990416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff SourceLocation EndLoc; 100075c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner 1001a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCImplementationDecl(SourceLocation L, IdentifierInfo *Id, 1002a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *classInterface, 1003a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *superDecl) 1004a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : NamedDecl(ObjCImplementation, L, Id), 10050416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff ClassInterface(classInterface), SuperClass(superDecl), 1006f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner Ivars(0), NumIvars(0) {} 100775c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattnerpublic: 10080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCImplementationDecl *Create(ASTContext &C, 10090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 101075c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner ObjCInterfaceDecl *classInterface, 101175c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner ObjCInterfaceDecl *superDecl); 101275c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner 1013980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1014a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void ObjCAddInstanceVariablesToClassImpl(ObjCIvarDecl **ivars, 1015980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff unsigned numIvars); 1016980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1017a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addInstanceMethod(ObjCMethodDecl *method) { 10180416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff InstanceMethods.push_back(method); 10190416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff } 1020a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addClassMethod(ObjCMethodDecl *method) { 10210416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff ClassMethods.push_back(method); 10220416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff } 1023f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 1024f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian void addPropertyImplementation(ObjCPropertyImplDecl *property) { 1025f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian PropertyImplementations.push_back(property); 1026f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian } 1027559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian typedef llvm::SmallVector<ObjCPropertyImplDecl*, 8>::const_iterator 1028559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator; 1029559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator propimpl_begin() const { 1030559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return PropertyImplementations.begin(); 1031559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian } 1032559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator propimpl_end() const { 1033559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return PropertyImplementations.end(); 1034559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian } 1035f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 10360416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff // Location information, modeled after the Stmt API. 10370416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff SourceLocation getLocStart() const { return getLocation(); } 10380416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 10390416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 10400416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff 1041e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; } 1042e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ObjCInterfaceDecl *getClassInterface() { return ClassInterface; } 1043e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ObjCInterfaceDecl *getSuperClass() const { return SuperClass; } 1044e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ObjCInterfaceDecl *getSuperClass() { return SuperClass; } 1045980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1046f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner void setSuperClass(ObjCInterfaceDecl * superCls) { SuperClass = superCls; } 1047980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1048b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner unsigned getNumInstanceMethods() const { return InstanceMethods.size(); } 104962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned getNumClassMethods() const { return ClassMethods.size(); } 1050f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 1051f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian unsigned getNumPropertyImplementations() const 1052f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian { return PropertyImplementations.size(); } 1053c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff 1054a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator 10550157c5144513438bb74aebf50d18f95df4104acbChris Lattner instmeth_iterator; 10560157c5144513438bb74aebf50d18f95df4104acbChris Lattner instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); } 10570157c5144513438bb74aebf50d18f95df4104acbChris Lattner instmeth_iterator instmeth_end() const { return InstanceMethods.end(); } 10580157c5144513438bb74aebf50d18f95df4104acbChris Lattner 1059a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator 10600157c5144513438bb74aebf50d18f95df4104acbChris Lattner classmeth_iterator; 10610157c5144513438bb74aebf50d18f95df4104acbChris Lattner classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); } 10620157c5144513438bb74aebf50d18f95df4104acbChris Lattner classmeth_iterator classmeth_end() const { return ClassMethods.end(); } 10630157c5144513438bb74aebf50d18f95df4104acbChris Lattner 106494a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Get the instance method definition for this implementation. 1065a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *getInstanceMethod(Selector Sel); 10660157c5144513438bb74aebf50d18f95df4104acbChris Lattner 106794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Get the class method definition for this implementation. 1068a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *getClassMethod(Selector Sel); 10690157c5144513438bb74aebf50d18f95df4104acbChris Lattner 1070a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCIvarDecl * const *ivar_iterator; 10710157c5144513438bb74aebf50d18f95df4104acbChris Lattner ivar_iterator ivar_begin() const { return Ivars; } 1072f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner ivar_iterator ivar_end() const { return Ivars+NumIvars; } 1073f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner unsigned ivar_size() const { return NumIvars; } 1074f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner bool ivar_empty() const { return NumIvars == 0; } 10750157c5144513438bb74aebf50d18f95df4104acbChris Lattner 1076980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const Decl *D) { 1077a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek return D->getKind() == ObjCImplementation; 1078980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 1079a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCImplementationDecl *D) { return true; } 1080980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 1081243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 1082a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCompatibleAliasDecl - Represents alias of a class. This alias is 1083243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class. 1084e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroffclass ObjCCompatibleAliasDecl : public NamedDecl { 1085243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian /// Class that this is an alias of. 1086a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *AliasedClass; 1087243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 1088a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id, 1089e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroff ObjCInterfaceDecl* aliasedClass) 1090e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroff : NamedDecl(ObjCCompatibleAlias, L, Id), AliasedClass(aliasedClass) {} 1091f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattnerpublic: 10920ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCCompatibleAliasDecl *Create(ASTContext &C, 10930ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 1094f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner ObjCInterfaceDecl* aliasedClass); 1095f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner 1096f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner const ObjCInterfaceDecl *getClassInterface() const { return AliasedClass; } 1097f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner ObjCInterfaceDecl *getClassInterface() { return AliasedClass; } 1098980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1099243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian static bool classof(const Decl *D) { 11008a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner return D->getKind() == ObjCCompatibleAlias; 1101243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian } 1102a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCCompatibleAliasDecl *D) { return true; } 1103243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 1104243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian}; 11051de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian 11061de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// ObjCPropertyDecl - Represents one property declaration in an interface. 11071de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// For example: 11081de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// @property (assign, readwrite) int MyProperty; 11091de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// 11101de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanianclass ObjCPropertyDecl : public NamedDecl { 111182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic: 1112a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner enum PropertyAttributeKind { 1113a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_noattr = 0x00, 1114a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_readonly = 0x01, 1115a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_getter = 0x02, 1116a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_assign = 0x04, 1117a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_readwrite = 0x08, 1118a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_retain = 0x10, 1119a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_copy = 0x20, 1120a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_nonatomic = 0x40, 1121a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_setter = 0x80 1122a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner }; 112346b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian 112446b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian enum PropertyControl { None, Required, Optional }; 112582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianprivate: 1126dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian QualType DeclType; 1127ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek unsigned PropertyAttributes : 8; 112882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 112946b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian // @required/@optional 113046b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian unsigned PropertyImplementation : 2; 113146b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian 11325251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian Selector GetterName; // getter name of NULL if no getter 11335251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian Selector SetterName; // setter name of NULL if no setter 113482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 113533de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCMethodDecl *GetterMethodDecl; // Declaration of getter instance method 113633de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCMethodDecl *SetterMethodDecl; // Declaration of setter instance method 113733de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian 11381de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian ObjCPropertyDecl(SourceLocation L, IdentifierInfo *Id, QualType T) 11391de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian : NamedDecl(ObjCProperty, L, Id), DeclType(T), 114033de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian PropertyAttributes(OBJC_PR_noattr), PropertyImplementation(None), 114133de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian GetterName(Selector()), 114233de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian SetterName(Selector()), 114333de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian GetterMethodDecl(0), SetterMethodDecl(0) {} 1144f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattnerpublic: 11451de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L, 114646b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian IdentifierInfo *Id, QualType T, 114746b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian PropertyControl propControl = None); 1148dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian QualType getType() const { return DeclType; } 1149c35b9e4e2efad727538c848cf30d4b0eb1031dc9Fariborz Jahanian QualType getCanonicalType() const { return DeclType.getCanonicalType(); } 1150c35b9e4e2efad727538c848cf30d4b0eb1031dc9Fariborz Jahanian 1151a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner PropertyAttributeKind getPropertyAttributes() const { 1152f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner return PropertyAttributeKind(PropertyAttributes); 1153f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner } 1154564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian void setPropertyAttributes(PropertyAttributeKind PRVal) { 1155a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner PropertyAttributes |= PRVal; 115682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian } 115782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 11585251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian Selector getGetterName() const { return GetterName; } 11595251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian void setGetterName(Selector Sel) { GetterName = Sel; } 116082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 11615251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian Selector getSetterName() const { return SetterName; } 11625251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian void setSetterName(Selector Sel) { SetterName = Sel; } 116382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 116433de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCMethodDecl *getGetterMethodDecl() const { return GetterMethodDecl; } 116533de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian void setGetterMethodDecl(ObjCMethodDecl *gDecl) { GetterMethodDecl = gDecl; } 116633de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian 116733de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCMethodDecl *getSetterMethodDecl() const { return SetterMethodDecl; } 116833de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian void setSetterMethodDecl(ObjCMethodDecl *gDecl) { SetterMethodDecl = gDecl; } 116933de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian 117046b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian // Related to @optional/@required declared in @protocol 117146b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian void setPropertyImplementation(PropertyControl pc) { 117246b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian PropertyImplementation = pc; 117346b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian } 117446b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian PropertyControl getPropertyImplementation() const { 117546b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian return PropertyControl(PropertyImplementation); 117646b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian } 117746b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian 117882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian static bool classof(const Decl *D) { 1179670aa9d7639278f507930e95dc89c12032ab7c7eSam Bishop return D->getKind() == ObjCProperty; 118082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian } 1181a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCPropertyDecl *D) { return true; } 118282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian}; 1183980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 118461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// ObjCPropertyImplDecl - Represents implementation declaration of a property 118561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// in a class or category implementation block. For example: 118661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// @synthesize prop1 = ivar1; 118761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// 118861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianclass ObjCPropertyImplDecl : public Decl { 118961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianpublic: 119061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian enum PropertyImplKind { 119161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian OBJC_PR_IMPL_None, 119261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian OBJC_PR_IMPL_SYNTHSIZE, 119361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian OBJC_PR_IMPL_DYNAMIC 119461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian }; 119561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianprivate: 1196559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian SourceLocation AtLoc; // location of @synthesize or @dynamic 119761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian /// Property declaration being implemented 119861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian ObjCPropertyDecl *PropertyDecl; 119961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian PropertyImplKind PropertyImplementation; 120061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian /// Null for @dynamic. Required for @synthesize. 120161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian ObjCIvarDecl *PropertyIvarDecl; 120261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianpublic: 1203628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCPropertyImplDecl(SourceLocation atLoc, SourceLocation L, 1204628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCPropertyDecl *property, 1205628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian PropertyImplKind propertyKind, 1206628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCIvarDecl *ivarDecl) 1207628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian : Decl(ObjCPropertyImpl, L), AtLoc(atLoc), PropertyDecl(property), 1208628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian PropertyImplementation(propertyKind), PropertyIvarDecl(ivarDecl){} 1209628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian 1210628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian static ObjCPropertyImplDecl *Create(ASTContext &C, SourceLocation atLoc, 1211628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian SourceLocation L, 1212628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCPropertyDecl *property, 1213628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian PropertyImplKind propertyKind, 1214628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCIvarDecl *ivarDecl); 121561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 121661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian void setPropertyDecl(ObjCPropertyDecl *property) { PropertyDecl = property; } 121761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian ObjCPropertyDecl *getPropertyDecl() const { return PropertyDecl; } 121861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 121961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian void setImplKind (PropertyImplKind propImplKind) 122061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian { PropertyImplementation = propImplKind; } 122161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian PropertyImplKind getPropertyImplementation() const 122261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian { return PropertyImplementation; } 122361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 122461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian void setPropertyIvarDecl(ObjCIvarDecl *ivarDecl) 122561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian { PropertyIvarDecl = ivarDecl; } 122661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian ObjCIvarDecl *getPropertyIvarDecl() { return PropertyIvarDecl; } 122761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 122861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian static bool classof(const Decl *D) { 122961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian return D->getKind() == ObjCPropertyImpl; 123061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian } 123161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian static bool classof(const ObjCPropertyImplDecl *D) { return true; } 123261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian}; 123361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 1234980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff} // end namespace clang 1235980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif 1236