DeclBase.h revision 69c8f0aab655257e9e532d9d53756acf4f7a2d78
10ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//===-- DeclBase.h - Base Classes for representing declarations *- C++ -*-===//
20ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
30ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//                     The LLVM Compiler Infrastructure
40ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
50ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner// This file is distributed under the University of Illinois Open Source
60ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner// License. See LICENSE.TXT for details.
70ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
80ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//===----------------------------------------------------------------------===//
90ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
10b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner//  This file defines the Decl and DeclContext interfaces.
110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//===----------------------------------------------------------------------===//
130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#ifndef LLVM_CLANG_AST_DECLBASE_H
150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#define LLVM_CLANG_AST_DECLBASE_H
160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#include "clang/AST/Attr.h"
180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#include "clang/AST/Type.h"
190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#include "clang/Basic/SourceLocation.h"
200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnernamespace clang {
22ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidisclass TranslationUnitDecl;
232d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidisclass NamespaceDecl;
24d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass ScopedDecl;
250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass FunctionDecl;
26d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass CXXRecordDecl;
27b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass EnumDecl;
28d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass ObjCMethodDecl;
290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass ObjCInterfaceDecl;
300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// Decl - This represents one declaration (or definition), e.g. a variable,
320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// typedef, function, struct, etc.
330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
340ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass Decl {
350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic:
360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum Kind {
370ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // This lists the concrete classes of Decl in order of the inheritance
380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // hierarchy.  This allows us to do efficient classof tests based on the
390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // enums below.   The commented out names are abstract class names.
40d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    // [DeclContext] indicatea that the class also inherits from DeclContext.
410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
420ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // Decl
43d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis         TranslationUnit,  // [DeclContext]
440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //   NamedDecl
450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           Field,
46d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis             CXXField,
470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner             ObjCIvar,
480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCCategory,
490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCCategoryImpl,
500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCImplementation,
510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCProtocol,
52670aa9d7639278f507930e95dc89c12032ab7c7eSam Bishop           ObjCProperty,
530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //     ScopedDecl
54d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis             Namespace,  // [DeclContext]
550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //       TypeDecl
560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner               Typedef,
570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //         TagDecl
58d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                 Enum,  // [DeclContext]
590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //           RecordDecl
600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                   Struct,
610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                   Union,
620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                   Class,
63d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    //             CXXRecordDecl  [DeclContext]
64d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                     CXXStruct,
65d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                     CXXUnion,
66d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                     CXXClass,
670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //       ValueDecl
680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner               EnumConstant,
69d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis               Function,  // [DeclContext]
70d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                 CXXMethod,
71248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff               Var,
724111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner                 ImplicitParam,
73d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                 CXXClassVar,
740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                 ParmVar,
75d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis         ObjCInterface,  // [DeclContext]
760ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         ObjCCompatibleAlias,
77d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis         ObjCMethod,  // [DeclContext]
780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         ObjCClass,
790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         ObjCForwardProtocol,
8061d46159af2a740207de8dc024211d531ae290d9Fariborz Jahanian         ObjCPropertyImpl,
810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         LinkageSpec,
820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner   FileScopeAsm,
830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // For each non-leaf class, we now define a mapping to the first/last member
850ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // of the class, to allow efficient classof.
86d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    NamedFirst     = Field        , NamedLast     = ParmVar,
87d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    FieldFirst     = Field        , FieldLast     = ObjCIvar,
88d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    ScopedFirst    = Namespace    , ScopedLast    = ParmVar,
89d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    TypeFirst      = Typedef      , TypeLast      = CXXClass,
90d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    TagFirst       = Enum         , TagLast       = CXXClass,
91d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    RecordFirst    = Struct       , RecordLast    = CXXClass,
92d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    CXXRecordFirst = CXXStruct    , CXXRecordLast = CXXClass,
93d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    ValueFirst     = EnumConstant , ValueLast     = ParmVar,
94d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    FunctionFirst  = Function     , FunctionLast  = CXXMethod,
95d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    VarFirst       = Var          , VarLast       = ParmVar
960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
970ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
980ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// IdentifierNamespace - According to C99 6.2.3, there are four namespaces,
992ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor  /// labels, tags, members and ordinary identifiers. These are meant
1002ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor  /// as bitmasks, so that searches in C++ can look into the "tag" namespace
1012ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor  /// during ordinary lookup.
1020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum IdentifierNamespace {
1032ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    IDNS_Label = 0x1,
1042ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    IDNS_Tag = 0x2,
1052ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    IDNS_Member = 0x4,
1062ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    IDNS_Ordinary = 0x8
1070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
1080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// ObjCDeclQualifier - Qualifier used on types in method declarations
1100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// for remote messaging. They are meant for the arguments though and
1110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// applied to the Decls (ObjCMethodDecl and ParmVarDecl).
1120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum ObjCDeclQualifier {
1130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_None = 0x0,
1140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_In = 0x1,
1150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Inout = 0x2,
1160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Out = 0x4,
1170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Bycopy = 0x8,
1180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Byref = 0x10,
1190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Oneway = 0x20
1200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
1210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprivate:
1230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Loc - The location that this decl.
1240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  SourceLocation Loc;
1250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// DeclKind - This indicates which class this is.
1270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Kind DeclKind   :  8;
1280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// InvalidDecl - This indicates a semantic error occurred.
1300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  unsigned int InvalidDecl :  1;
1310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// HasAttrs - This indicates whether the decl has attributes or not.
1330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  unsigned int HasAttrs : 1;
134d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis
135d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis protected:
136d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  /// Access - Used by C++ decls for the access specifier.
137d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  // NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum
138d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  unsigned Access : 2;
139d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  friend class CXXClassMemberWrapper;
140d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis
1410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Decl(Kind DK, SourceLocation L) : Loc(L), DeclKind(DK), InvalidDecl(0),
1420ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    HasAttrs(false) {
1430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    if (Decl::CollectingStats()) addDeclKind(DK);
1440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
1451bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop
1460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  virtual ~Decl();
1471bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop
1481bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishoppublic:
1490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  SourceLocation getLocation() const { return Loc; }
1500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void setLocation(SourceLocation L) { Loc = L; }
1510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Kind getKind() const { return DeclKind; }
1530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  const char *getDeclKindName() const;
1540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void addAttr(Attr *attr);
1560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  const Attr *getAttrs() const;
157a212c56e9b7533bcc2d6be90efd52ad241bf894eChris Lattner  void swapAttrs(Decl *D);
1589141bee299a05349924a34a7153d7064c9e0a107Nuno Lopes  void invalidateAttrs();
1590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename T> const T *getAttr() const {
1610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    for (const Attr *attr = getAttrs(); attr; attr = attr->getNext())
1620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      if (const T *V = dyn_cast<T>(attr))
1630ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return V;
1640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    return 0;
1660ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
1670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// setInvalidDecl - Indicates the Decl had a semantic error. This
1690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// allows for graceful error recovery.
1700ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void setInvalidDecl() { InvalidDecl = 1; }
1710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  bool isInvalidDecl() const { return (bool) InvalidDecl; }
1720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1730ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  IdentifierNamespace getIdentifierNamespace() const {
1740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (DeclKind) {
1750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    default: assert(0 && "Unknown decl kind!");
1764111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner    case ImplicitParam:
1770ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Typedef:
1780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Function:
179248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff    case Var:
1800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ParmVar:
1810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case EnumConstant:
1820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ObjCInterface:
1830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ObjCCompatibleAlias:
184d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    case CXXField:
1851ce6eadf80453d132d378ee031f3fbf5259a7d2aArgyrios Kyrtzidis    case CXXMethod:
18609c31b0d78fc4e7f1d1828d01d9977cc3e242ea3Argyrios Kyrtzidis    case CXXClassVar:
1870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      return IDNS_Ordinary;
1880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Struct:
1890ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Union:
1900ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Class:
191d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    case CXXStruct:
192d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    case CXXUnion:
193d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    case CXXClass:
1940ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Enum:
1950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      return IDNS_Tag;
1962d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis    case Namespace:
1972d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis      return IdentifierNamespace(IDNS_Tag | IDNS_Ordinary);
1980ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
1990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
200792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek
20169c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek  // getBody - If this Decl represents a declaration for a body of code,
202792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek  //  such as a function or method definition, this method returns the top-level
20369c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek  //  Stmt* of that body.  Otherwise this method returns null.
20469c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek  virtual Stmt* getBody() const { return 0; }
205792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek
2060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // global temp stats (until we have a per-module visitor)
2070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static void addDeclKind(Kind k);
2080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool CollectingStats(bool Enable = false);
2090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static void PrintStats();
2100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Implement isa/cast/dyncast/etc.
2120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const Decl *) { return true; }
2130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Emit - Serialize this Decl to Bitcode.
2150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void Emit(llvm::Serializer& S) const;
2160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Create - Deserialize a Decl from Bitcode.
218e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop  static Decl* Create(llvm::Deserializer& D, ASTContext& C);
2190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
220bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop  /// Destroy - Call destructors and release memory.
22127f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek  virtual void Destroy(ASTContext& C);
222bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop
2230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected:
2240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// EmitImpl - Provides the subclass-specific serialization logic for
2250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  ///   serializing out a decl.
2260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  virtual void EmitImpl(llvm::Serializer& S) const {
2270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // FIXME: This will eventually be a pure virtual function.
2280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    assert (false && "Not implemented.");
2290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
2300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void EmitInRec(llvm::Serializer& S) const;
232e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop  void ReadInRec(llvm::Deserializer& D, ASTContext& C);
2330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
2340ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
235b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// DeclContext - This is used only as base class of specific decl types that
2360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// can act as declaration contexts. These decls are:
2370ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
238ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis///   TranslationUnitDecl
2392d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis///   NamespaceDecl
2400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///   FunctionDecl
241d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis///   CXXRecordDecl
242b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner///   EnumDecl
243d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis///   ObjCMethodDecl
2440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///   ObjCInterfaceDecl
2450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
246b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass DeclContext {
2470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// DeclKind - This indicates which class this is.
2480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Decl::Kind DeclKind   :  8;
2490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2507643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  /// DeclChain - Linked list of declarations that are defined inside this
2517643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  /// declaration context.
2527643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  ScopedDecl *DeclChain;
2537643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis
2540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Used in the CastTo template to get the DeclKind
255b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  // from a Decl or a DeclContext. DeclContext doesn't have a getKind() method
2560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // to avoid 'ambiguous access' compiler errors.
2570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename T> struct KindTrait {
2580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    static Decl::Kind getKind(const T *D) { return D->getKind(); }
2590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
2600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Used only by the ToDecl and FromDecl methods
2620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename To, typename From>
2630ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static To *CastTo(const From *D) {
2640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    Decl::Kind DK = KindTrait<From>::getKind(D);
2650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch(DK) {
266ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis      case Decl::TranslationUnit:
267ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis        return static_cast<TranslationUnitDecl*>(const_cast<From*>(D));
2682d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis      case Decl::Namespace:
2692d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis        return static_cast<NamespaceDecl*>(const_cast<From*>(D));
270d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis      case Decl::Enum:
271d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis        return static_cast<EnumDecl*>(const_cast<From*>(D));
2720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
2730ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return static_cast<ObjCMethodDecl*>(const_cast<From*>(D));
2740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCInterface:
2750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return static_cast<ObjCInterfaceDecl*>(const_cast<From*>(D));
2760ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
277d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis        if (DK >= Decl::FunctionFirst && DK <= Decl::FunctionLast)
278d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis          return static_cast<FunctionDecl*>(const_cast<From*>(D));
279d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis        if (DK >= Decl::CXXRecordFirst && DK <= Decl::CXXRecordLast)
280d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis          return static_cast<CXXRecordDecl*>(const_cast<From*>(D));
281d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis
282b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner        assert(false && "a decl that inherits DeclContext isn't handled");
2830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return 0;
2840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
2850ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
2860ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected:
2887643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  DeclContext(Decl::Kind K) : DeclKind(K), DeclChain(0) {}
2890ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2900ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic:
291b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  /// getParent - Returns the containing DeclContext if this is a ScopedDecl,
2920ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// else returns NULL.
293b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  DeclContext *getParent() const;
2940ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  bool isFunctionOrMethod() const {
2960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (DeclKind) {
2970ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::Function:
298d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis      case Decl::CXXMethod:
2990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
3000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return true;
3010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
3020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return false;
3030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
3040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3067643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  ScopedDecl *getDeclChain() const { return DeclChain; }
3077643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  void setDeclChain(ScopedDecl *D) { DeclChain = D; }
3087643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis
309b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  /// ToDecl and FromDecl make Decl <-> DeclContext castings.
3100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// They are intended to be used by the simplify_type and cast_convert_val
3110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// templates.
312b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static Decl        *ToDecl   (const DeclContext *D);
313b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static DeclContext *FromDecl (const Decl *D);
3140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const Decl *D) {
3160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (D->getKind()) {
317ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis      case Decl::TranslationUnit:
3182d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis      case Decl::Namespace:
319d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis      case Decl::Enum:
3200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
3210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCInterface:
3220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return true;
3230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
324d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis        if (D->getKind() >= Decl::FunctionFirst &&
325d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis            D->getKind() <= Decl::FunctionLast)
326d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis          return true;
327d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis        if (D->getKind() >= Decl::CXXRecordFirst &&
328d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis            D->getKind() <= Decl::CXXRecordLast)
329d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis          return true;
330b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner        return false;
3310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
3320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
333b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static bool classof(const DeclContext *D) { return true; }
334ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis  static bool classof(const TranslationUnitDecl *D) { return true; }
3352d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis  static bool classof(const NamespaceDecl *D) { return true; }
3360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const FunctionDecl *D) { return true; }
337d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  static bool classof(const CXXRecordDecl *D) { return true; }
338b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static bool classof(const EnumDecl *D) { return true; }
339d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  static bool classof(const ObjCMethodDecl *D) { return true; }
3400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const ObjCInterfaceDecl *D) { return true; }
3417643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis
3427643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidisprivate:
3437643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  void EmitOutRec(llvm::Serializer& S) const;
3447643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  void ReadOutRec(llvm::Deserializer& D, ASTContext& C);
3457643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis
3467643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  friend class Decl;
3470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
349b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct DeclContext::KindTrait<DeclContext> {
350b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static Decl::Kind getKind(const DeclContext *D) { return D->DeclKind; }
3510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner} // end clang.
3540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnernamespace llvm {
356b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// Implement simplify_type for DeclContext, so that we can dyn_cast from
357b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// DeclContext to a specific Decl class.
358b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  template<> struct simplify_type<const ::clang::DeclContext*> {
3590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  typedef ::clang::Decl* SimpleType;
360b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static SimpleType getSimplifiedValue(const ::clang::DeclContext *Val) {
361b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    return ::clang::DeclContext::ToDecl(Val);
3620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3630ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
364b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct simplify_type< ::clang::DeclContext*>
365b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  : public simplify_type<const ::clang::DeclContext*> {};
3660ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
367b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct simplify_type<const ::clang::DeclContext> {
3680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  typedef ::clang::Decl SimpleType;
369b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static SimpleType &getSimplifiedValue(const ::clang::DeclContext &Val) {
370b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    return *::clang::DeclContext::ToDecl(&Val);
3710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
373b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct simplify_type< ::clang::DeclContext>
374b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  : public simplify_type<const ::clang::DeclContext> {};
3750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
376b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// Implement cast_convert_val for DeclContext, so that we can dyn_cast from
377b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// a Decl class to DeclContext.
3780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
379b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerstruct cast_convert_val< ::clang::DeclContext,const FromTy,const FromTy> {
380b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static ::clang::DeclContext &doit(const FromTy &Val) {
381b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    return *::clang::DeclContext::FromDecl(&Val);
3820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
385b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerstruct cast_convert_val< ::clang::DeclContext,FromTy,FromTy>
386b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  : public cast_convert_val< ::clang::DeclContext,const FromTy,const FromTy>
3870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    {};
3880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3890ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
390b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerstruct cast_convert_val< ::clang::DeclContext,const FromTy*,const FromTy*> {
391b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static ::clang::DeclContext *doit(const FromTy *Val) {
392b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    return ::clang::DeclContext::FromDecl(Val);
3930ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3940ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
396b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerstruct cast_convert_val< ::clang::DeclContext,FromTy*,FromTy*>
397b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  : public cast_convert_val< ::clang::DeclContext,const FromTy*,const FromTy*>
3980ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    {};
3990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
4000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner} // end namespace llvm
4010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
4020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#endif
403