DeclBase.h revision bb45c512e0dfbe96bfe377ac642e726c0ba0affa
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 {
220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass FunctionDecl;
230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass ObjCMethodDecl;
24b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass EnumDecl;
250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass ObjCInterfaceDecl;
260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// Decl - This represents one declaration (or definition), e.g. a variable,
280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// typedef, function, struct, etc.
290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass Decl {
310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic:
320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum Kind {
330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // This lists the concrete classes of Decl in order of the inheritance
340ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // hierarchy.  This allows us to do efficient classof tests based on the
350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // enums below.   The commented out names are abstract class names.
360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
370ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // Decl
380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //   NamedDecl
390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           Field,
400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner             ObjCIvar,
410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCCategory,
420ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCCategoryImpl,
430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCImplementation,
440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCProtocol,
45670aa9d7639278f507930e95dc89c12032ab7c7eSam Bishop           ObjCProperty,
460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //     ScopedDecl
470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //       TypeDecl
480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner               Typedef,
490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //         TagDecl
500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                 Enum,
510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //           RecordDecl
520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                   Struct,
530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                   Union,
540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                   Class,
550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //       ValueDecl
560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner               EnumConstant,
570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner               Function,
580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //         VarDecl
590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                 BlockVar,
600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                 FileVar,
610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                 ParmVar,
620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         ObjCInterface,
630ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         ObjCCompatibleAlias,
640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         ObjCMethod,
650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         ObjCClass,
660ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         ObjCForwardProtocol,
670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         LinkageSpec,
680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner   FileScopeAsm,
690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
700ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // For each non-leaf class, we now define a mapping to the first/last member
710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // of the class, to allow efficient classof.
720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    NamedFirst  = Field,         NamedLast  = ParmVar,
730ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    FieldFirst  = Field,         FieldLast  = ObjCIvar,
740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    ScopedFirst = Typedef,       ScopedLast = ParmVar,
750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    TypeFirst   = Typedef,       TypeLast   = Class,
760ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    TagFirst    = Enum         , TagLast    = Class,
770ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    RecordFirst = Struct       , RecordLast = Class,
780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    ValueFirst  = EnumConstant , ValueLast  = ParmVar,
790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    VarFirst    = BlockVar     , VarLast    = ParmVar
800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// IdentifierNamespace - According to C99 6.2.3, there are four namespaces,
830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// labels, tags, members and ordinary identifiers.
840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum IdentifierNamespace {
850ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    IDNS_Label,
860ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    IDNS_Tag,
870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    IDNS_Member,
880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    IDNS_Ordinary
890ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
900ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
910ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// ObjCDeclQualifier - Qualifier used on types in method declarations
920ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// for remote messaging. They are meant for the arguments though and
930ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// applied to the Decls (ObjCMethodDecl and ParmVarDecl).
940ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum ObjCDeclQualifier {
950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_None = 0x0,
960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_In = 0x1,
970ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Inout = 0x2,
980ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Out = 0x4,
990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Bycopy = 0x8,
1000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Byref = 0x10,
1010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Oneway = 0x20
1020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
1030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprivate:
1050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Loc - The location that this decl.
1060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  SourceLocation Loc;
1070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// DeclKind - This indicates which class this is.
1090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Kind DeclKind   :  8;
1100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// InvalidDecl - This indicates a semantic error occurred.
1120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  unsigned int InvalidDecl :  1;
1130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// HasAttrs - This indicates whether the decl has attributes or not.
1150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  unsigned int HasAttrs : 1;
1160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected:
1170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Decl(Kind DK, SourceLocation L) : Loc(L), DeclKind(DK), InvalidDecl(0),
1180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    HasAttrs(false) {
1190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    if (Decl::CollectingStats()) addDeclKind(DK);
1200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
1210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic:
1230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // TODO: This should probably be made protected once derived classes have
1240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // destructors.
1250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  virtual ~Decl();
1260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  SourceLocation getLocation() const { return Loc; }
1280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void setLocation(SourceLocation L) { Loc = L; }
1290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Kind getKind() const { return DeclKind; }
1310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  const char *getDeclKindName() const;
1320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void addAttr(Attr *attr);
1340ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  const Attr *getAttrs() const;
1350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename T> const T *getAttr() const {
1370ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    for (const Attr *attr = getAttrs(); attr; attr = attr->getNext())
1380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      if (const T *V = dyn_cast<T>(attr))
1390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return V;
1400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    return 0;
1420ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
1430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// setInvalidDecl - Indicates the Decl had a semantic error. This
1450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// allows for graceful error recovery.
1460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void setInvalidDecl() { InvalidDecl = 1; }
1470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  bool isInvalidDecl() const { return (bool) InvalidDecl; }
1480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  IdentifierNamespace getIdentifierNamespace() const {
1500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (DeclKind) {
1510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    default: assert(0 && "Unknown decl kind!");
1520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Typedef:
1530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Function:
1540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case BlockVar:
1550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case FileVar:
1560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ParmVar:
1570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case EnumConstant:
1580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ObjCInterface:
1590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ObjCCompatibleAlias:
1600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      return IDNS_Ordinary;
1610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Struct:
1620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Union:
1630ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Class:
1640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Enum:
1650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      return IDNS_Tag;
1660ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
1670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
1680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // global temp stats (until we have a per-module visitor)
1690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static void addDeclKind(Kind k);
1700ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool CollectingStats(bool Enable = false);
1710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static void PrintStats();
1720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1730ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Implement isa/cast/dyncast/etc.
1740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const Decl *) { return true; }
1750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1760ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Emit - Serialize this Decl to Bitcode.
1770ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void Emit(llvm::Serializer& S) const;
1780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Create - Deserialize a Decl from Bitcode.
180e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop  static Decl* Create(llvm::Deserializer& D, ASTContext& C);
1810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
182bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop  /// Destroy - Call destructors and release memory.
183bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop  void Destroy(ASTContext& C) const;
184bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop
1850ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected:
1860ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// EmitImpl - Provides the subclass-specific serialization logic for
1870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  ///   serializing out a decl.
1880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  virtual void EmitImpl(llvm::Serializer& S) const {
1890ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // FIXME: This will eventually be a pure virtual function.
1900ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    assert (false && "Not implemented.");
1910ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
1920ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1930ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void EmitInRec(llvm::Serializer& S) const;
194e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop  void ReadInRec(llvm::Deserializer& D, ASTContext& C);
1950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
1960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
197b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// DeclContext - This is used only as base class of specific decl types that
1980ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// can act as declaration contexts. These decls are:
1990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
2000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///   FunctionDecl
2010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///   ObjCMethodDecl
202b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner///   EnumDecl
2030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///   ObjCInterfaceDecl
2040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
205b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass DeclContext {
2060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// DeclKind - This indicates which class this is.
2070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Decl::Kind DeclKind   :  8;
2080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Used in the CastTo template to get the DeclKind
210b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  // from a Decl or a DeclContext. DeclContext doesn't have a getKind() method
2110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // to avoid 'ambiguous access' compiler errors.
2120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename T> struct KindTrait {
2130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    static Decl::Kind getKind(const T *D) { return D->getKind(); }
2140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
2150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Used only by the ToDecl and FromDecl methods
2170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename To, typename From>
2180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static To *CastTo(const From *D) {
2190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    Decl::Kind DK = KindTrait<From>::getKind(D);
2200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch(DK) {
2210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::Function:
2220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return static_cast<FunctionDecl*>(const_cast<From*>(D));
2230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
2240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return static_cast<ObjCMethodDecl*>(const_cast<From*>(D));
2250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCInterface:
2260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return static_cast<ObjCInterfaceDecl*>(const_cast<From*>(D));
227b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner      case Decl::Enum:
228b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner        return static_cast<EnumDecl*>(const_cast<From*>(D));
2290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
230b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner        assert(false && "a decl that inherits DeclContext isn't handled");
2310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return 0;
2320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
2330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
2340ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected:
236b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  DeclContext(Decl::Kind K) : DeclKind(K) {}
2370ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic:
239b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  /// getParent - Returns the containing DeclContext if this is a ScopedDecl,
2400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// else returns NULL.
241b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  DeclContext *getParent() const;
2420ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  bool isFunctionOrMethod() const {
2440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (DeclKind) {
2450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::Function:
2460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
2470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return true;
2480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
2490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return false;
2500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
2510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
2520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
253b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  /// ToDecl and FromDecl make Decl <-> DeclContext castings.
2540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// They are intended to be used by the simplify_type and cast_convert_val
2550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// templates.
256b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static Decl        *ToDecl   (const DeclContext *D);
257b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static DeclContext *FromDecl (const Decl *D);
2580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const Decl *D) {
2600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (D->getKind()) {
2610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::Function:
2620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
2630ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCInterface:
264b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner      case Decl::Enum:
2650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return true;
2660ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
267b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner        return false;
2680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
2690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
270b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static bool classof(const DeclContext *D) { return true; }
2710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const FunctionDecl *D) { return true; }
2720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const ObjCMethodDecl *D) { return true; }
273b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static bool classof(const EnumDecl *D) { return true; }
2740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const ObjCInterfaceDecl *D) { return true; }
2750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
2760ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
277b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct DeclContext::KindTrait<DeclContext> {
278b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static Decl::Kind getKind(const DeclContext *D) { return D->DeclKind; }
2790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
2800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner} // end clang.
2820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnernamespace llvm {
284b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// Implement simplify_type for DeclContext, so that we can dyn_cast from
285b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// DeclContext to a specific Decl class.
286b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  template<> struct simplify_type<const ::clang::DeclContext*> {
2870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  typedef ::clang::Decl* SimpleType;
288b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static SimpleType getSimplifiedValue(const ::clang::DeclContext *Val) {
289b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    return ::clang::DeclContext::ToDecl(Val);
2900ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
2910ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
292b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct simplify_type< ::clang::DeclContext*>
293b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  : public simplify_type<const ::clang::DeclContext*> {};
2940ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
295b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct simplify_type<const ::clang::DeclContext> {
2960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  typedef ::clang::Decl SimpleType;
297b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static SimpleType &getSimplifiedValue(const ::clang::DeclContext &Val) {
298b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    return *::clang::DeclContext::ToDecl(&Val);
2990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
301b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct simplify_type< ::clang::DeclContext>
302b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  : public simplify_type<const ::clang::DeclContext> {};
3030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
304b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// Implement cast_convert_val for DeclContext, so that we can dyn_cast from
305b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// a Decl class to DeclContext.
3060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
307b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerstruct cast_convert_val< ::clang::DeclContext,const FromTy,const FromTy> {
308b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static ::clang::DeclContext &doit(const FromTy &Val) {
309b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    return *::clang::DeclContext::FromDecl(&Val);
3100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
313b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerstruct cast_convert_val< ::clang::DeclContext,FromTy,FromTy>
314b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  : public cast_convert_val< ::clang::DeclContext,const FromTy,const FromTy>
3150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    {};
3160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
318b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerstruct cast_convert_val< ::clang::DeclContext,const FromTy*,const FromTy*> {
319b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static ::clang::DeclContext *doit(const FromTy *Val) {
320b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner    return ::clang::DeclContext::FromDecl(Val);
3210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
324b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerstruct cast_convert_val< ::clang::DeclContext,FromTy*,FromTy*>
325b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  : public cast_convert_val< ::clang::DeclContext,const FromTy*,const FromTy*>
3260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    {};
3270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner} // end namespace llvm
3290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#endif
331