DeclBase.h revision 2ce52f3fb95bf544db6bd3d91a72bce7d9cceb6c
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, 832ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor /// labels, tags, members and ordinary identifiers. These are meant 842ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor /// as bitmasks, so that searches in C++ can look into the "tag" namespace 852ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor /// during ordinary lookup. 860ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner enum IdentifierNamespace { 872ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor IDNS_Label = 0x1, 882ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor IDNS_Tag = 0x2, 892ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor IDNS_Member = 0x4, 902ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor IDNS_Ordinary = 0x8 910ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner }; 920ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 930ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// ObjCDeclQualifier - Qualifier used on types in method declarations 940ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// for remote messaging. They are meant for the arguments though and 950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// applied to the Decls (ObjCMethodDecl and ParmVarDecl). 960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner enum ObjCDeclQualifier { 970ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_None = 0x0, 980ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_In = 0x1, 990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Inout = 0x2, 1000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Out = 0x4, 1010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Bycopy = 0x8, 1020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Byref = 0x10, 1030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Oneway = 0x20 1040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner }; 1050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprivate: 1070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// Loc - The location that this decl. 1080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation Loc; 1090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// DeclKind - This indicates which class this is. 1110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Kind DeclKind : 8; 1120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// InvalidDecl - This indicates a semantic error occurred. 1140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner unsigned int InvalidDecl : 1; 1150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// HasAttrs - This indicates whether the decl has attributes or not. 1170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner unsigned int HasAttrs : 1; 1180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected: 1190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Decl(Kind DK, SourceLocation L) : Loc(L), DeclKind(DK), InvalidDecl(0), 1200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner HasAttrs(false) { 1210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner if (Decl::CollectingStats()) addDeclKind(DK); 1220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 1231bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop 1240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner virtual ~Decl(); 1251bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop 1261bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishoppublic: 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