DeclObjC.h revision 3dd4ba4068e953125b95ce85c723322cdd0a3cb5
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;
3058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
31a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCMethodDecl - Represents an instance or class method declaration.
3258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// ObjC methods can be declared within 4 contexts: class interfaces,
3358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// categories, protocols, and class implementations. While C++ member
3458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// functions leverage C syntax, Objective-C method syntax is modeled after
3558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Smalltalk (using colons to specify argument types/expressions).
3658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Here are some brief examples:
3758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
3858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Setter/getter instance methods:
3958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (void)setMenu:(NSMenu *)menu;
4058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (NSMenu *)menu;
4158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
4258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Instance method that takes 2 NSView arguments:
4358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView;
4458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
4558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// Getter class method:
4658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// + (NSMenu *)defaultMenu;
4758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
4858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// A selector represents a unique name for a method. The selector names for
4958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu.
5058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff///
51b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass ObjCMethodDecl : public Decl, public DeclContext {
5258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroffpublic:
5358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  enum ImplementationControl { None, Required, Optional };
5458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroffprivate:
5558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// Bitfields must be first fields in this class so they pack with those
5658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// declared in class Decl.
5758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// instance (true) or class (false) method.
5858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool IsInstance : 1;
5958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool IsVariadic : 1;
6058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
61ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  // NOTE: VC++ treats enums as signed, avoid using ImplementationControl enum
6258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// @required/@optional
63ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  unsigned DeclImplementation : 2;
6458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
65ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  // NOTE: VC++ treats enums as signed, avoid using the ObjCDeclQualifier enum
6658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// in, inout, etc.
67ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  unsigned objcDeclQualifier : 6;
6858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
6958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Context this method is declared in.
7058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  NamedDecl *MethodContext;
7158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
7258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // A unigue name for this method.
7358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  Selector SelName;
7458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
7558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Type of this method.
7658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  QualType MethodDeclType;
7758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// ParamInfo - new[]'d array of pointers to VarDecls for the formal
7858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// parameters of this Method.  This is null if there are no formals.
7958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ParmVarDecl **ParamInfo;
8058cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner  unsigned NumMethodParams;
8158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
8258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  /// List of attributes for this method declaration.
8358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  AttributeList *MethodAttrs;
8458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
8558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  SourceLocation EndLoc; // the location of the ';' or '{'.
8658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
8758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // The following are only used for method definitions, null otherwise.
8858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // FIXME: space savings opportunity, consider a sub-class.
8958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  Stmt *Body;
9058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ParmVarDecl *SelfDecl;
916c4ae5de0c356777446f823b573821fb95560d91Chris Lattner
92a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
9358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 Selector SelInfo, QualType T,
9458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 Decl *contextDecl,
9558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 AttributeList *M = 0, bool isInstance = true,
9658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff                 bool isVariadic = false,
9758cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner                 ImplementationControl impControl = None)
98a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  : Decl(ObjCMethod, beginLoc),
99b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    DeclContext(ObjCMethod),
10058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    IsInstance(isInstance), IsVariadic(isVariadic),
10158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None),
10258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    MethodContext(static_cast<NamedDecl*>(contextDecl)),
10358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    SelName(SelInfo), MethodDeclType(T),
104b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner    ParamInfo(0), NumMethodParams(0),
10558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {}
1061bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop  ~ObjCMethodDecl();
1076c4ae5de0c356777446f823b573821fb95560d91Chris Lattnerpublic:
1086c4ae5de0c356777446f823b573821fb95560d91Chris Lattner
1090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static ObjCMethodDecl *Create(ASTContext &C,
1100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                SourceLocation beginLoc,
1116c4ae5de0c356777446f823b573821fb95560d91Chris Lattner                                SourceLocation endLoc, Selector SelInfo,
1126c4ae5de0c356777446f823b573821fb95560d91Chris Lattner                                QualType T, Decl *contextDecl,
1136c4ae5de0c356777446f823b573821fb95560d91Chris Lattner                                AttributeList *M = 0, bool isInstance = true,
1146c4ae5de0c356777446f823b573821fb95560d91Chris Lattner                                bool isVariadic = false,
115b06fa3b86951b9f179c99c3768331536c32e902dChris Lattner                                ImplementationControl impControl = None);
11658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
117ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  ObjCDeclQualifier getObjCDeclQualifier() const {
118ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek    return ObjCDeclQualifier(objcDeclQualifier);
119ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  }
120a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setObjCDeclQualifier(ObjCDeclQualifier QV) { objcDeclQualifier = QV; }
12158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
12258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Location information, modeled after the Stmt API.
12358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
12458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
12558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
12658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  NamedDecl *getMethodContext() const { return MethodContext; }
12758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
1285619688510185081cbb4621d703daf7ee24cf39aChris Lattner  ObjCInterfaceDecl *getClassInterface();
1295619688510185081cbb4621d703daf7ee24cf39aChris Lattner  const ObjCInterfaceDecl *getClassInterface() const {
1305619688510185081cbb4621d703daf7ee24cf39aChris Lattner    return const_cast<ObjCMethodDecl*>(this)->getClassInterface();
131e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  }
13258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
13358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  Selector getSelector() const { return SelName; }
134faf5e779d16bb4590f2a97e1c7ded255eddd90f3Fariborz Jahanian  unsigned getSynthesizedMethodSize() const;
13558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  QualType getResultType() const { return MethodDeclType; }
13658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
137d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  // Iterator access to formal parameters.
13858cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner  unsigned param_size() const { return NumMethodParams; }
139d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  typedef ParmVarDecl **param_iterator;
140d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  typedef ParmVarDecl * const *param_const_iterator;
141d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  param_iterator param_begin() { return ParamInfo; }
142d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  param_iterator param_end() { return ParamInfo+param_size(); }
143d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  param_const_iterator param_begin() const { return ParamInfo; }
144d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner  param_const_iterator param_end() const { return ParamInfo+param_size(); }
145d57f635d520e8cb5b93d3d770ff58db06c62de54Chris Lattner
14658cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner  unsigned getNumParams() const { return NumMethodParams; }
14758cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner  ParmVarDecl *getParamDecl(unsigned i) const {
14858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    assert(i < getNumParams() && "Illegal param #");
14958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    return ParamInfo[i];
15058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
1512338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian  void setParamDecl(int i, ParmVarDecl *pDecl) {
1522338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian    ParamInfo[i] = pDecl;
1532338d58a905191c4205d4f73affd0bdaa13493b4Fariborz Jahanian  }
15458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
15558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
15658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  AttributeList *getMethodAttrs() const {return MethodAttrs;}
15758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool isInstance() const { return IsInstance; }
15858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  bool isVariadic() const { return IsVariadic; }
15958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
16058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Related to protocols declared in  @protocol
16158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setDeclImplementation(ImplementationControl ic) {
16258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    DeclImplementation = ic;
16358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
16458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  ImplementationControl getImplementationControl() const {
165ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek    return ImplementationControl(DeclImplementation);
16658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
167e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  Stmt *getBody() { return Body; }
168e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  const Stmt *getBody() const { return Body; }
16958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setBody(Stmt *B) { Body = B; }
17058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
171e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  const ParmVarDecl *getSelfDecl() const { return SelfDecl; }
172e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  ParmVarDecl *getSelfDecl() { return SelfDecl; }
17358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  void setSelfDecl(ParmVarDecl *PVD) { SelfDecl = PVD; }
17458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
17558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Implement isa/cast/dyncast/etc.
176a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const Decl *D) { return D->getKind() == ObjCMethod; }
177a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCMethodDecl *D) { return true; }
1781bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop
1791bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop  friend void Decl::Destroy(ASTContext& C) const;
18058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff};
181b245a33e6f562377946dc9cb5694a2d3cb8a98a3Fariborz Jahanian
182a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCInterfaceDecl - Represents an ObjC class declaration. For example:
1830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   // MostPrimitive declares no super class (not particularly useful).
1850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface MostPrimitive
1860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     // no instance variables or methods.
1870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end
1880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
189fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner///   // NSResponder inherits from NSObject & implements NSCoding (a protocol).
1900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface NSResponder : NSObject <NSCoding>
191a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek///   { // instance variables are represented by ObjCIvarDecl.
1920c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id nextResponder; // nextResponder instance variable.
1930c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
1940c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (NSResponder *)nextResponder; // return a pointer to NSResponder.
1950c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (void)mouseMoved:(NSEvent *)theEvent; // return void, takes a pointer
1960c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end                                    // to an NSEvent.
1970c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1980c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, forward class declarations are accomplished with @class.
1990c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, @class allows for a list of classes to be forward declared.
2000c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes
2010c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   typically inherit from NSObject (an exception is NSProxy).
2020c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
203b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass ObjCInterfaceDecl : public NamedDecl, public DeclContext {
2043110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff  /// TypeForDecl - This indicates the Type object that represents this
2053110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff  /// TypeDecl.  It is a cache maintained by ASTContext::getObjCInterfaceType
2063110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff  Type *TypeForDecl;
2073110251f13981689f384eb3c0aba2afffea18d9dSteve Naroff  friend class ASTContext;
208980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
209980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Class's super class.
210a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl *SuperClass;
211980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
212980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Protocols referenced in interface header declaration
213a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCProtocolDecl **ReferencedProtocols;  // Null if none
214c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian  unsigned NumReferencedProtocols;  // 0 if none
215980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
216980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
217a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCIvarDecl **Ivars;   // Null if not defined.
218f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner  unsigned NumIvars;      // 0 if none.
219980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
220980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// instance methods
221a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl **InstanceMethods;  // Null if not defined
222b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner  unsigned NumInstanceMethods;  // 0 if none.
223980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
224980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// class methods
225a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl **ClassMethods;  // Null if not defined
22662db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner  unsigned NumClassMethods;  // 0 if none
227980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
228980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// List of categories defined for this class.
229a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCCategoryDecl *CategoryList;
23082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
23182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  /// class properties
232a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCPropertyDecl **PropertyDecl;  // Null if no property
23355d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner  unsigned NumPropertyDecl;  // 0 if none.
234980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2353a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ForwardDecl:1; // declared with @class.
2363a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool InternalInterface:1; // true - no @interface for @implementation
23760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
238d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff  SourceLocation ClassLoc; // location of the class identifier.
239d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff  SourceLocation SuperClassLoc; // location of the super class identifier.
240f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation EndLoc; // marks the '>', '}', or identifier.
241f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
2420e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner
2430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  ObjCInterfaceDecl(SourceLocation atLoc,
2440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                    unsigned numRefProtos,
245d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff                    IdentifierInfo *Id, SourceLocation CLoc,
246d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff                    bool FD, bool isInternal)
247b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    : NamedDecl(ObjCInterface, atLoc, Id), DeclContext(ObjCInterface),
2480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      TypeForDecl(0), SuperClass(0),
249c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian      ReferencedProtocols(0), NumReferencedProtocols(0), Ivars(0),
250f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner      NumIvars(0),
251b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner      InstanceMethods(0), NumInstanceMethods(0),
25262db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner      ClassMethods(0), NumClassMethods(0),
253f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner      CategoryList(0), PropertyDecl(0), NumPropertyDecl(0),
254d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff      ForwardDecl(FD), InternalInterface(isInternal),
255d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff      ClassLoc(CLoc) {
256980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocIntfRefProtocols(numRefProtos);
257980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
2580e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattnerpublic:
2590e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner
2600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static ObjCInterfaceDecl *Create(ASTContext &C,
2610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                   SourceLocation atLoc,
262d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff                                   unsigned numRefProtos,
263d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff                                   IdentifierInfo *Id,
264d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff                                   SourceLocation ClassLoc = SourceLocation(),
2650e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner                                   bool ForwardDecl = false,
2660e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner                                   bool isInternal = false);
267a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff
268a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff  // This is necessary when converting a forward declaration to a definition.
269980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocIntfRefProtocols(unsigned numRefProtos) {
270980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
271a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      ReferencedProtocols = new ObjCProtocolDecl*[numRefProtos];
2727ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      memset(ReferencedProtocols, '\0',
273a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek             numRefProtos*sizeof(ObjCProtocolDecl*));
2747ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumReferencedProtocols = numRefProtos;
275980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
276980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
277980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
278a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCProtocolDecl **getReferencedProtocols() const {
2797ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
2807ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  }
281c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian  unsigned getNumIntfRefProtocols() const { return NumReferencedProtocols; }
282980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
283a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef ObjCIvarDecl * const *ivar_iterator;
284be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner  ivar_iterator ivar_begin() const { return Ivars; }
2855564e07af5e62875f3b83fc2e5a8823588b5adeaChris Lattner  ivar_iterator ivar_end() const { return Ivars + ivar_size();}
286f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner  unsigned ivar_size() const { return NumIvars; }
287be6df088d69bca0e99c7845a6cd8c1ca85034f31Chris Lattner
288b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner  unsigned getNumInstanceMethods() const { return NumInstanceMethods; }
28962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner  unsigned getNumClassMethods() const { return NumClassMethods; }
290980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
291a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef ObjCMethodDecl * const * instmeth_iterator;
2924c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
2934c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  instmeth_iterator instmeth_end() const {
294b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner    return InstanceMethods+NumInstanceMethods;
2954c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  }
2964c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner
297a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef ObjCMethodDecl * const * classmeth_iterator;
2984c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods; }
2994c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  classmeth_iterator classmeth_end() const {
30062db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner    return ClassMethods+NumClassMethods;
3014c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner  }
3024c52509ffb9fdd6c93aa7b50812e316f1d920a26Chris Lattner
303a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void addInstanceVariablesToClass(ObjCIvarDecl **ivars, unsigned numIvars,
30460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                                   SourceLocation RBracLoc);
305980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
306a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers,
307a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                  ObjCMethodDecl **clsMethods, unsigned numClsMembers,
30860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEnd);
309980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
31055d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner  void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
31155d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner
3123dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  typedef ObjCPropertyDecl * const * classprop_iterator;
3133dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  classprop_iterator classprop_begin() const { return PropertyDecl; }
3143dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  classprop_iterator classprop_end() const {
3153dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian    return PropertyDecl+NumPropertyDecl;
3163dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  }
31755d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner
318768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return ForwardDecl; }
319768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { ForwardDecl = val; }
320980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
321a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setIntfRefProtocols(unsigned idx, ObjCProtocolDecl *OID) {
3227ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
3237ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
324980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
325980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
326a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl *getSuperClass() const { return SuperClass; }
327a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setSuperClass(ObjCInterfaceDecl * superCls) { SuperClass = superCls; }
328980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
329a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCCategoryDecl* getCategoryList() const { return CategoryList; }
330a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setCategoryList(ObjCCategoryDecl *category) {
33153efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner    CategoryList = category;
332980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
33353efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner
33453efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner  /// isSuperClassOf - Return true if this class is the specified class or is a
33553efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner  /// super class of the specified interface class.
33653efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner  bool isSuperClassOf(const ObjCInterfaceDecl *I) const {
33753efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner    // If RHS is derived from LHS it is OK; else it is not OK.
33853efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner    while (I != NULL) {
33953efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner      if (this == I)
34053efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner        return true;
34153efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner      I = I->getSuperClass();
34253efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner    }
34353efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner    return false;
34453efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner  }
34553efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner
346a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *ivarName,
347a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                                       ObjCInterfaceDecl *&clsDeclared);
348c81c8144a661a49d7b9dae8d2080dee2e43186ecChris Lattner
34958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
35053efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner  ObjCMethodDecl *getInstanceMethod(Selector Sel) {
35158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
3520e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner         I != E; ++I) {
35358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
35458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
35558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
3560e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner    return 0;
35758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
35858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
35953efc251792bf2c9c5f295bd3507facc51a1fe7eChris Lattner  ObjCMethodDecl *getClassMethod(Selector Sel) {
36058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
3610e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner         I != E; ++I) {
36258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
36358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
36458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
3650e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner    return 0;
36658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
36794a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Lookup a method. First, we search locally. If a method isn't
36894a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // found, we search referenced protocols and class categories.
369a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl *lookupInstanceMethod(Selector Sel);
370a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl *lookupClassMethod(Selector Sel);
37160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
372f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  // Location information, modeled after the Stmt API.
37360fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
374f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
375f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
37660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
377d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff  SourceLocation getClassLoc() const { return ClassLoc; }
378d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff  void setSuperClassLoc(SourceLocation Loc) { SuperClassLoc = Loc; }
379d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff  SourceLocation getSuperClassLoc() const { return SuperClassLoc; }
380d6a07aaf62b40cdfbd96f6b874d02b06fc22d015Steve Naroff
38160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  // We also need to record the @end location.
382f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
38382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
384f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner  unsigned getNumPropertyDecl() const { return NumPropertyDecl; }
38582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
38655d13b4d5530a14d5baa72adab32ae78ba256cafChris Lattner  ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; }
387a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; }
388f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff
3894b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ImplicitInterfaceDecl - check that this is an implicitely declared
390a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  /// ObjCInterfaceDecl node. This is for legacy objective-c @implementation
3914b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// declaration without an @interface declaration.
3923a3ca1b35a7121aea0bf465a192dce748465e10fFariborz Jahanian  bool ImplicitInterfaceDecl() const { return InternalInterface; }
3934b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian
394a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const Decl *D) { return D->getKind() == ObjCInterface; }
395a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCInterfaceDecl *D) { return true; }
396980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
397980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
398a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCIvarDecl - Represents an ObjC instance variable. In general, ObjC
3990c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C
4000c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example:
4010c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4020c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface IvarExample : NSObject
4030c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   {
4040c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id defaultToPrivate; // same as C++.
4050c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @public:
4060c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePublic; // same as C++.
4070c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @protected:
4080c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBeProtected; // same as C++.
4090c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @package:
4100c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePackage; // framework visibility (not available in C++).
4110c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
4120c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
413a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCIvarDecl : public FieldDecl {
414b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  ObjCIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
415b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    : FieldDecl(ObjCIvar, L, Id, T) {}
4160e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattnerpublic:
417b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static ObjCIvarDecl *Create(ASTContext &C, SourceLocation L,
4180e77ba0bf769e2e5a4a93c079f241b02aeb3ef93Chris Lattner                              IdentifierInfo *Id, QualType T);
419980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
420980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  enum AccessControl {
421980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    None, Private, Protected, Public, Package
422980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  };
423980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setAccessControl(AccessControl ac) { DeclAccess = ac; }
424ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  AccessControl getAccessControl() const { return AccessControl(DeclAccess); }
425980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
426980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Implement isa/cast/dyncast/etc.
427a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const Decl *D) { return D->getKind() == ObjCIvar; }
428a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCIvarDecl *D) { return true; }
429980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate:
430ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  // NOTE: VC++ treats enums as signed, avoid using the AccessControl enum
431ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  unsigned DeclAccess : 3;
432980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
433980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
434980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
435a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCProtocolDecl - Represents a protocol declaration. ObjC protocols
4360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted).
4370c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++
4380c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example:
4390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
440eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// @protocol NSDraggingInfo <refproto1, refproto2>
4410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow;
4420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage;
4430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
4440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
445eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// This says that NSDraggingInfo requires two methods and requires everything
446eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// that the two "referenced protocols" 'refproto1' and 'refproto2' require as
447eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner/// well.
448eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner///
4490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo>
4500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
4510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
452a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjC protocols inspired Java interfaces. Unlike Java, ObjC classes and
4530c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both
4540c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result,
4550c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows:
4560c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4570c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo;
4580c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
459a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCProtocolDecl : public NamedDecl {
460980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols
461a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCProtocolDecl **ReferencedProtocols;  // Null if none
462c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian  unsigned NumReferencedProtocols;  // 0 if none
463980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
464980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol instance methods
465a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl **InstanceMethods;  // Null if not defined
46662db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner  unsigned NumInstanceMethods;  // 0 if none
467980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
468980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol class methods
469a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl **ClassMethods;  // Null if not defined
47062db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner  unsigned NumClassMethods;  // 0 if none
4713dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian
4723dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  /// protocol properties
4733dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  ObjCPropertyDecl **PropertyDecl;  // Null if no property
4743dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  unsigned NumPropertyDecl;  // 0 if none
4753dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian
476980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool isForwardProtoDecl; // declared with @protocol.
477423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
478423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
479423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
480cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner
481c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner  ObjCProtocolDecl(SourceLocation L, unsigned numRefProtos, IdentifierInfo *Id)
482a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    : NamedDecl(ObjCProtocol, L, Id),
483c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian      ReferencedProtocols(0), NumReferencedProtocols(0),
48462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner      InstanceMethods(0), NumInstanceMethods(0),
48562db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner      ClassMethods(0), NumClassMethods(0),
4863dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian      PropertyDecl(0), NumPropertyDecl(0),
487c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner      isForwardProtoDecl(true) {
488cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner    AllocReferencedProtocols(numRefProtos);
489cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner  }
490cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattnerpublic:
491cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner  static ObjCProtocolDecl *Create(ASTContext &C, SourceLocation L,
492c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner                                  unsigned numRefProtos, IdentifierInfo *Id);
493cca59d77c4b84fd2da268018dbaf9431a621e75bChris Lattner
494980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocReferencedProtocols(unsigned numRefProtos) {
495980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
496a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      ReferencedProtocols = new ObjCProtocolDecl*[numRefProtos];
497980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      memset(ReferencedProtocols, '\0',
498a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek             numRefProtos*sizeof(ObjCProtocolDecl*));
499980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      NumReferencedProtocols = numRefProtos;
500980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
501980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
502a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers,
503a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                  ObjCMethodDecl **clsMethods, unsigned numClsMembers,
50460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
505980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
506a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setReferencedProtocols(unsigned idx, ObjCProtocolDecl *OID) {
507980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    assert((idx < NumReferencedProtocols) && "index out of range");
508980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    ReferencedProtocols[idx] = OID;
509980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
510980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
511a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCProtocolDecl** getReferencedProtocols() const {
512980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return ReferencedProtocols;
513980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
514c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian  unsigned getNumReferencedProtocols() const { return NumReferencedProtocols; }
515c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner  unsigned getNumInstanceMethods() const { return NumInstanceMethods; }
51662db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner  unsigned getNumClassMethods() const { return NumClassMethods; }
5173dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian
5183dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  unsigned getNumPropertyDecl() const { return NumPropertyDecl; }
5193dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian
5203dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; }
5213dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; }
5223dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian
5233dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
5243dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian
5253dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  typedef ObjCPropertyDecl * const * classprop_iterator;
5263dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  classprop_iterator classprop_begin() const { return PropertyDecl; }
5273dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  classprop_iterator classprop_end() const {
5283dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian    return PropertyDecl+NumPropertyDecl;
5293dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  }
53058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
531a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef ObjCMethodDecl * const * instmeth_iterator;
53258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
53358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_end() const {
53462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner    return InstanceMethods+NumInstanceMethods;
53558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
53658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
537a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef ObjCMethodDecl * const * classmeth_iterator;
53858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_begin() const { return ClassMethods; }
53958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_end() const {
54062db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner    return ClassMethods+NumClassMethods;
54158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
54258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
54358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
54462db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner  ObjCMethodDecl *getInstanceMethod(Selector Sel) {
54562db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
54662db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner         I != E; ++I) {
54758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
54858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
54958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
55062db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner    return 0;
55158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
55258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
55362db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner  ObjCMethodDecl *getClassMethod(Selector Sel) {
55458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
55562db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner         I != E; ++I) {
55658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
55758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
55858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
55962db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner    return 0;
56058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
561980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
56294a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Lookup a method. First, we search locally. If a method isn't
56394a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // found, we search referenced protocols and class categories.
564a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl *lookupInstanceMethod(Selector Sel);
565a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl *lookupClassMethod(Selector Sel);
5667dd82836dca87cf828ce994f161b53a34f6cdb7eFariborz Jahanian
567768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return isForwardProtoDecl; }
568768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { isForwardProtoDecl = val; }
569980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
570423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
571423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'protocol
572423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
573423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
574423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
575423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
576423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
577423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
578a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const Decl *D) { return D->getKind() == ObjCProtocol; }
579a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCProtocolDecl *D) { return true; }
580980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
581980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
582a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCClassDecl - Specifies a list of forward class declarations. For example:
58306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
58406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow;
5850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
586a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCClassDecl : public Decl {
587a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl **ForwardDecls;
5887e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  unsigned NumForwardDecls;
58961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
590a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCClassDecl(SourceLocation L, ObjCInterfaceDecl **Elts, unsigned nElts)
591a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    : Decl(ObjCClass, L) {
59206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
593a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      ForwardDecls = new ObjCInterfaceDecl*[nElts];
594a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      memcpy(ForwardDecls, Elts, nElts*sizeof(ObjCInterfaceDecl*));
5957e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    } else {
5967e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      ForwardDecls = 0;
59706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    }
59806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    NumForwardDecls = nElts;
59906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
60061f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic:
60161f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner  static ObjCClassDecl *Create(ASTContext &C, SourceLocation L,
60261f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner                               ObjCInterfaceDecl **Elts, unsigned nElts);
60361f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
604a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setInterfaceDecl(unsigned idx, ObjCInterfaceDecl *OID) {
6057e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    assert(idx < NumForwardDecls && "index out of range");
60606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    ForwardDecls[idx] = OID;
60706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
608a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl** getForwardDecls() const { return ForwardDecls; }
6097e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  int getNumForwardDecls() const { return NumForwardDecls; }
6107e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff
611a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const Decl *D) { return D->getKind() == ObjCClass; }
612a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCClassDecl *D) { return true; }
61306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff};
61406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff
615a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCForwardProtocolDecl - Specifies a list of forward protocol declarations.
61606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example:
61706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
6180c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
6190c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
620a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCForwardProtocolDecl : public Decl {
621a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCProtocolDecl **ReferencedProtocols;
6229fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned NumReferencedProtocols;
62361f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
6240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  ObjCForwardProtocolDecl(SourceLocation L,
625a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                          ObjCProtocolDecl **Elts, unsigned nElts)
626a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  : Decl(ObjCForwardProtocol, L) {
627b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner    NumReferencedProtocols = nElts;
62806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
629a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      ReferencedProtocols = new ObjCProtocolDecl*[nElts];
630a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjCProtocolDecl*));
6319fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    } else {
6329fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner      ReferencedProtocols = 0;
633980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
63406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
63561f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic:
63661f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner  static ObjCForwardProtocolDecl *Create(ASTContext &C, SourceLocation L,
63761f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner                                         ObjCProtocolDecl **Elts, unsigned Num);
63861f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
63961f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
640a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setForwardProtocolDecl(unsigned idx, ObjCProtocolDecl *OID) {
6419fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
6427ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
64306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
6449fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
6459fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned getNumForwardDecls() const { return NumReferencedProtocols; }
6469fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
647a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCProtocolDecl *getForwardProtocolDecl(unsigned idx) {
6489fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
6499fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
6509fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
651a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  const ObjCProtocolDecl *getForwardProtocolDecl(unsigned idx) const {
6529fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
6539fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
6549fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
6559fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
65606ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const Decl *D) {
657a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    return D->getKind() == ObjCForwardProtocol;
65806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
659a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCForwardProtocolDecl *D) { return true; }
660980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
661980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
662a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCategoryDecl - Represents a category declaration. A category allows
6630c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying
6640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow
6650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all
6660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process:
6670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
6680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods)
6690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod;
6700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
6710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
6720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across
6730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++).
6740c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
6750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common
67668c82cf61228102aba1194efef222fa1478af2a8Chris Lattner/// Lisp and Smalltalk.  More traditional class-based languages (C++, Java)
6770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous.
6780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
679a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCCategoryDecl : public NamedDecl {
680980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Interface belonging to this category
681a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl *ClassInterface;
682980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
68368c82cf61228102aba1194efef222fa1478af2a8Chris Lattner  /// referenced protocols in this category.
684a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCProtocolDecl **ReferencedProtocols;  // Null if none
685c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian  unsigned NumReferencedProtocols;  // 0 if none
686980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
687980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category instance methods
688a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl **InstanceMethods;  // Null if not defined
689c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner  unsigned NumInstanceMethods;  // 0 if none
690980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
691980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category class methods
692a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl **ClassMethods;  // Null if not defined
693a906135721c350435319347d2672bbb3bf494f91Chris Lattner  unsigned NumClassMethods;  // 0 if not defined
694980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
695980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Next category belonging to this class
696a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCCategoryDecl *NextClassCategory;
697ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
6987e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian  /// category properties
6997e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian  ObjCPropertyDecl **PropertyDecl;  // Null if no property
7007e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian  unsigned NumPropertyDecl;  // 0 if none
7017e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian
702423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
703423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
70461f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
70568c82cf61228102aba1194efef222fa1478af2a8Chris Lattner  ObjCCategoryDecl(SourceLocation L, IdentifierInfo *Id)
706a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    : NamedDecl(ObjCCategory, L, Id),
707c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian      ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(0),
708c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner      InstanceMethods(0), NumInstanceMethods(0),
709a906135721c350435319347d2672bbb3bf494f91Chris Lattner      ClassMethods(0), NumClassMethods(0),
7107e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian      NextClassCategory(0), PropertyDecl(0),  NumPropertyDecl(0) {
711a906135721c350435319347d2672bbb3bf494f91Chris Lattner  }
71261f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattnerpublic:
71361f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
7140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static ObjCCategoryDecl *Create(ASTContext &C,
7150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                  SourceLocation L, IdentifierInfo *Id);
71661f9d41036e30ff80130f99b31c0626e3ef057ccChris Lattner
717e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  ObjCInterfaceDecl *getClassInterface() { return ClassInterface; }
718e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; }
719a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setClassInterface(ObjCInterfaceDecl *IDecl) { ClassInterface = IDecl; }
720980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
72168c82cf61228102aba1194efef222fa1478af2a8Chris Lattner  void setReferencedProtocolList(ObjCProtocolDecl **List, unsigned NumRPs);
72268c82cf61228102aba1194efef222fa1478af2a8Chris Lattner
723a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void setCatReferencedProtocols(unsigned idx, ObjCProtocolDecl *OID) {
7247ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
7257ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
726980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
727980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
728a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCProtocolDecl **getReferencedProtocols() const {
7297ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
7308f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  }
731c395bda57a0b2f6d8433a462caa780a7dcb7307bFariborz Jahanian  unsigned getNumReferencedProtocols() const { return NumReferencedProtocols; }
732c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner  unsigned getNumInstanceMethods() const { return NumInstanceMethods; }
733a906135721c350435319347d2672bbb3bf494f91Chris Lattner  unsigned getNumClassMethods() const { return NumClassMethods; }
73458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
7357e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian  unsigned getNumPropertyDecl() const { return NumPropertyDecl; }
7367e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian
7377e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian  ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; }
7387e7e3872b584bc5e7de7a34c8b9c092032303b72Fariborz Jahanian
7393dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
7403dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian
7413dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  typedef ObjCPropertyDecl * const * classprop_iterator;
7423dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  classprop_iterator classprop_begin() const { return PropertyDecl; }
7433dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  classprop_iterator classprop_end() const {
7443dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian    return PropertyDecl+NumPropertyDecl;
7453dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian  }
7463dd4ba4068e953125b95ce85c723322cdd0a3cb5Fariborz Jahanian
747a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef ObjCMethodDecl * const * instmeth_iterator;
74858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
74958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  instmeth_iterator instmeth_end() const {
750c858105d41602a2dadb2efbc1af80a7b791ebac3Chris Lattner    return InstanceMethods+NumInstanceMethods;
75158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
75258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
753a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef ObjCMethodDecl * const * classmeth_iterator;
75458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_begin() const { return ClassMethods; }
75558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  classmeth_iterator classmeth_end() const {
756a906135721c350435319347d2672bbb3bf494f91Chris Lattner    return ClassMethods+NumClassMethods;
75758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
75858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff
75958dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local instance method declared in this interface.
76068c82cf61228102aba1194efef222fa1478af2a8Chris Lattner  ObjCMethodDecl *getInstanceMethod(Selector Sel) {
76158dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end();
76268c82cf61228102aba1194efef222fa1478af2a8Chris Lattner         I != E; ++I) {
76358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
76458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
76558dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
76668c82cf61228102aba1194efef222fa1478af2a8Chris Lattner    return 0;
76758dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
76858dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  // Get the local class method declared in this interface.
76968c82cf61228102aba1194efef222fa1478af2a8Chris Lattner  ObjCMethodDecl *getClassMethod(Selector Sel) {
77058dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end();
77168c82cf61228102aba1194efef222fa1478af2a8Chris Lattner         I != E; ++I) {
77258dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff      if ((*I)->getSelector() == Sel)
77358dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff        return *I;
77458dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff    }
77568c82cf61228102aba1194efef222fa1478af2a8Chris Lattner    return 0;
77658dbdeb69c063f82d644504fc638120198f7fad2Steve Naroff  }
7778f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
778a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers,
779a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                  ObjCMethodDecl **clsMethods, unsigned numClsMembers,
78060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
781980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
782a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCCategoryDecl *getNextClassCategory() const { return NextClassCategory; }
783980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void insertNextClassCategory() {
7843d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    NextClassCategory = ClassInterface->getCategoryList();
7853d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    ClassInterface->setCategoryList(this);
786980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
787423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
788423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
789423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
790423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
791423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
792423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
793423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
794ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
795a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const Decl *D) { return D->getKind() == ObjCCategory; }
796a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCCategoryDecl *D) { return true; }
797980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
7980c6b6243d3efd958c17943130e2a773653511edcSteve Naroff
799a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCategoryImplDecl - An object of this class encapsulates a category
8008f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// @implementation declaration.
801a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCCategoryImplDecl : public NamedDecl {
8028f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// Class interface for this category implementation
803a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl *ClassInterface;
8048f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
805e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  /// implemented instance methods
806a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  llvm::SmallVector<ObjCMethodDecl*, 32> InstanceMethods;
8078f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
808e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  /// implemented class methods
809a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  llvm::SmallVector<ObjCMethodDecl*, 32> ClassMethods;
810e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
811e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation EndLoc;
81275c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner
813a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCCategoryImplDecl(SourceLocation L, IdentifierInfo *Id,
814a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                       ObjCInterfaceDecl *classInterface)
815a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    : NamedDecl(ObjCCategoryImpl, L, Id), ClassInterface(classInterface) {}
81675c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattnerpublic:
8170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static ObjCCategoryImplDecl *Create(ASTContext &C,
8180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                      SourceLocation L, IdentifierInfo *Id,
81975c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner                                      ObjCInterfaceDecl *classInterface);
8208f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
821e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; }
822e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  ObjCInterfaceDecl *getClassInterface() { return ClassInterface; }
8238f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
824ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  unsigned getNumInstanceMethods() const { return InstanceMethods.size(); }
825ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  unsigned getNumClassMethods() const { return ClassMethods.size(); }
826e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
827a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void addInstanceMethod(ObjCMethodDecl *method) {
828e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    InstanceMethods.push_back(method);
829e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
830a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void addClassMethod(ObjCMethodDecl *method) {
831e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff    ClassMethods.push_back(method);
832e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  }
83394a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Get the instance method definition for this implementation.
834a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl *getInstanceMethod(Selector Sel);
83594a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff
83694a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Get the class method definition for this implementation.
837a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl *getClassMethod(Selector Sel);
838e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
839a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator
840ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner    instmeth_iterator;
841ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); }
842ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  instmeth_iterator instmeth_end() const { return InstanceMethods.end(); }
843ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
844a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator
845ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner    classmeth_iterator;
846ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); }
847ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner  classmeth_iterator classmeth_end() const { return ClassMethods.end(); }
848ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
849ab4c4d5e5ececa77aae7e291fafcba3049319cdcChris Lattner
850e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  // Location information, modeled after the Stmt API.
851e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
852e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
853e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
854e1e6c0d5c79c0ee7ed62fef47a19aa7ecef40db4Steve Naroff
855a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const Decl *D) { return D->getKind() == ObjCCategoryImpl;}
856a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCCategoryImplDecl *D) { return true; }
8578f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian};
8588f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
859a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCImplementationDecl - Represents a class definition - this is where
8600c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example:
8610c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
8620c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass
8630c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ }
8640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
8650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
8660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface,
8670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we
8680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When
8690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we
8700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing
8710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations
8720c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-)
8730c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
874a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekclass ObjCImplementationDecl : public NamedDecl {
875dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian  /// Class interface for this implementation
876a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl *ClassInterface;
877f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
878980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Implementation Class's super class.
879a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl *SuperClass;
880980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
881980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
882a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCIvarDecl **Ivars;   // Null if not specified
883f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner  unsigned NumIvars;      // 0 if none.
8840416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
885980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented instance methods
886a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  llvm::SmallVector<ObjCMethodDecl*, 32> InstanceMethods;
8870416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
888980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented class methods
889a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  llvm::SmallVector<ObjCMethodDecl*, 32> ClassMethods;
8900416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
8910416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation EndLoc;
89275c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner
893a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCImplementationDecl(SourceLocation L, IdentifierInfo *Id,
894a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                         ObjCInterfaceDecl *classInterface,
895a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                         ObjCInterfaceDecl *superDecl)
896a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    : NamedDecl(ObjCImplementation, L, Id),
8970416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff      ClassInterface(classInterface), SuperClass(superDecl),
898f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner      Ivars(0), NumIvars(0) {}
89975c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattnerpublic:
9000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static ObjCImplementationDecl *Create(ASTContext &C,
9010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                        SourceLocation L, IdentifierInfo *Id,
90275c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner                                        ObjCInterfaceDecl *classInterface,
90375c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner                                        ObjCInterfaceDecl *superDecl);
90475c9cae5f85c72cbb1649e93849e16ede3f07522Chris Lattner
905980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
906a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void ObjCAddInstanceVariablesToClassImpl(ObjCIvarDecl **ivars,
907980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                                           unsigned numIvars);
908980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
909a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void addInstanceMethod(ObjCMethodDecl *method) {
9100416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    InstanceMethods.push_back(method);
9110416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
912a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  void addClassMethod(ObjCMethodDecl *method) {
9130416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff    ClassMethods.push_back(method);
9140416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  }
9150416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  // Location information, modeled after the Stmt API.
9160416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation getLocStart() const { return getLocation(); }
9170416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
9180416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
9190416fb9f379b49abb3eb0c1cb2ca75107e5a71d1Steve Naroff
920e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  const ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; }
921e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  ObjCInterfaceDecl *getClassInterface() { return ClassInterface; }
922e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  const ObjCInterfaceDecl *getSuperClass() const { return SuperClass; }
923e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner  ObjCInterfaceDecl *getSuperClass() { return SuperClass; }
924980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
925f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner  void setSuperClass(ObjCInterfaceDecl * superCls) { SuperClass = superCls; }
926980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
927b5feb35360526da42ad7e3fa7ef3d44a5992b83cChris Lattner  unsigned getNumInstanceMethods() const { return InstanceMethods.size(); }
92862db2f4214c1589082960f12c9cb8924fe0cf8c5Chris Lattner  unsigned getNumClassMethods() const { return ClassMethods.size(); }
929c43d868355374d48296ad3be2c9c536698a5e9a8Steve Naroff
930a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator
9310157c5144513438bb74aebf50d18f95df4104acbChris Lattner       instmeth_iterator;
9320157c5144513438bb74aebf50d18f95df4104acbChris Lattner  instmeth_iterator instmeth_begin() const { return InstanceMethods.begin(); }
9330157c5144513438bb74aebf50d18f95df4104acbChris Lattner  instmeth_iterator instmeth_end() const { return InstanceMethods.end(); }
9340157c5144513438bb74aebf50d18f95df4104acbChris Lattner
935a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef llvm::SmallVector<ObjCMethodDecl*, 32>::const_iterator
9360157c5144513438bb74aebf50d18f95df4104acbChris Lattner    classmeth_iterator;
9370157c5144513438bb74aebf50d18f95df4104acbChris Lattner  classmeth_iterator classmeth_begin() const { return ClassMethods.begin(); }
9380157c5144513438bb74aebf50d18f95df4104acbChris Lattner  classmeth_iterator classmeth_end() const { return ClassMethods.end(); }
9390157c5144513438bb74aebf50d18f95df4104acbChris Lattner
94094a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Get the instance method definition for this implementation.
941a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl *getInstanceMethod(Selector Sel);
9420157c5144513438bb74aebf50d18f95df4104acbChris Lattner
94394a5c3334bba3cc8cd1da85ba1118bc2c080add9Steve Naroff  // Get the class method definition for this implementation.
944a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCMethodDecl *getClassMethod(Selector Sel);
9450157c5144513438bb74aebf50d18f95df4104acbChris Lattner
946a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  typedef ObjCIvarDecl * const *ivar_iterator;
9470157c5144513438bb74aebf50d18f95df4104acbChris Lattner  ivar_iterator ivar_begin() const { return Ivars; }
948f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner  ivar_iterator ivar_end() const { return Ivars+NumIvars; }
949f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner  unsigned ivar_size() const { return NumIvars; }
950f3a7af901231535191d14cb524d58f22907ac4d2Chris Lattner  bool ivar_empty() const { return NumIvars == 0; }
9510157c5144513438bb74aebf50d18f95df4104acbChris Lattner
952980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) {
953a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    return D->getKind() == ObjCImplementation;
954980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
955a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCImplementationDecl *D) { return true; }
956980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
957243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
958a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCCompatibleAliasDecl - Represents alias of a class. This alias is
959243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class.
960e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroffclass ObjCCompatibleAliasDecl : public NamedDecl {
961243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  /// Class that this is an alias of.
962a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCInterfaceDecl *AliasedClass;
963243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
964a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id,
965e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroff                          ObjCInterfaceDecl* aliasedClass)
966e8043c39176e7f253fbd92982b077eca6bf2fd59Steve Naroff    : NamedDecl(ObjCCompatibleAlias, L, Id), AliasedClass(aliasedClass) {}
967f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattnerpublic:
9680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static ObjCCompatibleAliasDecl *Create(ASTContext &C,
9690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                         SourceLocation L, IdentifierInfo *Id,
970f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner                                         ObjCInterfaceDecl* aliasedClass);
971f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner
972f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner  const ObjCInterfaceDecl *getClassInterface() const { return AliasedClass; }
973f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner  ObjCInterfaceDecl *getClassInterface() { return AliasedClass; }
974980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
975243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const Decl *D) {
9768a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner    return D->getKind() == ObjCCompatibleAlias;
977243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  }
978a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCCompatibleAliasDecl *D) { return true; }
979243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
980243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian};
9811de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian
9821de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// ObjCPropertyDecl - Represents one property declaration in an interface.
9831de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// For example:
9841de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian/// @property (assign, readwrite) int MyProperty;
9851de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian///
9861de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanianclass ObjCPropertyDecl : public NamedDecl {
98782a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianpublic:
988a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner  enum PropertyAttributeKind {
989a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_noattr    = 0x00,
990a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_readonly  = 0x01,
991a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_getter    = 0x02,
992a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_assign    = 0x04,
993a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_readwrite = 0x08,
994a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_retain    = 0x10,
995a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_copy      = 0x20,
996a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_nonatomic = 0x40,
997a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    OBJC_PR_setter    = 0x80
998a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner  };
99982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanianprivate:
1000dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian  QualType DeclType;
1001ca63fa00786e51c207c829f4182f11a6c6b552beTed Kremenek  unsigned PropertyAttributes : 8;
100282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
100382a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *GetterName;    // getter name of NULL if no getter
100482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  IdentifierInfo *SetterName;    // setter name of NULL if no setter
100582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
10061de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian  ObjCPropertyDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
10071de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian    : NamedDecl(ObjCProperty, L, Id), DeclType(T),
1008f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattner      PropertyAttributes(OBJC_PR_noattr), GetterName(0), SetterName(0) {}
1009f8d17a59167d9c2026506ed8813ea434d93b662aChris Lattnerpublic:
10101de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian  static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L,
10111de1e74541c25c1a7b721f1c3991ea34c8403420Fariborz Jahanian                                  IdentifierInfo *Id, QualType T);
1012dae1a1a2aa4f245b1958dc8db6089f24c575ef13Fariborz Jahanian  QualType getType() const { return DeclType; }
1013a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner  PropertyAttributeKind getPropertyAttributes() const {
1014f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner    return PropertyAttributeKind(PropertyAttributes);
1015f4af5154571e0c5eadb19df10e65464766ef6683Chris Lattner  }
1016564576b225386cbff375351597dd5e2a92872d38Fariborz Jahanian  void setPropertyAttributes(PropertyAttributeKind PRVal) {
1017a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner    PropertyAttributes |= PRVal;
101882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
101982a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
1020a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner  IdentifierInfo *getGetterName() const { return GetterName; }
102182a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setGetterName(IdentifierInfo *Id) { GetterName = Id; }
102282a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
1023a5674258f5e6f74f1c0ed3ece4d64fbb1b9afb11Chris Lattner  IdentifierInfo *getSetterName() const { return SetterName; }
102482a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  void setSetterName(IdentifierInfo *Id) { SetterName = Id; }
102582a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian
102682a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  static bool classof(const Decl *D) {
1027670aa9d7639278f507930e95dc89c12032ab7c7eSam Bishop    return D->getKind() == ObjCProperty;
102882a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian  }
1029a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  static bool classof(const ObjCPropertyDecl *D) { return true; }
103082a5fe3d1cf204b672cdab24d72275b6ad2c3527Fariborz Jahanian};
1031980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
103261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// ObjCPropertyImplDecl - Represents implementation declaration of a property
103361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// in a class or category implementation block. For example:
103461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian/// @synthesize prop1 = ivar1;
103561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian///
103661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianclass ObjCPropertyImplDecl : public Decl {
103761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianpublic:
103861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  enum PropertyImplKind {
103961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian    OBJC_PR_IMPL_None,
104061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian    OBJC_PR_IMPL_SYNTHSIZE,
104161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian    OBJC_PR_IMPL_DYNAMIC
104261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  };
104361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianprivate:
104461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  /// Property declaration being implemented
104561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  ObjCPropertyDecl *PropertyDecl;
104661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  PropertyImplKind PropertyImplementation;
104761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  /// Null for @dynamic. Required for @synthesize.
104861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  ObjCIvarDecl *PropertyIvarDecl;
104961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanianpublic:
105061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  ObjCPropertyImplDecl(SourceLocation L)
105161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  : Decl(ObjCPropertyImpl, L), PropertyDecl(0),
105261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  PropertyImplementation(OBJC_PR_IMPL_None), PropertyIvarDecl(0) {}
105361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian
105461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  void setPropertyDecl(ObjCPropertyDecl *property) { PropertyDecl = property; }
105561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  ObjCPropertyDecl *getPropertyDecl() const { return PropertyDecl; }
105661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian
105761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  void setImplKind (PropertyImplKind propImplKind)
105861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian    { PropertyImplementation = propImplKind; }
105961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  PropertyImplKind getPropertyImplementation() const
106061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian    { return PropertyImplementation; }
106161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian
106261d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  void setPropertyIvarDecl(ObjCIvarDecl *ivarDecl)
106361d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian    { PropertyIvarDecl = ivarDecl; }
106461d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  ObjCIvarDecl *getPropertyIvarDecl() { return PropertyIvarDecl; }
106561d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian
106661d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  static bool classof(const Decl *D) {
106761d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian    return D->getKind() == ObjCPropertyImpl;
106861d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  }
106961d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian  static bool classof(const ObjCPropertyImplDecl *D) { return true; }
107061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian};
107161d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian
1072980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}  // end namespace clang
1073980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif
1074