DeclObjC.h revision 8be9d0a9cdce8baa53844e54f6045c4600274269
1980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//===--- DeclObjC.h - Classes for representing declarations -----*- C++ -*-===//
2980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//
3980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//                     The LLVM Compiler Infrastructure
4980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff//
5980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// This file was developed by Steve Naroff and is distributed under
6980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// the University of Illinois Open Source 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;
25980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcIvarDecl;
26980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcMethodDecl;
27980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcProtocolDecl;
28980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcCategoryDecl;
29980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
300c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcInterfaceDecl - Represents an ObjC class declaration. For example:
310c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
320c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   // MostPrimitive declares no super class (not particularly useful).
330c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface MostPrimitive
340c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     // no instance variables or methods.
350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end
360c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
37fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner///   // NSResponder inherits from NSObject & implements NSCoding (a protocol).
380c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface NSResponder : NSObject <NSCoding>
390c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   { // instance variables are represented by ObjcIvarDecl.
400c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id nextResponder; // nextResponder instance variable.
410c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
420c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (NSResponder *)nextResponder; // return a pointer to NSResponder.
430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   - (void)mouseMoved:(NSEvent *)theEvent; // return void, takes a pointer
440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @end                                    // to an NSEvent.
450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, forward class declarations are accomplished with @class.
470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C/C++, @class allows for a list of classes to be forward declared.
480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes
490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   typically inherit from NSObject (an exception is NSProxy).
500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
51980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcInterfaceDecl : public TypeDecl {
52980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
53980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Class's super class.
54980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
55980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
56980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Protocols referenced in interface header declaration
577ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
587ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
59980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
60980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
61980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not defined.
62980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
63980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
64980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// instance methods
657ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
67980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
68980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// class methods
697ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
707ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
71980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
72980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// List of categories defined for this class.
733d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  ObjcCategoryDecl *CategoryList;
74980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
75768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool ForwardDecl; // declared with @class.
7660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
77f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation EndLoc; // marks the '>', '}', or identifier.
78f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
79980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
8060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  ObjcInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos,
81980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                    IdentifierInfo *Id, bool FD = false)
8260fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff    : TypeDecl(ObjcInterface, atLoc, Id, 0), SuperClass(0),
837ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols(0), NumReferencedProtocols(-1), Ivars(0),
847ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumIvars(-1),
857ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
867ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
873d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff      CategoryList(0), ForwardDecl(FD) {
88980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocIntfRefProtocols(numRefProtos);
89980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
90a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff
91a5997c4f36e0f5aa44623a5b1e3b914760d1ec68Steve Naroff  // This is necessary when converting a forward declaration to a definition.
92980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocIntfRefProtocols(unsigned numRefProtos) {
93980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
947ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
957ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      memset(ReferencedProtocols, '\0',
96980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
977ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      NumReferencedProtocols = numRefProtos;
98980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
99980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
100980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1017ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
1027ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
1037ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  }
1047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumIntfRefProtocols() const { return NumReferencedProtocols; }
105980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
106980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **getIntfDeclIvars() const { return Ivars; }
107980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int getIntfDeclNumIvars() const { return NumIvars; }
108980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; }
1107ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
111980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getClassMethods() const { return ClassMethods; }
1137ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
114980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
11560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addInstanceVariablesToClass(ObjcIvarDecl **ivars, unsigned numIvars,
11660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                                   SourceLocation RBracLoc);
117980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
11860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
11960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
12060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEnd);
121980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
122768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return ForwardDecl; }
123768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { ForwardDecl = val; }
124980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
125980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setIntfRefProtocols(int idx, ObjcProtocolDecl *OID) {
1267ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
1277ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
128980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
129980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
130980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
131980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setSuperClass(ObjcInterfaceDecl * superCls) { SuperClass = superCls; }
132980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1333d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  ObjcCategoryDecl* getCategoryList() const { return CategoryList; }
1343d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff  void setCategoryList(ObjcCategoryDecl *category) {
1353d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff         CategoryList = category;
136980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
1376a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
1386a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  ObjcMethodDecl *lookupClassMethod(Selector &Sel);
13960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
140f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  // Location information, modeled after the Stmt API.
14160fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
142f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
143f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
14460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff
14560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  // We also need to record the @end location.
146f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
147f908a87299d278164540f90b5b6e6cab7b14fb41Steve Naroff
1484b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ImplicitInterfaceDecl - check that this is an implicitely declared
1494b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// ObjcInterfaceDecl node. This is for legacy objective-c @implementation
1504b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  /// declaration without an @interface declaration.
1514b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian  bool ImplicitInterfaceDecl() const { return getLocation().isInvalid(); }
1524b6df3fa953267c5d755628c8afd818bb571e579Fariborz Jahanian
153aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcInterface; }
154980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcInterfaceDecl *D) { return true; }
155980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
156980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1570c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcIvarDecl - Represents an ObjC instance variable. In general, ObjC
1580c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// instance variables are identical to C. The only exception is Objective-C
1590c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// supports C++ style access control. For example:
1600c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1610c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @interface IvarExample : NSObject
1620c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   {
1630c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id defaultToPrivate; // same as C++.
1640c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @public:
1650c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePublic; // same as C++.
1660c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @protected:
1670c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBeProtected; // same as C++.
1680c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   @package:
1690c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///     id canBePackage; // framework visibility (not available in C++).
1700c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///   }
1710c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
172980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcIvarDecl : public FieldDecl {
173980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
174980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
175980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    : FieldDecl(ObjcIvar, L, Id, T) {}
176980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
177980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  enum AccessControl {
178980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    None, Private, Protected, Public, Package
179980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  };
180980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setAccessControl(AccessControl ac) { DeclAccess = ac; }
181980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl getAccessControl() const { return DeclAccess; }
182980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
183980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Implement isa/cast/dyncast/etc.
184980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) { return D->getKind() == ObjcIvar; }
185980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcIvarDecl *D) { return true; }
186980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate:
187980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AccessControl DeclAccess : 3;
188980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
189980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
1900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcMethodDecl - Represents an instance or class method declaration.
1910c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjC methods can be declared within 4 contexts: class interfaces,
1920c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// categories, protocols, and class implementations. While C++ member
1930c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// functions leverage C syntax, Objective-C method syntax is modeled after
1940c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Smalltalk (using colons to specify argument types/expressions).
1950c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Here are some brief examples:
1960c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
1970c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Setter/getter instance methods:
1980c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)setMenu:(NSMenu *)menu;
1990c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSMenu *)menu;
2000c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2010c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Instance method that takes 2 NSView arguments:
2020c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView;
2030c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2040c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Getter class method:
2050c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// + (NSMenu *)defaultMenu;
2060c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2070c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// A selector represents a unique name for a method. The selector names for
2080c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu.
2090c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
210980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffclass ObjcMethodDecl : public Decl {
211980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
212980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  enum ImplementationControl { None, Required, Optional };
213980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffprivate:
214980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Bitfields must be first fields in this class so they pack with those
215980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// declared in class Decl.
216980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// instance (true) or class (false) method.
217980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool IsInstance : 1;
218980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// @required/@optional
219980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ImplementationControl DeclImplementation : 2;
220980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2218be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian  /// in, inout, etc.
2228be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian  ObjcDeclQualifier objcDeclQualifier : 6;
2238be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian
224980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // A unigue name for this method.
225980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  Selector SelName;
226980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
227980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Type of this method.
228980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  QualType MethodDeclType;
229980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// ParamInfo - new[]'d array of pointers to VarDecls for the formal
230980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// parameters of this Method.  This is null if there are no formals.
231980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ParmVarDecl **ParamInfo;
232980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumMethodParams;  // -1 if no parameters
233980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
234980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// List of attributes for this method declaration.
235980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AttributeList *MethodAttrs;
236980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
237bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  SourceLocation EndLoc; // the location of the ';' or '{'.
238980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
239bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  ObjcMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
240bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff                 Selector SelInfo, QualType T,
241980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 ParmVarDecl **paramInfo = 0, int numParams=-1,
242980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 AttributeList *M = 0, bool isInstance = true,
243980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 ImplementationControl impControl = None,
244980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 Decl *PrevDecl = 0)
245bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff    : Decl(ObjcMethod, beginLoc),
246980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      IsInstance(isInstance), DeclImplementation(impControl),
2478be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian      objcDeclQualifier(OBJC_TQ_None),
248980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      SelName(SelInfo), MethodDeclType(T),
249980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ParamInfo(paramInfo), NumMethodParams(numParams),
250bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff      MethodAttrs(M), EndLoc(endLoc) {}
251980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  virtual ~ObjcMethodDecl();
25285ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian
2538be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian  ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; }
2548be9d0a9cdce8baa53844e54f6045c4600274269Fariborz Jahanian
255bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  // Location information, modeled after the Stmt API.
256bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  SourceLocation getLocStart() const { return getLocation(); }
257bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
258bef1185418705e16012b3dd50cd7c260c8d6b79cSteve Naroff
2593bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff  Selector getSelector() const { return SelName; }
2603bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff  QualType getResultType() const { return MethodDeclType; }
2613bea81bbae827195acfdf7bedfb7ac80c487dc63Steve Naroff
26285ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian  int getNumParams() const { return NumMethodParams; }
26385ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian  ParmVarDecl *getParamDecl(int i) const {
26485ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian    assert(i < getNumParams() && "Illegal param #");
26585ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian    return ParamInfo[i];
26685ff2646c1aeedd1105f867a5bba8a58febd1d2aFariborz Jahanian  }
267980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
268980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
269980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  AttributeList *getMethodAttrs() const {return MethodAttrs;}
270980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool isInstance() const { return IsInstance; }
271980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Related to protocols declared in  @protocol
272980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setDeclImplementation(ImplementationControl ic)
273980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff         { DeclImplementation = ic; }
274980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ImplementationControl  getImplementationControl() const
275980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                           { return DeclImplementation; }
276980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
277980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  // Implement isa/cast/dyncast/etc.
278aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcMethod; }
279980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcMethodDecl *D) { return true; }
280980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
281980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
2820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcProtocolDecl - Represents a protocol declaration. ObjC protocols
2830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// declare a pure abstract type (i.e no instance variables are permitted).
2840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Protocols orginally drew inspiration from C++ pure virtual functions (a C++
2850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// feature with nice semantics and lousy syntax:-). Here is an example:
2860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSDraggingInfo
2880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSWindow *)draggingDestinationWindow;
2890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (NSImage *)draggedImage;
2900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
2910c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2920c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface ImplementsNSDraggingInfo : NSObject <NSDraggingInfo>
2930c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
2940c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
2950c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Objc protocols inspired Java interfaces. Unlike Java, ObjC classes and
2960c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are in distinct namespaces. For example, Cocoa defines both
2970c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// an NSObject protocol and class (which isn't allowed in Java). As a result,
2980c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// protocols are referenced using angle brackets as follows:
2990c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
3000c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo;
3010c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
30205672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanianclass ObjcProtocolDecl : public NamedDecl {
303980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols
304980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
305980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumReferencedProtocols;  // -1 if none
306980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
307980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol instance methods
3087ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
3097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
310980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
311980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// protocol class methods
3127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
3137ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
314980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
315980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  bool isForwardProtoDecl; // declared with @protocol.
316423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
317423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
318423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
319980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
320980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl(SourceLocation L, unsigned numRefProtos,
321980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                   IdentifierInfo *Id, bool FD = false)
32205672a0ce85f6a203a960a856d30c4606ab136a7Fariborz Jahanian    : NamedDecl(ObjcProtocol, L, Id),
323980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols(0), NumReferencedProtocols(-1),
3247ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
3257ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
326980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      isForwardProtoDecl(FD) {
327980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        AllocReferencedProtocols(numRefProtos);
328980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
329980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void AllocReferencedProtocols(unsigned numRefProtos) {
330980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    if (numRefProtos) {
331980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      ReferencedProtocols = new ObjcProtocolDecl*[numRefProtos];
332980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      memset(ReferencedProtocols, '\0',
333980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff             numRefProtos*sizeof(ObjcProtocolDecl*));
334980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      NumReferencedProtocols = numRefProtos;
335980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
336980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
33760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
33860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
33960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
340980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
341980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
342980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    assert((idx < NumReferencedProtocols) && "index out of range");
343980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    ReferencedProtocols[idx] = OID;
344980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
345980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
346980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcProtocolDecl** getReferencedProtocols() const {
347980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return ReferencedProtocols;
348980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
349980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
350980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3517ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; }
3527ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
353980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
3547ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl** getClassMethods() const { return ClassMethods; }
3557ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
356980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
357768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  bool isForwardDecl() const { return isForwardProtoDecl; }
358768f26ee5892cd63ff0335a15d71a2385ba7c5eaSteve Naroff  void setForwardDecl(bool val) { isForwardProtoDecl = val; }
359980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
360423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
361423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'protocol
362423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
363423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
364423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
365423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
366423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
367423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
368aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcProtocol; }
369980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcProtocolDecl *D) { return true; }
370980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
371980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
37206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcClassDecl - Specifies a list of forward class declarations. For example:
37306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
37406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// @class NSCursor, NSImage, NSPasteboard, NSWindow;
3750c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
376ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanianclass ObjcClassDecl : public Decl {
3777e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcInterfaceDecl **ForwardDecls;
3787e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  unsigned NumForwardDecls;
37906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
3807e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts)
381ab0aeb0bf3eb289013e9f37e75c3dfc4c618f53cFariborz Jahanian    : Decl(ObjcClass, L) {
38206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
38306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff      ForwardDecls = new ObjcInterfaceDecl*[nElts];
3847e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*));
3857e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    } else {
3867e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner      ForwardDecls = 0;
38706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    }
38806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    NumForwardDecls = nElts;
38906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
3907e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner  void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) {
3917e620729fcb5a0042107f999dcf524f7357ce819Chris Lattner    assert(idx < NumForwardDecls && "index out of range");
39206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    ForwardDecls[idx] = OID;
39306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
3947e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  ObjcInterfaceDecl** getForwardDecls() const { return ForwardDecls; }
3957e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff  int getNumForwardDecls() const { return NumForwardDecls; }
3967e15891fc89256fc013bd1003676ad3197b85c25Steve Naroff
397aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcClass; }
39806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcClassDecl *D) { return true; }
39906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff};
40006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff
40106ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// ObjcForwardProtocolDecl - Specifies a list of forward protocol declarations.
40206ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff/// For example:
40306ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff///
4040c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
4050c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4066d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcForwardProtocolDecl : public Decl {
4079fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl **ReferencedProtocols;
4089fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned NumReferencedProtocols;
40906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroffpublic:
410b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner  ObjcForwardProtocolDecl(SourceLocation L,
411b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner                          ObjcProtocolDecl **Elts, unsigned nElts)
4126d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian  : Decl(ObjcForwardProtocol, L) {
413b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner    NumReferencedProtocols = nElts;
41406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    if (nElts) {
4157ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ReferencedProtocols = new ObjcProtocolDecl*[nElts];
416b97de3eddf0a0f7ff97204e7def6b7e0aa8953f2Chris Lattner      memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjcProtocolDecl*));
4179fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    } else {
4189fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner      ReferencedProtocols = 0;
419980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    }
42006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
4219fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  void setForwardProtocolDecl(unsigned idx, ObjcProtocolDecl *OID) {
4229fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
4237ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
42406ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
4259fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
4269fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  unsigned getNumForwardDecls() const { return NumReferencedProtocols; }
4279fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
4289fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) {
4299fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
4309fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
4319fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
4329fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  const ObjcProtocolDecl *getForwardProtocolDecl(unsigned idx) const {
4339fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    assert(idx < NumReferencedProtocols && "index out of range");
4349fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner    return ReferencedProtocols[idx];
4359fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner  }
4369fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattner
43706ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const Decl *D) {
43806ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff    return D->getKind() == ObjcForwardProtocol;
43906ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  }
44006ae8d68ef258ccd40c9cd1ce762eaae6f3d4432Steve Naroff  static bool classof(const ObjcForwardProtocolDecl *D) { return true; }
441980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
442980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
4430c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcCategoryDecl - Represents a category declaration. A category allows
4440c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add methods to an existing class (without subclassing or modifying
4450c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the original class interface or implementation:-). Categories don't allow
4460c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// you to add instance data. The following example adds "myMethod" to all
4470c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// NSView's within a process:
4480c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4490c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @interface NSView (MyViewMethods)
4500c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - myMethod;
4510c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
4520c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4530c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Cateogries also allow you to split the implementation of a class across
4540c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// several files (a feature more naturally supported in C++).
4550c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
4560c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Categories were originally inspired by dynamic languages such as Common
4570c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Lisp and Smalltalk. More traditional class-based languages (C++, Java)
4580c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// don't support this level of dynamism, which is both powerful and dangerous.
4590c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
460fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattnerclass ObjcCategoryDecl : public NamedDecl {
461980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Interface belonging to this category
462980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *ClassInterface;
463980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
464980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// referenced protocols in this category
4657ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **ReferencedProtocols;  // Null if none
4667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumReferencedProtocols;  // -1 if none
467980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
468980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category instance methods
4697ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
4707ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
471980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
472980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// category class methods
4737ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
4747ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
475980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
476980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Next category belonging to this class
477980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *NextClassCategory;
478ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
479423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation EndLoc; // marks the '>' or identifier.
480423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation AtEndLoc; // marks the end of the entire interface.
481980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroffpublic:
482fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner  ObjcCategoryDecl(SourceLocation L, unsigned numRefProtocol,IdentifierInfo *Id)
483fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner    : NamedDecl(ObjcCategory, L, Id),
484fd5de471478a507dd2495c4ea9bcab801ea5fa65Chris Lattner      ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(-1),
4857ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
4867ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1),
487e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner      NextClassCategory(0) {
488980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        if (numRefProtocol) {
4897ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          ReferencedProtocols = new ObjcProtocolDecl*[numRefProtocol];
4907ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          memset(ReferencedProtocols, '\0',
491980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                 numRefProtocol*sizeof(ObjcProtocolDecl*));
4927ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian          NumReferencedProtocols = numRefProtocol;
493980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff        }
494980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      }
495980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
496980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
497980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setClassInterface(ObjcInterfaceDecl *IDecl) { ClassInterface = IDecl; }
498980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
499980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void setCatReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
5007ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    assert((idx < NumReferencedProtocols) && "index out of range");
5017ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    ReferencedProtocols[idx] = OID;
502980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
503980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
5047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcProtocolDecl **getReferencedProtocols() const {
5057ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    return ReferencedProtocols;
5068f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  }
5077ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumReferencedProtocols() const { return NumReferencedProtocols; }
5088f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5097ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; }
5107ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
5118f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5127ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
5137ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
5148f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
51560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
51660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
51760fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
518980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
519980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcCategoryDecl *getNextClassCategory() const { return NextClassCategory; }
520980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void insertNextClassCategory() {
5213d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    NextClassCategory = ClassInterface->getCategoryList();
5223d58138992b9bc7b34aaa680f3ddf3971292eb7dSteve Naroff    ClassInterface->setCategoryList(this);
523980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
524423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // Location information, modeled after the Stmt API.
525423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
526423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getLocEnd() const { return EndLoc; }
527423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  void setLocEnd(SourceLocation LE) { EndLoc = LE; };
528423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff
529423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  // We also need to record the @end location.
530423cb565abc681b770fb4b9b4bc24d398c98157bSteve Naroff  SourceLocation getAtEndLoc() const { return AtEndLoc; }
531ca3adf7e8cac8c9fbaf592b1e5c2be6f082de7baFariborz Jahanian
532aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategory; }
533980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcCategoryDecl *D) { return true; }
534980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
5350c6b6243d3efd958c17943130e2a773653511edcSteve Naroff
5368f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// ObjcCategoryImplDecl - An object of this class encapsulates a category
5378f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian/// @implementation declaration.
5386a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattnerclass ObjcCategoryImplDecl : public NamedDecl {
5398f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// Class interface for this category implementation
5408f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
5418f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5428f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// category instance methods being implemented
5437ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods; // Null if category is not implementing any
5447ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;           // -1 if category is not implementing any
5458f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5468f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  /// category class methods being implemented
5477ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods; // Null if category is not implementing any
5487ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if category is not implementing any
5498f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5508f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  public:
5518f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    ObjcCategoryImplDecl(SourceLocation L, IdentifierInfo *Id,
5526a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattner                         ObjcInterfaceDecl *classInterface)
5536a0e89eece63e238ce873810f6f9bb50822e0296Chris Lattner    : NamedDecl(ObjcCategoryImpl, L, Id),
5548f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    ClassInterface(classInterface),
5557ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian    InstanceMethods(0), NumInstanceMethods(-1),
556e5ab7f31054e87ee812830480a828a762cd9eb73Chris Lattner    ClassMethods(0), NumClassMethods(-1) {}
5578f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5588f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    ObjcInterfaceDecl *getClassInterface() const {
5598f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian      return ClassInterface;
5608f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian    }
5618f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5627ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; }
5637ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
5648f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5657ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
5667ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
5678f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
56860fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
56960fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
57060fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
5718f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
572aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner  static bool classof(const Decl *D) { return D->getKind() == ObjcCategoryImpl;}
5738f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian  static bool classof(const ObjcCategoryImplDecl *D) { return true; }
5748f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian};
5758f3fde00ad4d4f943321e338b914ae4740711c84Fariborz Jahanian
5760c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// ObjcImplementationDecl - Represents a class definition - this is where
5770c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// method definitions are specified. For example:
5780c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5790c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @implementation MyClass
5800c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// - (void)myMethod { /* do something */ }
5810c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// @end
5820c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5830c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// Typically, instance variables are specified in the class interface,
5840c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// *not* in the implemenentation. Nevertheless (for legacy reasons), we
5850c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// allow instance variables to be specified in the implementation. When
5860c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// specified, they need to be *identical* to the interface. Now that we
5870c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// have support for non-fragile ivars in ObjC 2.0, we can consider removing
5880c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// the legacy semantics and allow developers to move private ivar declarations
5890c6b6243d3efd958c17943130e2a773653511edcSteve Naroff/// from the class interface to the class implementation (but I digress:-)
5900c6b6243d3efd958c17943130e2a773653511edcSteve Naroff///
5916d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanianclass ObjcImplementationDecl : public NamedDecl {
592f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  /// Class interface for this category implementation
593f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *ClassInterface;
594f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
595980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Implementation Class's super class.
596980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcInterfaceDecl *SuperClass;
597980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
598980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
599980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcIvarDecl **Ivars;   // Null if not specified
600980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  int NumIvars;   // -1 if not defined.
601980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
602980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented instance methods
6037ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **InstanceMethods;  // Null if not defined
6047ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumInstanceMethods;  // -1 if not defined
605980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
606980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  /// implemented class methods
6077ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **ClassMethods;  // Null if not defined
6087ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int NumClassMethods;  // -1 if not defined
609980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
6109fa5e65d08aee1875c5f2a841c8b0b4069bd00e5Chris Lattnerpublic:
611980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  ObjcImplementationDecl(SourceLocation L, IdentifierInfo *Id,
612f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *classInterface,
613f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian                         ObjcInterfaceDecl *superDecl)
6146d4caf26945095cc21dd7c79d2442668ed3a61b6Fariborz Jahanian    : NamedDecl(ObjcImplementation, L, Id),
615f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian      ClassInterface(classInterface),
616980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      SuperClass(superDecl),
617980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff      Ivars(0), NumIvars(-1),
6187ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      InstanceMethods(0), NumInstanceMethods(-1),
6197ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian      ClassMethods(0), NumClassMethods(-1) {}
620980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
621980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  void ObjcAddInstanceVariablesToClassImpl(ObjcIvarDecl **ivars,
622980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff                                           unsigned numIvars);
623980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
62460fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
62560fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
62660fcceeedbfc8b4a99cb942e2bc5aeb9e2f92a1fSteve Naroff                  SourceLocation AtEndLoc);
627980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
628f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
62993efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
630980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
63193efc029bf485de724fd783ad14b58aaec9c919bFariborz Jahanian  void setSuperClass(ObjcInterfaceDecl * superCls)
632980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff         { SuperClass = superCls; }
633980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
6347ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; }
6357ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumInstanceMethods() const { return NumInstanceMethods; }
636980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
6377ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
6387ed9e0f97f4645edc5d4670385b985ea4c617ce7Fariborz Jahanian  int getNumClassMethods() const { return NumClassMethods; }
639f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian
640f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  ObjcIvarDecl **getImplDeclIVars() const { return Ivars; }
641f4d331dd922f92478ebf30e808c0ca97ce49418bFariborz Jahanian  int getImplDeclNumIvars() const { return NumIvars; }
642980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
643980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const Decl *D) {
644980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff    return D->getKind() == ObjcImplementation;
645980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  }
646980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff  static bool classof(const ObjcImplementationDecl *D) { return true; }
647980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff};
648243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
649243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// ObjcCompatibleAliasDecl - Represents alias of a class. This alias is
650243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian/// declared as @compatibility_alias alias class.
651243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianclass ObjcCompatibleAliasDecl : public ScopedDecl {
652243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  /// Class that this is an alias of.
653243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *AliasedClass;
654243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
655243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanianpublic:
656243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id,
657243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian                         ObjcInterfaceDecl* aliasedClass)
658243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  : ScopedDecl(CompatibleAlias, L, Id, 0),
659243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  AliasedClass(aliasedClass) {}
660243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
661243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  ObjcInterfaceDecl *getClassInterface() const { return AliasedClass; }
662980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
663243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const Decl *D) {
664243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian    return D->getKind() == CompatibleAlias;
665243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  }
666243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian  static bool classof(const ObjcCompatibleAliasDecl *D) { return true; }
667243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian
668243b64b0001172405ff803c61bdcaa8e98ec1552Fariborz Jahanian};
669980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff
670980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff}  // end namespace clang
671980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#endif
672