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