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