DeclObjC.h revision 05ac3ef08f9d06e0a4439073c9edabf7f912f946
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; 9458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff ParmVarDecl *SelfDecl; 956c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 96a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl(SourceLocation beginLoc, SourceLocation endLoc, 9758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff Selector SelInfo, QualType T, 9858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff Decl *contextDecl, 9958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff AttributeList *M = 0, bool isInstance = true, 10058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff bool isVariadic = false, 1014607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian bool isSynthesized = false, 10258cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner ImplementationControl impControl = None) 103a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : Decl(ObjCMethod, beginLoc), 104b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner DeclContext(ObjCMethod), 10558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff IsInstance(isInstance), IsVariadic(isVariadic), 1064607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian IsSynthesized(isSynthesized), 10758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None), 10858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff MethodContext(static_cast<NamedDecl*>(contextDecl)), 10958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff SelName(SelInfo), MethodDeclType(T), 110b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner ParamInfo(0), NumMethodParams(0), 11158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {} 1128a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 1131c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek virtual ~ObjCMethodDecl(); 1141c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 1156c4ae5de0c356777446f823b573821fb95560d91Chris Lattnerpublic: 1168a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 1178a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek /// Destroy - Call destructors and release memory. 1188a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek virtual void Destroy(ASTContext& C); 1196c4ae5de0c356777446f823b573821fb95560d91Chris Lattner 1200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCMethodDecl *Create(ASTContext &C, 1210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation beginLoc, 1226c4ae5de0c356777446f823b573821fb95560d91Chris Lattner SourceLocation endLoc, Selector SelInfo, 1236c4ae5de0c356777446f823b573821fb95560d91Chris Lattner QualType T, Decl *contextDecl, 1246c4ae5de0c356777446f823b573821fb95560d91Chris Lattner AttributeList *M = 0, bool isInstance = true, 1256c4ae5de0c356777446f823b573821fb95560d91Chris Lattner bool isVariadic = false, 1264607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian bool isSynthesized = false, 127b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner ImplementationControl impControl = None); 12858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 129ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek ObjCDeclQualifier getObjCDeclQualifier() const { 130ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek return ObjCDeclQualifier(objcDeclQualifier); 131ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek } 132a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setObjCDeclQualifier(ObjCDeclQualifier QV) { objcDeclQualifier = QV; } 13358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 13458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Location information, modeled after the Stmt API. 13558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff SourceLocation getLocStart() const { return getLocation(); } 13658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 13758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 13858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff NamedDecl *getMethodContext() const { return MethodContext; } 13958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 1405619688510185081cbb4621d703daf7ee24cf39aChris Lattner ObjCInterfaceDecl *getClassInterface(); 1415619688510185081cbb4621d703daf7ee24cf39aChris Lattner const ObjCInterfaceDecl *getClassInterface() const { 1425619688510185081cbb4621d703daf7ee24cf39aChris Lattner return const_cast<ObjCMethodDecl*>(this)->getClassInterface(); 143e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner } 14458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 14558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff Selector getSelector() const { return SelName; } 146faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian unsigned getSynthesizedMethodSize() const; 14758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff QualType getResultType() const { return MethodDeclType; } 14858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 149d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner // Iterator access to formal parameters. 15058cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner unsigned param_size() const { return NumMethodParams; } 151d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner typedef ParmVarDecl **param_iterator; 152d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner typedef ParmVarDecl * const *param_const_iterator; 153d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner param_iterator param_begin() { return ParamInfo; } 154d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner param_iterator param_end() { return ParamInfo+param_size(); } 155d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner param_const_iterator param_begin() const { return ParamInfo; } 156d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner param_const_iterator param_end() const { return ParamInfo+param_size(); } 157d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner 15858cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner unsigned getNumParams() const { return NumMethodParams; } 15958cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner ParmVarDecl *getParamDecl(unsigned i) const { 16058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff assert(i < getNumParams() && "Illegal param #"); 16158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return ParamInfo[i]; 16258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 1632338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian void setParamDecl(int i, ParmVarDecl *pDecl) { 1642338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian ParamInfo[i] = pDecl; 1652338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian } 16658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams); 16758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 16858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff AttributeList *getMethodAttrs() const {return MethodAttrs;} 16958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff bool isInstance() const { return IsInstance; } 17058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff bool isVariadic() const { return IsVariadic; } 17158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 1724607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian bool isSynthesized() const { return IsSynthesized; } 1734607034e621aa77378ec75249d1e9eaf5de49b6aFariborz Jahanian 17458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Related to protocols declared in @protocol 17558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff void setDeclImplementation(ImplementationControl ic) { 17658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff DeclImplementation = ic; 17758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 17858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff ImplementationControl getImplementationControl() const { 179ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek return ImplementationControl(DeclImplementation); 18058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 181e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner Stmt *getBody() { return Body; } 182e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const Stmt *getBody() const { return Body; } 18358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff void setBody(Stmt *B) { Body = B; } 18458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 185e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ParmVarDecl *getSelfDecl() const { return SelfDecl; } 186e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ParmVarDecl *getSelfDecl() { return SelfDecl; } 18758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff void setSelfDecl(ParmVarDecl *PVD) { SelfDecl = PVD; } 18858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 18958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Implement isa/cast/dyncast/etc. 190a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCMethod; } 191a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCMethodDecl *D) { return true; } 19258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff}; 193b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian 194a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCInterfaceDecl - Represents an ObjC class declaration. For example: 1950c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 1960c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// // MostPrimitive declares no super class (not particularly useful). 1970c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface MostPrimitive 1980c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// // no instance variables or methods. 1990c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 2000c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 201fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner/// // NSResponder inherits from NSObject & implements NSCoding (a protocol). 2020c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSResponder : NSObject <NSCoding> 203a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// { // instance variables are represented by ObjCIvarDecl. 2040c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id nextResponder; // nextResponder instance variable. 2050c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// } 2060c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSResponder *)nextResponder; // return a pointer to NSResponder. 2070c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)mouseMoved:(NSEvent *)theEvent; // return void, takes a pointer 2080c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end // to an NSEvent. 2090c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 2100c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C/C++, forward class declarations are accomplished with @class. 2110c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C/C++, @class allows for a list of classes to be forward declared. 2120c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes 2130c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// typically inherit from NSObject (an exception is NSProxy). 2140c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 215b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass ObjCInterfaceDecl : public NamedDecl, public DeclContext { 2163110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff /// TypeForDecl - This indicates the Type object that represents this 2173110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff /// TypeDecl. It is a cache maintained by ASTContext::getObjCInterfaceType 2183110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff Type *TypeForDecl; 2193110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff friend class ASTContext; 220980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 221980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Class's super class. 222a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *SuperClass; 223980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 224980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Protocols referenced in interface header declaration 225a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **ReferencedProtocols; // Null if none 226c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned NumReferencedProtocols; // 0 if none 227980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 228980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Ivars/NumIvars - This is a new[]'d array of pointers to Decls. 229a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCIvarDecl **Ivars; // Null if not defined. 230f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner unsigned NumIvars; // 0 if none. 231980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 232980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// instance methods 233a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **InstanceMethods; // Null if not defined 234b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner unsigned NumInstanceMethods; // 0 if none. 235980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 236980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// class methods 237a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **ClassMethods; // Null if not defined 23862db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned NumClassMethods; // 0 if none 239980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 240980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// List of categories defined for this class. 241a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl *CategoryList; 24282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 24382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian /// class properties 244a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCPropertyDecl **PropertyDecl; // Null if no property 24555d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner unsigned NumPropertyDecl; // 0 if none. 246980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 2473a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian bool ForwardDecl:1; // declared with @class. 2483a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian bool InternalInterface:1; // true - no @interface for @implementation 24960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 250d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation ClassLoc; // location of the class identifier. 251d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation SuperClassLoc; // location of the super class identifier. 252f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation EndLoc; // marks the '>', '}', or identifier. 253f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 2540e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner 2550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCInterfaceDecl(SourceLocation atLoc, 2560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner unsigned numRefProtos, 257d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff IdentifierInfo *Id, SourceLocation CLoc, 258d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff bool FD, bool isInternal) 259b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner : NamedDecl(ObjCInterface, atLoc, Id), DeclContext(ObjCInterface), 2600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner TypeForDecl(0), SuperClass(0), 261c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian ReferencedProtocols(0), NumReferencedProtocols(0), Ivars(0), 262f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner NumIvars(0), 263b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner InstanceMethods(0), NumInstanceMethods(0), 26462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner ClassMethods(0), NumClassMethods(0), 265f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner CategoryList(0), PropertyDecl(0), NumPropertyDecl(0), 266d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff ForwardDecl(FD), InternalInterface(isInternal), 267d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff ClassLoc(CLoc) { 268980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff AllocIntfRefProtocols(numRefProtos); 269980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 2708a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 2711c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek virtual ~ObjCInterfaceDecl(); 2728a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 2730e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattnerpublic: 2740e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner 2758a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek /// Destroy - Call destructors and release memory. 2768a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek virtual void Destroy(ASTContext& C); 2778a779314870760848e61da2c428a78971fe3f1c3Ted Kremenek 2780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCInterfaceDecl *Create(ASTContext &C, 2790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation atLoc, 280d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff unsigned numRefProtos, 281d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff IdentifierInfo *Id, 282d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation ClassLoc = SourceLocation(), 2830e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner bool ForwardDecl = false, 2840e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner bool isInternal = false); 285a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff 286a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff // This is necessary when converting a forward declaration to a definition. 287980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void AllocIntfRefProtocols(unsigned numRefProtos) { 288980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff if (numRefProtos) { 289a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ReferencedProtocols = new ObjCProtocolDecl*[numRefProtos]; 2907ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian memset(ReferencedProtocols, '\0', 291a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek numRefProtos*sizeof(ObjCProtocolDecl*)); 2927ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian NumReferencedProtocols = numRefProtos; 293980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 294980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 295980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 296a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **getReferencedProtocols() const { 2977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian return ReferencedProtocols; 2987ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian } 299c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned getNumIntfRefProtocols() const { return NumReferencedProtocols; } 300980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 301559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const; 302559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian ObjCCategoryDecl *FindCategoryDeclaration(IdentifierInfo *CategoryId) const; 303559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian ObjCIvarDecl *FindIvarDeclaration(IdentifierInfo *IvarId) const; 304559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 305aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian typedef ObjCProtocolDecl * const * protocol_iterator; 306aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian protocol_iterator protocol_begin() const { return ReferencedProtocols; } 307aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian protocol_iterator protocol_end() const { 308aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian return ReferencedProtocols+NumReferencedProtocols; 309aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian } 310aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian 311a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCIvarDecl * const *ivar_iterator; 312be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner ivar_iterator ivar_begin() const { return Ivars; } 3135564e07af5e62875f3b83fc2e5a8823588b5adeaChris Lattner ivar_iterator ivar_end() const { return Ivars + ivar_size();} 314f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner unsigned ivar_size() const { return NumIvars; } 315be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner 316b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner unsigned getNumInstanceMethods() const { return NumInstanceMethods; } 31762db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned getNumClassMethods() const { return NumClassMethods; } 318980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 319a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * instmeth_iterator; 3204c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner instmeth_iterator instmeth_begin() const { return InstanceMethods; } 3214c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner instmeth_iterator instmeth_end() const { 322b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner return InstanceMethods+NumInstanceMethods; 3234c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner } 3244c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner 325a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * classmeth_iterator; 3264c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner classmeth_iterator classmeth_begin() const { return ClassMethods; } 3274c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner classmeth_iterator classmeth_end() const { 32862db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return ClassMethods+NumClassMethods; 3294c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner } 3304c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner 331a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addInstanceVariablesToClass(ObjCIvarDecl **ivars, unsigned numIvars, 33260fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation RBracLoc); 333980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 334a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers, 335a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, unsigned numClsMembers, 33660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEnd); 337980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 33855d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); 33955d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner 340aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian void mergeProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); 341aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian 34233de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian void addPropertyMethods(ASTContext &Context, 34333de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCPropertyDecl* Property, 34433de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian llvm::SmallVector<ObjCMethodDecl*, 32> &insMethods); 34533de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian 3463dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian typedef ObjCPropertyDecl * const * classprop_iterator; 3473dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_begin() const { return PropertyDecl; } 3483dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_end() const { 3493dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian return PropertyDecl+NumPropertyDecl; 3503dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian } 35155d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner 352768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff bool isForwardDecl() const { return ForwardDecl; } 353768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff void setForwardDecl(bool val) { ForwardDecl = val; } 354980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 355a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setIntfRefProtocols(unsigned idx, ObjCProtocolDecl *OID) { 3567ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian assert((idx < NumReferencedProtocols) && "index out of range"); 3577ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 358980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 359980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 360a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *getSuperClass() const { return SuperClass; } 361a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setSuperClass(ObjCInterfaceDecl * superCls) { SuperClass = superCls; } 362980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 363a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl* getCategoryList() const { return CategoryList; } 364a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setCategoryList(ObjCCategoryDecl *category) { 36553efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner CategoryList = category; 366980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 36753efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner 36853efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner /// isSuperClassOf - Return true if this class is the specified class or is a 36953efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner /// super class of the specified interface class. 37053efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner bool isSuperClassOf(const ObjCInterfaceDecl *I) const { 37153efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner // If RHS is derived from LHS it is OK; else it is not OK. 37253efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner while (I != NULL) { 37353efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner if (this == I) 37453efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner return true; 37553efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner I = I->getSuperClass(); 37653efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner } 37753efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner return false; 37853efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner } 37953efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner 380a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *ivarName, 381a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *&clsDeclared); 382c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner 38358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local instance method declared in this interface. 38453efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner ObjCMethodDecl *getInstanceMethod(Selector Sel) { 38558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 3860e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner I != E; ++I) { 38758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 38858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 38958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 3900e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner return 0; 39158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 39258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local class method declared in this interface. 39353efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner ObjCMethodDecl *getClassMethod(Selector Sel) { 39458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 3950e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner I != E; ++I) { 39658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 39758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 39858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 3990e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner return 0; 40058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 40194a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Lookup a method. First, we search locally. If a method isn't 40294a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // found, we search referenced protocols and class categories. 403a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *lookupInstanceMethod(Selector Sel); 404a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *lookupClassMethod(Selector Sel); 40560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 406f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff // Location information, modeled after the Stmt API. 40760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'interface 408f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 409f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 41060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff 411d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation getClassLoc() const { return ClassLoc; } 412d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff void setSuperClassLoc(SourceLocation Loc) { SuperClassLoc = Loc; } 413d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff SourceLocation getSuperClassLoc() const { return SuperClassLoc; } 414d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff 41560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff // We also need to record the @end location. 416f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 41782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 418f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner unsigned getNumPropertyDecl() const { return NumPropertyDecl; } 41982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 42055d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; } 421a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; } 422f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff 4234b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian /// ImplicitInterfaceDecl - check that this is an implicitely declared 424a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek /// ObjCInterfaceDecl node. This is for legacy objective-c @implementation 4254b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian /// declaration without an @interface declaration. 4263a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian bool ImplicitInterfaceDecl() const { return InternalInterface; } 4274b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian 428a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCInterface; } 429a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCInterfaceDecl *D) { return true; } 430980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 431980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 432a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCIvarDecl - Represents an ObjC instance variable. In general, ObjC 4330c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C 4340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example: 4350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 4360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface IvarExample : NSObject 4370c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// { 4380c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id defaultToPrivate; // same as C++. 4390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @public: 4400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBePublic; // same as C++. 4410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protected: 4420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBeProtected; // same as C++. 4430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @package: 4440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id canBePackage; // framework visibility (not available in C++). 4450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// } 4460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 447a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCIvarDecl : public FieldDecl { 448b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner ObjCIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T) 449b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner : FieldDecl(ObjCIvar, L, Id, T) {} 4500e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattnerpublic: 451b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner static ObjCIvarDecl *Create(ASTContext &C, SourceLocation L, 4520e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner IdentifierInfo *Id, QualType T); 453980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 454980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff enum AccessControl { 455980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff None, Private, Protected, Public, Package 456980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff }; 457980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void setAccessControl(AccessControl ac) { DeclAccess = ac; } 458ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek AccessControl getAccessControl() const { return AccessControl(DeclAccess); } 459980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 460980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff // Implement isa/cast/dyncast/etc. 461a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCIvar; } 462a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCIvarDecl *D) { return true; } 463980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate: 464ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek // NOTE: VC++ treats enums as signed, avoid using the AccessControl enum 465ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek unsigned DeclAccess : 3; 466980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 467980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 468980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 469a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCProtocolDecl - Represents a protocol declaration. ObjC protocols 4700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted). 4710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++ 4720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example: 4730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 474eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// @protocol NSDraggingInfo <refproto1, refproto2> 4750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow; 4760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage; 4770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 4780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 479eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// This says that NSDraggingInfo requires two methods and requires everything 480eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// that the two "referenced protocols" 'refproto1' and 'refproto2' require as 481eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// well. 482eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// 4830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo> 4840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 4850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 486a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjC protocols inspired Java interfaces. Unlike Java, ObjC classes and 4870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both 4880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result, 4890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows: 4900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 4910c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo; 4920c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 493a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCProtocolDecl : public NamedDecl { 494980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// referenced protocols 495a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **ReferencedProtocols; // Null if none 496c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned NumReferencedProtocols; // 0 if none 497980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 498980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// protocol instance methods 499a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **InstanceMethods; // Null if not defined 50062db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned NumInstanceMethods; // 0 if none 501980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 502980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// protocol class methods 503a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **ClassMethods; // Null if not defined 50462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned NumClassMethods; // 0 if none 5053dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5063dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian /// protocol properties 5073dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian ObjCPropertyDecl **PropertyDecl; // Null if no property 5083dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian unsigned NumPropertyDecl; // 0 if none 5093dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 510980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff bool isForwardProtoDecl; // declared with @protocol. 511423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 512423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation EndLoc; // marks the '>' or identifier. 513423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 514cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner 515c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner ObjCProtocolDecl(SourceLocation L, unsigned numRefProtos, IdentifierInfo *Id) 516a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : NamedDecl(ObjCProtocol, L, Id), 517c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian ReferencedProtocols(0), NumReferencedProtocols(0), 51862db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner InstanceMethods(0), NumInstanceMethods(0), 51962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner ClassMethods(0), NumClassMethods(0), 5203dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian PropertyDecl(0), NumPropertyDecl(0), 521c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner isForwardProtoDecl(true) { 522cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner AllocReferencedProtocols(numRefProtos); 523cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner } 5241c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 5251c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek virtual ~ObjCProtocolDecl(); 5261c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 527cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattnerpublic: 5281c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 5291c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek /// Destroy - Call destructors and release memory. 5301c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek virtual void Destroy(ASTContext& C); 5311c8a413c1e00636c77666ddf1e3b0311f3fa8c81Ted Kremenek 532cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner static ObjCProtocolDecl *Create(ASTContext &C, SourceLocation L, 533c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner unsigned numRefProtos, IdentifierInfo *Id); 534cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner 535980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void AllocReferencedProtocols(unsigned numRefProtos) { 536980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff if (numRefProtos) { 537a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ReferencedProtocols = new ObjCProtocolDecl*[numRefProtos]; 538980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff memset(ReferencedProtocols, '\0', 539a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek numRefProtos*sizeof(ObjCProtocolDecl*)); 540980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff NumReferencedProtocols = numRefProtos; 541980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 542980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 543a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers, 544a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, unsigned numClsMembers, 54560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEndLoc); 546980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 547a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setReferencedProtocols(unsigned idx, ObjCProtocolDecl *OID) { 548980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff assert((idx < NumReferencedProtocols) && "index out of range"); 549980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff ReferencedProtocols[idx] = OID; 550980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 551980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 552a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl** getReferencedProtocols() const { 553980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff return ReferencedProtocols; 554980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 555c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned getNumReferencedProtocols() const { return NumReferencedProtocols; } 556aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian typedef ObjCProtocolDecl * const * protocol_iterator; 557aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian protocol_iterator protocol_begin() const { return ReferencedProtocols; } 558aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian protocol_iterator protocol_end() const { 559aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian return ReferencedProtocols+NumReferencedProtocols; 560aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian } 561aebf0cba02c014ac8b19d615c654248e0e93779fFariborz Jahanian 562c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner unsigned getNumInstanceMethods() const { return NumInstanceMethods; } 56362db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned getNumClassMethods() const { return NumClassMethods; } 5643d2c22b1d334fa74d26a5f21841cb55df5dfdd1aSteve Naroff 5653d2c22b1d334fa74d26a5f21841cb55df5dfdd1aSteve Naroff ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const; 5663dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5673dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian unsigned getNumPropertyDecl() const { return NumPropertyDecl; } 5683dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5693dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; } 5703dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; } 5713dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5723dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); 5733dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 5743dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian typedef ObjCPropertyDecl * const * classprop_iterator; 5753dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_begin() const { return PropertyDecl; } 5763dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_end() const { 5773dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian return PropertyDecl+NumPropertyDecl; 5783dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian } 57958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 580a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * instmeth_iterator; 58158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff instmeth_iterator instmeth_begin() const { return InstanceMethods; } 58258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff instmeth_iterator instmeth_end() const { 58362db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return InstanceMethods+NumInstanceMethods; 58458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 58558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 586a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * classmeth_iterator; 58758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff classmeth_iterator classmeth_begin() const { return ClassMethods; } 58858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff classmeth_iterator classmeth_end() const { 58962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return ClassMethods+NumClassMethods; 59058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 59158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 59258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local instance method declared in this interface. 59362db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner ObjCMethodDecl *getInstanceMethod(Selector Sel) { 59462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 59562db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner I != E; ++I) { 59658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 59758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 59858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 59962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return 0; 60058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 60158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local class method declared in this interface. 60262db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner ObjCMethodDecl *getClassMethod(Selector Sel) { 60358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 60462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner I != E; ++I) { 60558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 60658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 60758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 60862db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner return 0; 60958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 610980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 61194a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Lookup a method. First, we search locally. If a method isn't 61294a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // found, we search referenced protocols and class categories. 613a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *lookupInstanceMethod(Selector Sel); 614a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *lookupClassMethod(Selector Sel); 6157dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian 616768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff bool isForwardDecl() const { return isForwardProtoDecl; } 617768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff void setForwardDecl(bool val) { isForwardProtoDecl = val; } 618980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 619423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // Location information, modeled after the Stmt API. 620423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'protocol 621423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocEnd() const { return EndLoc; } 622423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 623423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 624423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // We also need to record the @end location. 625423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 626423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 627a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCProtocol; } 628a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCProtocolDecl *D) { return true; } 629980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 630980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 631a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCClassDecl - Specifies a list of forward class declarations. For example: 63206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// 63306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow; 6340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 635a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCClassDecl : public Decl { 636a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl **ForwardDecls; 6377e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner unsigned NumForwardDecls; 63861f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 639a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCClassDecl(SourceLocation L, ObjCInterfaceDecl **Elts, unsigned nElts) 640a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : Decl(ObjCClass, L) { 64106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff if (nElts) { 642a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ForwardDecls = new ObjCInterfaceDecl*[nElts]; 643a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(ForwardDecls, Elts, nElts*sizeof(ObjCInterfaceDecl*)); 6447e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner } else { 6457e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner ForwardDecls = 0; 64606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 64706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff NumForwardDecls = nElts; 64806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 649400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 650400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek virtual ~ObjCClassDecl(); 651400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 65261f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic: 653400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 654400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek /// Destroy - Call destructors and release memory. 655400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek virtual void Destroy(ASTContext& C); 656400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 65761f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner static ObjCClassDecl *Create(ASTContext &C, SourceLocation L, 65861f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner ObjCInterfaceDecl **Elts, unsigned nElts); 65961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 660a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setInterfaceDecl(unsigned idx, ObjCInterfaceDecl *OID) { 6617e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner assert(idx < NumForwardDecls && "index out of range"); 66206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff ForwardDecls[idx] = OID; 66306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 664a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl** getForwardDecls() const { return ForwardDecls; } 6657e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff int getNumForwardDecls() const { return NumForwardDecls; } 6667e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff 667400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek typedef ObjCInterfaceDecl * const * iterator; 668400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek iterator begin() const { return ForwardDecls; } 669400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek iterator end() const { return ForwardDecls+NumForwardDecls; } 670400d95fb7bb9fac609f8613862b84f3a2a7d510fTed Kremenek 671a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCClass; } 672a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCClassDecl *D) { return true; } 67306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff}; 67406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff 675a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCForwardProtocolDecl - Specifies a list of forward protocol declarations. 67606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example: 67706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// 6780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo; 6790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 680a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCForwardProtocolDecl : public Decl { 681a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **ReferencedProtocols; 6829fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner unsigned NumReferencedProtocols; 68361f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 6840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCForwardProtocolDecl(SourceLocation L, 685a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **Elts, unsigned nElts) 686a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : Decl(ObjCForwardProtocol, L) { 687b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner NumReferencedProtocols = nElts; 68806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff if (nElts) { 689a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ReferencedProtocols = new ObjCProtocolDecl*[nElts]; 690a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjCProtocolDecl*)); 6919fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } else { 6929fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner ReferencedProtocols = 0; 693980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 69406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 69505ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek 69605ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek virtual ~ObjCForwardProtocolDecl(); 69705ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek 69861f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic: 69961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner static ObjCForwardProtocolDecl *Create(ASTContext &C, SourceLocation L, 70061f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner ObjCProtocolDecl **Elts, unsigned Num); 70161f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 70261f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 703a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setForwardProtocolDecl(unsigned idx, ObjCProtocolDecl *OID) { 7049fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 7057ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 70606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 7079fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 7089fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner unsigned getNumForwardDecls() const { return NumReferencedProtocols; } 7099fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 710a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl *getForwardProtocolDecl(unsigned idx) { 7119fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 7129fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner return ReferencedProtocols[idx]; 7139fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } 714a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek const ObjCProtocolDecl *getForwardProtocolDecl(unsigned idx) const { 7159fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner assert(idx < NumReferencedProtocols && "index out of range"); 7169fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner return ReferencedProtocols[idx]; 7179fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner } 7189fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner 71905ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek typedef ObjCProtocolDecl * const * iterator; 72005ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek iterator begin() const { return ReferencedProtocols; } 72105ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek iterator end() const { return ReferencedProtocols+NumReferencedProtocols; } 72205ac3ef08f9d06e0a4439073c9edabf7f912f946Ted Kremenek 72306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff static bool classof(const Decl *D) { 724a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek return D->getKind() == ObjCForwardProtocol; 72506ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff } 726a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCForwardProtocolDecl *D) { return true; } 727980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 728980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 729a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCategoryDecl - Represents a category declaration. A category allows 7300c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying 7310c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow 7320c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all 7330c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process: 7340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 7350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods) 7360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod; 7370c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 7380c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 7390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across 7400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++). 7410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 7420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common 74368c82cf61228102aba1194efef222fa1478af2a8Chris Lattner/// Lisp and Smalltalk. More traditional class-based languages (C++, Java) 7440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous. 7450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 746a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCCategoryDecl : public NamedDecl { 747980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Interface belonging to this category 748a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *ClassInterface; 749980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 75068c82cf61228102aba1194efef222fa1478af2a8Chris Lattner /// referenced protocols in this category. 751a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **ReferencedProtocols; // Null if none 752c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned NumReferencedProtocols; // 0 if none 753980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 754980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// category instance methods 755a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **InstanceMethods; // Null if not defined 756c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner unsigned NumInstanceMethods; // 0 if none 757980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 758980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// category class methods 759a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **ClassMethods; // Null if not defined 760a906135721c350435319347d2672bbb3bf494f91Chris Lattner unsigned NumClassMethods; // 0 if not defined 761980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 762980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Next category belonging to this class 763a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl *NextClassCategory; 764ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian 7657e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian /// category properties 7667e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian ObjCPropertyDecl **PropertyDecl; // Null if no property 7677e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian unsigned NumPropertyDecl; // 0 if none 7687e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian 769423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation EndLoc; // marks the '>' or identifier. 770423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation AtEndLoc; // marks the end of the entire interface. 77161f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 77268c82cf61228102aba1194efef222fa1478af2a8Chris Lattner ObjCCategoryDecl(SourceLocation L, IdentifierInfo *Id) 773a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : NamedDecl(ObjCCategory, L, Id), 774c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(0), 775c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner InstanceMethods(0), NumInstanceMethods(0), 776a906135721c350435319347d2672bbb3bf494f91Chris Lattner ClassMethods(0), NumClassMethods(0), 7777e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian NextClassCategory(0), PropertyDecl(0), NumPropertyDecl(0) { 778a906135721c350435319347d2672bbb3bf494f91Chris Lattner } 77961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic: 78061f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 7810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCCategoryDecl *Create(ASTContext &C, 7820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id); 78361f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner 784e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ObjCInterfaceDecl *getClassInterface() { return ClassInterface; } 785e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; } 786a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setClassInterface(ObjCInterfaceDecl *IDecl) { ClassInterface = IDecl; } 787980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 78868c82cf61228102aba1194efef222fa1478af2a8Chris Lattner void setReferencedProtocolList(ObjCProtocolDecl **List, unsigned NumRPs); 78968c82cf61228102aba1194efef222fa1478af2a8Chris Lattner 790a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void setCatReferencedProtocols(unsigned idx, ObjCProtocolDecl *OID) { 7917ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian assert((idx < NumReferencedProtocols) && "index out of range"); 7927ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian ReferencedProtocols[idx] = OID; 793980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 794980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 795a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCProtocolDecl **getReferencedProtocols() const { 7967ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian return ReferencedProtocols; 7978f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian } 798c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian unsigned getNumReferencedProtocols() const { return NumReferencedProtocols; } 799c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner unsigned getNumInstanceMethods() const { return NumInstanceMethods; } 800a906135721c350435319347d2672bbb3bf494f91Chris Lattner unsigned getNumClassMethods() const { return NumClassMethods; } 80158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 8027e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian unsigned getNumPropertyDecl() const { return NumPropertyDecl; } 8037e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian 8047e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; } 8057e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian 8063dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties); 8073dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 808559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian ObjCPropertyDecl *FindPropertyDeclaration(IdentifierInfo *PropertyId) const; 809559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 8103dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian typedef ObjCPropertyDecl * const * classprop_iterator; 8113dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_begin() const { return PropertyDecl; } 8123dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian classprop_iterator classprop_end() const { 8133dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian return PropertyDecl+NumPropertyDecl; 8143dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian } 8153dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian 816a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * instmeth_iterator; 81758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff instmeth_iterator instmeth_begin() const { return InstanceMethods; } 81858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff instmeth_iterator instmeth_end() const { 819c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner return InstanceMethods+NumInstanceMethods; 82058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 82158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 822a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCMethodDecl * const * classmeth_iterator; 82358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff classmeth_iterator classmeth_begin() const { return ClassMethods; } 82458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff classmeth_iterator classmeth_end() const { 825a906135721c350435319347d2672bbb3bf494f91Chris Lattner return ClassMethods+NumClassMethods; 82658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 82758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff 82858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local instance method declared in this interface. 82968c82cf61228102aba1194efef222fa1478af2a8Chris Lattner ObjCMethodDecl *getInstanceMethod(Selector Sel) { 83058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 83168c82cf61228102aba1194efef222fa1478af2a8Chris Lattner I != E; ++I) { 83258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 83358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 83458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 83568c82cf61228102aba1194efef222fa1478af2a8Chris Lattner return 0; 83658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 83758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff // Get the local class method declared in this interface. 83868c82cf61228102aba1194efef222fa1478af2a8Chris Lattner ObjCMethodDecl *getClassMethod(Selector Sel) { 83958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 84068c82cf61228102aba1194efef222fa1478af2a8Chris Lattner I != E; ++I) { 84158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff if ((*I)->getSelector() == Sel) 84258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff return *I; 84358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 84468c82cf61228102aba1194efef222fa1478af2a8Chris Lattner return 0; 84558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff } 8468f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 847a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers, 848a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl **clsMethods, unsigned numClsMembers, 84960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff SourceLocation AtEndLoc); 850980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 851a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryDecl *getNextClassCategory() const { return NextClassCategory; } 852980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff void insertNextClassCategory() { 8533d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff NextClassCategory = ClassInterface->getCategoryList(); 8543d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff ClassInterface->setCategoryList(this); 855980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 856423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // Location information, modeled after the Stmt API. 857423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocStart() const { return getLocation(); } // '@'interface 858423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getLocEnd() const { return EndLoc; } 859423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 860423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff 861423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff // We also need to record the @end location. 862423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff SourceLocation getAtEndLoc() const { return AtEndLoc; } 863ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian 864a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCCategory; } 865a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCCategoryDecl *D) { return true; } 866980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 8670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff 868a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCategoryImplDecl - An object of this class encapsulates a category 869559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @implementation declaration. If a category class has declaration of a 870559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// property, its implementation must be specified in the category's 871559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @implementation declaration. Example: 872559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @interface I @end 873559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @interface I(CATEGORY) 874559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @property int p1, d1; 875559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @end 876559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @implementation I(CATEGORY) 877559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @dynamic p1,d1; 878559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// @end 879559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian/// 880a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCCategoryImplDecl : public NamedDecl { 8818f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian /// Class interface for this category implementation 882a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *ClassInterface; 8838f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 884e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff /// implemented instance methods 885a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek llvm::SmallVector<ObjCMethodDecl*, 32> InstanceMethods; 8868f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 887e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff /// implemented class methods 888a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek llvm::SmallVector<ObjCMethodDecl*, 32> ClassMethods; 889f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 890559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian /// Property Implementations in this category 891f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian llvm::SmallVector<ObjCPropertyImplDecl*, 8> PropertyImplementations; 892e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 893e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff SourceLocation EndLoc; 89475c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner 895a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCategoryImplDecl(SourceLocation L, IdentifierInfo *Id, 896a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *classInterface) 897a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : NamedDecl(ObjCCategoryImpl, L, Id), ClassInterface(classInterface) {} 89875c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattnerpublic: 8990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCCategoryImplDecl *Create(ASTContext &C, 9000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 90175c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner ObjCInterfaceDecl *classInterface); 9028f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 903e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; } 904e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ObjCInterfaceDecl *getClassInterface() { return ClassInterface; } 9058f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 906ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner unsigned getNumInstanceMethods() const { return InstanceMethods.size(); } 907ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner unsigned getNumClassMethods() const { return ClassMethods.size(); } 908e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 909a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addInstanceMethod(ObjCMethodDecl *method) { 910e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff InstanceMethods.push_back(method); 911e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff } 912a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addClassMethod(ObjCMethodDecl *method) { 913e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff ClassMethods.push_back(method); 914f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian } 91594a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Get the instance method definition for this implementation. 916a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *getInstanceMethod(Selector Sel); 91794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff 91894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Get the class method definition for this implementation. 919a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *getClassMethod(Selector Sel); 920f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 921f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian void addPropertyImplementation(ObjCPropertyImplDecl *property) { 922f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian PropertyImplementations.push_back(property); 923f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian } 924e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 925f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian unsigned getNumPropertyImplementations() const 926f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian { return PropertyImplementations.size(); } 927f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 928559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 929559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian typedef llvm::SmallVector<ObjCPropertyImplDecl*, 8>::const_iterator 930559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator; 931559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator propimpl_begin() const { 932559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return PropertyImplementations.begin(); 933559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian } 934559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator propimpl_end() const { 935559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return PropertyImplementations.end(); 936559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian } 937559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian 938a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator 939ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner instmeth_iterator; 940ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); } 941ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner instmeth_iterator instmeth_end() const { return InstanceMethods.end(); } 942ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner 943a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator 944ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner classmeth_iterator; 945ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); } 946ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner classmeth_iterator classmeth_end() const { return ClassMethods.end(); } 947ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner 948ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner 949e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff // Location information, modeled after the Stmt API. 950e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff SourceLocation getLocStart() const { return getLocation(); } 951e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 952e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 953e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff 954a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const Decl *D) { return D->getKind() == ObjCCategoryImpl;} 955a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCCategoryImplDecl *D) { return true; } 9568f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian}; 9578f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian 958a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCImplementationDecl - Represents a class definition - this is where 9590c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example: 9600c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 9610c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass 9620c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ } 9630c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end 9640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 9650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface, 9660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we 9670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When 9680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we 9690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing 9700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations 9710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-) 9720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// 973a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCImplementationDecl : public NamedDecl { 974dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian /// Class interface for this implementation 975a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *ClassInterface; 976f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian 977980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Implementation Class's super class. 978a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *SuperClass; 979980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 980980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls. 981a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCIvarDecl **Ivars; // Null if not specified 982f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner unsigned NumIvars; // 0 if none. 9830416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff 984980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// implemented instance methods 985a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek llvm::SmallVector<ObjCMethodDecl*, 32> InstanceMethods; 9860416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff 987980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff /// implemented class methods 988a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek llvm::SmallVector<ObjCMethodDecl*, 32> ClassMethods; 9890416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff 990f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian /// Propertys' being implemented 991f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian llvm::SmallVector<ObjCPropertyImplDecl*, 8> PropertyImplementations; 992f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 9930416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff SourceLocation EndLoc; 99475c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner 995a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCImplementationDecl(SourceLocation L, IdentifierInfo *Id, 996a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *classInterface, 997a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *superDecl) 998a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek : NamedDecl(ObjCImplementation, L, Id), 9990416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff ClassInterface(classInterface), SuperClass(superDecl), 1000f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner Ivars(0), NumIvars(0) {} 100175c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattnerpublic: 10020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCImplementationDecl *Create(ASTContext &C, 10030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 100475c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner ObjCInterfaceDecl *classInterface, 100575c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner ObjCInterfaceDecl *superDecl); 100675c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner 1007980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1008a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void ObjCAddInstanceVariablesToClassImpl(ObjCIvarDecl **ivars, 1009980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff unsigned numIvars); 1010980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1011a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addInstanceMethod(ObjCMethodDecl *method) { 10120416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff InstanceMethods.push_back(method); 10130416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff } 1014a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek void addClassMethod(ObjCMethodDecl *method) { 10150416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff ClassMethods.push_back(method); 10160416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff } 1017f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 1018f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian void addPropertyImplementation(ObjCPropertyImplDecl *property) { 1019f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian PropertyImplementations.push_back(property); 1020f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian } 1021559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian typedef llvm::SmallVector<ObjCPropertyImplDecl*, 8>::const_iterator 1022559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator; 1023559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator propimpl_begin() const { 1024559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return PropertyImplementations.begin(); 1025559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian } 1026559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian propimpl_iterator propimpl_end() const { 1027559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian return PropertyImplementations.end(); 1028559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian } 1029f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 10300416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff // Location information, modeled after the Stmt API. 10310416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff SourceLocation getLocStart() const { return getLocation(); } 10320416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff SourceLocation getLocEnd() const { return EndLoc; } 10330416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff void setLocEnd(SourceLocation LE) { EndLoc = LE; }; 10340416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff 1035e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; } 1036e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ObjCInterfaceDecl *getClassInterface() { return ClassInterface; } 1037e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner const ObjCInterfaceDecl *getSuperClass() const { return SuperClass; } 1038e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner ObjCInterfaceDecl *getSuperClass() { return SuperClass; } 1039980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1040f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner void setSuperClass(ObjCInterfaceDecl * superCls) { SuperClass = superCls; } 1041980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1042b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner unsigned getNumInstanceMethods() const { return InstanceMethods.size(); } 104362db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner unsigned getNumClassMethods() const { return ClassMethods.size(); } 1044f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian 1045f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian unsigned getNumPropertyImplementations() const 1046f624f8186d8fe474350051c6d3f00b2c204fbeaeFariborz Jahanian { return PropertyImplementations.size(); } 1047c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff 1048a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator 10490157c5144513438bb74aebf50d18f95df4104acbChris Lattner instmeth_iterator; 10500157c5144513438bb74aebf50d18f95df4104acbChris Lattner instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); } 10510157c5144513438bb74aebf50d18f95df4104acbChris Lattner instmeth_iterator instmeth_end() const { return InstanceMethods.end(); } 10520157c5144513438bb74aebf50d18f95df4104acbChris Lattner 1053a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator 10540157c5144513438bb74aebf50d18f95df4104acbChris Lattner classmeth_iterator; 10550157c5144513438bb74aebf50d18f95df4104acbChris Lattner classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); } 10560157c5144513438bb74aebf50d18f95df4104acbChris Lattner classmeth_iterator classmeth_end() const { return ClassMethods.end(); } 10570157c5144513438bb74aebf50d18f95df4104acbChris Lattner 105894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Get the instance method definition for this implementation. 1059a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *getInstanceMethod(Selector Sel); 10600157c5144513438bb74aebf50d18f95df4104acbChris Lattner 106194a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff // Get the class method definition for this implementation. 1062a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *getClassMethod(Selector Sel); 10630157c5144513438bb74aebf50d18f95df4104acbChris Lattner 1064a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek typedef ObjCIvarDecl * const *ivar_iterator; 10650157c5144513438bb74aebf50d18f95df4104acbChris Lattner ivar_iterator ivar_begin() const { return Ivars; } 1066f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner ivar_iterator ivar_end() const { return Ivars+NumIvars; } 1067f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner unsigned ivar_size() const { return NumIvars; } 1068f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner bool ivar_empty() const { return NumIvars == 0; } 10690157c5144513438bb74aebf50d18f95df4104acbChris Lattner 1070980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff static bool classof(const Decl *D) { 1071a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek return D->getKind() == ObjCImplementation; 1072980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff } 1073a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCImplementationDecl *D) { return true; } 1074980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}; 1075243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 1076a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCompatibleAliasDecl - Represents alias of a class. This alias is 1077243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class. 1078e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroffclass ObjCCompatibleAliasDecl : public NamedDecl { 1079243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian /// Class that this is an alias of. 1080a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCInterfaceDecl *AliasedClass; 1081243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 1082a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id, 1083e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroff ObjCInterfaceDecl* aliasedClass) 1084e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroff : NamedDecl(ObjCCompatibleAlias, L, Id), AliasedClass(aliasedClass) {} 1085f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattnerpublic: 10860ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static ObjCCompatibleAliasDecl *Create(ASTContext &C, 10870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 1088f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner ObjCInterfaceDecl* aliasedClass); 1089f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner 1090f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner const ObjCInterfaceDecl *getClassInterface() const { return AliasedClass; } 1091f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner ObjCInterfaceDecl *getClassInterface() { return AliasedClass; } 1092980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 1093243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian static bool classof(const Decl *D) { 10948a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner return D->getKind() == ObjCCompatibleAlias; 1095243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian } 1096a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCCompatibleAliasDecl *D) { return true; } 1097243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian 1098243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian}; 10991de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian 11001de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// ObjCPropertyDecl - Represents one property declaration in an interface. 11011de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// For example: 11021de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// @property (assign, readwrite) int MyProperty; 11031de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// 11041de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanianclass ObjCPropertyDecl : public NamedDecl { 110582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic: 1106a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner enum PropertyAttributeKind { 1107a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_noattr = 0x00, 1108a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_readonly = 0x01, 1109a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_getter = 0x02, 1110a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_assign = 0x04, 1111a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_readwrite = 0x08, 1112a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_retain = 0x10, 1113a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_copy = 0x20, 1114a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_nonatomic = 0x40, 1115a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner OBJC_PR_setter = 0x80 1116a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner }; 111746b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian 111846b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian enum PropertyControl { None, Required, Optional }; 111982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianprivate: 1120dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian QualType DeclType; 1121ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek unsigned PropertyAttributes : 8; 112282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 112346b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian // @required/@optional 112446b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian unsigned PropertyImplementation : 2; 112546b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian 11265251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian Selector GetterName; // getter name of NULL if no getter 11275251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian Selector SetterName; // setter name of NULL if no setter 112882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 112933de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCMethodDecl *GetterMethodDecl; // Declaration of getter instance method 113033de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCMethodDecl *SetterMethodDecl; // Declaration of setter instance method 113133de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian 11321de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian ObjCPropertyDecl(SourceLocation L, IdentifierInfo *Id, QualType T) 11331de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian : NamedDecl(ObjCProperty, L, Id), DeclType(T), 113433de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian PropertyAttributes(OBJC_PR_noattr), PropertyImplementation(None), 113533de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian GetterName(Selector()), 113633de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian SetterName(Selector()), 113733de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian GetterMethodDecl(0), SetterMethodDecl(0) {} 1138f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattnerpublic: 11391de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L, 114046b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian IdentifierInfo *Id, QualType T, 114146b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian PropertyControl propControl = None); 1142dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian QualType getType() const { return DeclType; } 1143c35b9e4e2efad727538c848cf30d4b0eb1031dc9Fariborz Jahanian QualType getCanonicalType() const { return DeclType.getCanonicalType(); } 1144c35b9e4e2efad727538c848cf30d4b0eb1031dc9Fariborz Jahanian 1145a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner PropertyAttributeKind getPropertyAttributes() const { 1146f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner return PropertyAttributeKind(PropertyAttributes); 1147f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner } 1148564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian void setPropertyAttributes(PropertyAttributeKind PRVal) { 1149a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner PropertyAttributes |= PRVal; 115082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian } 115182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 11525251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian Selector getGetterName() const { return GetterName; } 11535251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian void setGetterName(Selector Sel) { GetterName = Sel; } 115482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 11555251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian Selector getSetterName() const { return SetterName; } 11565251e130a23d997f7c0dfdc250cdc41f179e5bedFariborz Jahanian void setSetterName(Selector Sel) { SetterName = Sel; } 115782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian 115833de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCMethodDecl *getGetterMethodDecl() const { return GetterMethodDecl; } 115933de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian void setGetterMethodDecl(ObjCMethodDecl *gDecl) { GetterMethodDecl = gDecl; } 116033de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian 116133de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian ObjCMethodDecl *getSetterMethodDecl() const { return SetterMethodDecl; } 116233de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian void setSetterMethodDecl(ObjCMethodDecl *gDecl) { SetterMethodDecl = gDecl; } 116333de3f0333ca0b5274291b8d76c86758c0484691Fariborz Jahanian 116446b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian // Related to @optional/@required declared in @protocol 116546b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian void setPropertyImplementation(PropertyControl pc) { 116646b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian PropertyImplementation = pc; 116746b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian } 116846b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian PropertyControl getPropertyImplementation() const { 116946b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian return PropertyControl(PropertyImplementation); 117046b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian } 117146b55e56d029aec699fc2701e43d70264da9ecd8Fariborz Jahanian 117282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian static bool classof(const Decl *D) { 1173670aa9d7639278f507930e95dc89c12032ab7c7eSam Bishop return D->getKind() == ObjCProperty; 117482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian } 1175a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static bool classof(const ObjCPropertyDecl *D) { return true; } 117682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian}; 1177980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff 117861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// ObjCPropertyImplDecl - Represents implementation declaration of a property 117961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// in a class or category implementation block. For example: 118061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// @synthesize prop1 = ivar1; 118161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// 118261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianclass ObjCPropertyImplDecl : public Decl { 118361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianpublic: 118461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian enum PropertyImplKind { 118561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian OBJC_PR_IMPL_None, 118661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian OBJC_PR_IMPL_SYNTHSIZE, 118761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian OBJC_PR_IMPL_DYNAMIC 118861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian }; 118961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianprivate: 1190559c0c4bbecc017aab0716d546c4fefbcc194687Fariborz Jahanian SourceLocation AtLoc; // location of @synthesize or @dynamic 119161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian /// Property declaration being implemented 119261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian ObjCPropertyDecl *PropertyDecl; 119361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian PropertyImplKind PropertyImplementation; 119461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian /// Null for @dynamic. Required for @synthesize. 119561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian ObjCIvarDecl *PropertyIvarDecl; 119661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianpublic: 1197628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCPropertyImplDecl(SourceLocation atLoc, SourceLocation L, 1198628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCPropertyDecl *property, 1199628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian PropertyImplKind propertyKind, 1200628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCIvarDecl *ivarDecl) 1201628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian : Decl(ObjCPropertyImpl, L), AtLoc(atLoc), PropertyDecl(property), 1202628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian PropertyImplementation(propertyKind), PropertyIvarDecl(ivarDecl){} 1203628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian 1204628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian static ObjCPropertyImplDecl *Create(ASTContext &C, SourceLocation atLoc, 1205628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian SourceLocation L, 1206628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCPropertyDecl *property, 1207628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian PropertyImplKind propertyKind, 1208628b96f34e93b643b6e15e75eabb8d96079a7e27Fariborz Jahanian ObjCIvarDecl *ivarDecl); 120961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 121061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian void setPropertyDecl(ObjCPropertyDecl *property) { PropertyDecl = property; } 121161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian ObjCPropertyDecl *getPropertyDecl() const { return PropertyDecl; } 121261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 121361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian void setImplKind (PropertyImplKind propImplKind) 121461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian { PropertyImplementation = propImplKind; } 121561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian PropertyImplKind getPropertyImplementation() const 121661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian { return PropertyImplementation; } 121761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 121861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian void setPropertyIvarDecl(ObjCIvarDecl *ivarDecl) 121961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian { PropertyIvarDecl = ivarDecl; } 122061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian ObjCIvarDecl *getPropertyIvarDecl() { return PropertyIvarDecl; } 122161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 122261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian static bool classof(const Decl *D) { 122361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian return D->getKind() == ObjCPropertyImpl; 122461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian } 122561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian static bool classof(const ObjCPropertyImplDecl *D) { return true; } 122661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian}; 122761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian 1228980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff} // end namespace clang 1229980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif 1230