DeclBase.h revision 35bc0821c4f80041724cd4c5c4889b2581546a41
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 { 2242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisclass DeclContext; 23ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidisclass TranslationUnitDecl; 242d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidisclass NamespaceDecl; 25d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass ScopedDecl; 260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass FunctionDecl; 27d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass CXXRecordDecl; 28b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass EnumDecl; 29d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass ObjCMethodDecl; 300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass ObjCInterfaceDecl; 3156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffclass BlockDecl; 320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// Decl - This represents one declaration (or definition), e.g. a variable, 340ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// typedef, function, struct, etc. 350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// 360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass Decl { 370ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic: 380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner enum Kind { 390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // This lists the concrete classes of Decl in order of the inheritance 400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // hierarchy. This allows us to do efficient classof tests based on the 410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // enums below. The commented out names are abstract class names. 42a34ea072371154c9042ce86321d17fbb4df1f84dTed Kremenek // [DeclContext] indicates that the class also inherits from DeclContext. 430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // Decl 45d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis TranslationUnit, // [DeclContext] 460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // NamedDecl 470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Field, 48d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis CXXField, 490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCIvar, 5001e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek ObjCAtDefsField, 510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCCategory, 520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCCategoryImpl, 530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCImplementation, 540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ObjCProtocol, 55670aa9d7639278f507930e95dc89c12032ab7c7eSam Bishop ObjCProperty, 560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // ScopedDecl 57d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis Namespace, // [DeclContext] 580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // TypeDecl 590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Typedef, 600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // TagDecl 61d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis Enum, // [DeclContext] 6235bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis Record, 6335bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis CXXRecord, // [DeclContext] 640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // ValueDecl 650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner EnumConstant, 66d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis Function, // [DeclContext] 67d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis CXXMethod, 68248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff Var, 694111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner ImplicitParam, 70d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis CXXClassVar, 710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner ParmVar, 72226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar ObjCInterface, // [DeclContext] 73226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar ObjCCompatibleAlias, 74226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar ObjCMethod, // [DeclContext] 75226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar ObjCClass, 76226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar ObjCForwardProtocol, 77226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar ObjCPropertyImpl, 780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner LinkageSpec, 79226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar FileScopeAsm, 8056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Block, // [DeclContext] 810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // For each non-leaf class, we now define a mapping to the first/last member 830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // of the class, to allow efficient classof. 84d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis NamedFirst = Field , NamedLast = ParmVar, 8501e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek FieldFirst = Field , FieldLast = ObjCAtDefsField, 86d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis ScopedFirst = Namespace , ScopedLast = ParmVar, 8735bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis TypeFirst = Typedef , TypeLast = CXXRecord, 8835bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis TagFirst = Enum , TagLast = CXXRecord, 8935bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis RecordFirst = Record , RecordLast = CXXRecord, 90d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis ValueFirst = EnumConstant , ValueLast = ParmVar, 91d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis FunctionFirst = Function , FunctionLast = CXXMethod, 92d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis VarFirst = Var , VarLast = ParmVar 930ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner }; 940ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// IdentifierNamespace - According to C99 6.2.3, there are four namespaces, 962ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor /// labels, tags, members and ordinary identifiers. These are meant 972ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor /// as bitmasks, so that searches in C++ can look into the "tag" namespace 982ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor /// during ordinary lookup. 990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner enum IdentifierNamespace { 1002ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor IDNS_Label = 0x1, 1012ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor IDNS_Tag = 0x2, 1022ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor IDNS_Member = 0x4, 1032ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor IDNS_Ordinary = 0x8 1040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner }; 1050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// ObjCDeclQualifier - Qualifier used on types in method declarations 1070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// for remote messaging. They are meant for the arguments though and 1080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// applied to the Decls (ObjCMethodDecl and ParmVarDecl). 1090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner enum ObjCDeclQualifier { 1100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_None = 0x0, 1110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_In = 0x1, 1120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Inout = 0x2, 1130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Out = 0x4, 1140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Bycopy = 0x8, 1150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Byref = 0x10, 1160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner OBJC_TQ_Oneway = 0x20 1170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner }; 1180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprivate: 1200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// Loc - The location that this decl. 1210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation Loc; 1220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// DeclKind - This indicates which class this is. 1240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Kind DeclKind : 8; 1250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// InvalidDecl - This indicates a semantic error occurred. 1270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner unsigned int InvalidDecl : 1; 1280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// HasAttrs - This indicates whether the decl has attributes or not. 1300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner unsigned int HasAttrs : 1; 131d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis 132d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis protected: 133d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis /// Access - Used by C++ decls for the access specifier. 134d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis // NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum 135d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis unsigned Access : 2; 136d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis friend class CXXClassMemberWrapper; 137d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis 1380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Decl(Kind DK, SourceLocation L) : Loc(L), DeclKind(DK), InvalidDecl(0), 1390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner HasAttrs(false) { 1400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner if (Decl::CollectingStats()) addDeclKind(DK); 1410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 1421bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop 1430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner virtual ~Decl(); 1441bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop 1451bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishoppublic: 1460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation getLocation() const { return Loc; } 1470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner void setLocation(SourceLocation L) { Loc = L; } 1480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Kind getKind() const { return DeclKind; } 1500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner const char *getDeclKindName() const; 1510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner void addAttr(Attr *attr); 1530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner const Attr *getAttrs() const; 154a212c56e9b7533bcc2d6be90efd52ad241bf894eChris Lattner void swapAttrs(Decl *D); 1559141bee299a05349924a34a7153d7064c9e0a107Nuno Lopes void invalidateAttrs(); 1560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner template<typename T> const T *getAttr() const { 1580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner for (const Attr *attr = getAttrs(); attr; attr = attr->getNext()) 1590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner if (const T *V = dyn_cast<T>(attr)) 1600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return V; 1610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return 0; 1630ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 1640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// setInvalidDecl - Indicates the Decl had a semantic error. This 1660ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// allows for graceful error recovery. 1670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner void setInvalidDecl() { InvalidDecl = 1; } 1680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner bool isInvalidDecl() const { return (bool) InvalidDecl; } 1690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 1700ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner IdentifierNamespace getIdentifierNamespace() const { 1710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner switch (DeclKind) { 1720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner default: assert(0 && "Unknown decl kind!"); 1734111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner case ImplicitParam: 1740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case Typedef: 1750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case Function: 176248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff case Var: 1770ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case ParmVar: 1780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case EnumConstant: 1790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case ObjCInterface: 1800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case ObjCCompatibleAlias: 181d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis case CXXField: 1821ce6eadf80453d132d378ee031f3fbf5259a7d2aArgyrios Kyrtzidis case CXXMethod: 18309c31b0d78fc4e7f1d1828d01d9977cc3e242ea3Argyrios Kyrtzidis case CXXClassVar: 1840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return IDNS_Ordinary; 18535bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis case Record: 18635bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis case CXXRecord: 1870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case Enum: 1880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return IDNS_Tag; 1892d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis case Namespace: 1902d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis return IdentifierNamespace(IDNS_Tag | IDNS_Ordinary); 1910ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 1920ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 193792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek 19469c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek // getBody - If this Decl represents a declaration for a body of code, 195792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek // such as a function or method definition, this method returns the top-level 19669c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek // Stmt* of that body. Otherwise this method returns null. 19769c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek virtual Stmt* getBody() const { return 0; } 198792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek 1990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // global temp stats (until we have a per-module visitor) 2000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static void addDeclKind(Kind k); 2010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static bool CollectingStats(bool Enable = false); 2020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static void PrintStats(); 2030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // Implement isa/cast/dyncast/etc. 2050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static bool classof(const Decl *) { return true; } 20642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis static DeclContext *castToDeclContext(const Decl *); 20742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis static Decl *castFromDeclContext(const DeclContext *); 2080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// Emit - Serialize this Decl to Bitcode. 2100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner void Emit(llvm::Serializer& S) const; 2110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// Create - Deserialize a Decl from Bitcode. 213e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop static Decl* Create(llvm::Deserializer& D, ASTContext& C); 2140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 215bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop /// Destroy - Call destructors and release memory. 21627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek virtual void Destroy(ASTContext& C); 217bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop 2180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected: 2190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// EmitImpl - Provides the subclass-specific serialization logic for 2200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// serializing out a decl. 2210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner virtual void EmitImpl(llvm::Serializer& S) const { 2220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // FIXME: This will eventually be a pure virtual function. 2230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner assert (false && "Not implemented."); 2240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 2250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner void EmitInRec(llvm::Serializer& S) const; 227e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop void ReadInRec(llvm::Deserializer& D, ASTContext& C); 2280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner}; 2290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 230b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// DeclContext - This is used only as base class of specific decl types that 2310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// can act as declaration contexts. These decls are: 2320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// 233ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis/// TranslationUnitDecl 2342d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis/// NamespaceDecl 2350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// FunctionDecl 236d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis/// CXXRecordDecl 237b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// EnumDecl 238d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis/// ObjCMethodDecl 2390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// ObjCInterfaceDecl 24056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff/// BlockDecl 2410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// 242b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass DeclContext { 2430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// DeclKind - This indicates which class this is. 2440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Decl::Kind DeclKind : 8; 2450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2467643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis /// DeclChain - Linked list of declarations that are defined inside this 2477643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis /// declaration context. 2487643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis ScopedDecl *DeclChain; 2497643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis 2500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // Used in the CastTo template to get the DeclKind 251b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner // from a Decl or a DeclContext. DeclContext doesn't have a getKind() method 2520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // to avoid 'ambiguous access' compiler errors. 2530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner template<typename T> struct KindTrait { 2540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static Decl::Kind getKind(const T *D) { return D->getKind(); } 2550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner }; 2560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner // Used only by the ToDecl and FromDecl methods 2580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner template<typename To, typename From> 2590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static To *CastTo(const From *D) { 2600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner Decl::Kind DK = KindTrait<From>::getKind(D); 2610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner switch(DK) { 262090276f5e164d491a1bb3f541bafdb394f5e6f04Steve Naroff case Decl::Block: 263090276f5e164d491a1bb3f541bafdb394f5e6f04Steve Naroff return static_cast<BlockDecl*>(const_cast<From*>(D)); 264ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis case Decl::TranslationUnit: 265ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis return static_cast<TranslationUnitDecl*>(const_cast<From*>(D)); 2662d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis case Decl::Namespace: 2672d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis return static_cast<NamespaceDecl*>(const_cast<From*>(D)); 268d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis case Decl::Enum: 269d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis return static_cast<EnumDecl*>(const_cast<From*>(D)); 27035bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis case Decl::CXXRecord: 27135bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis return static_cast<CXXRecordDecl*>(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 280b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner assert(false && "a decl that inherits DeclContext isn't handled"); 2810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return 0; 2820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 2830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 2840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2850ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected: 2867643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis DeclContext(Decl::Kind K) : DeclKind(K), DeclChain(0) {} 2870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic: 289b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner /// getParent - Returns the containing DeclContext if this is a ScopedDecl, 2900ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner /// else returns NULL. 291d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis DeclContext *getParent(); 292d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis const DeclContext *getParent() const { 293d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis return const_cast<DeclContext*>(this)->getParent(); 294d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis } 2950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 2960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner bool isFunctionOrMethod() const { 2970ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner switch (DeclKind) { 29856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff case Decl::Block: 2990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case Decl::Function: 300d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis case Decl::CXXMethod: 3010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case Decl::ObjCMethod: 3020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return true; 3030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner default: 3040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return false; 3050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 3060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 3070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 308e2ed203b437c14de57a80d69b70164819d045d86Argyrios Kyrtzidis const ScopedDecl *getDeclChain() const { return DeclChain; } 309e2ed203b437c14de57a80d69b70164819d045d86Argyrios Kyrtzidis ScopedDecl *getDeclChain() { return DeclChain; } 3107643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis void setDeclChain(ScopedDecl *D) { DeclChain = D; } 3117643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis 3120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static bool classof(const Decl *D) { 3130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner switch (D->getKind()) { 314ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis case Decl::TranslationUnit: 3152d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis case Decl::Namespace: 316d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis case Decl::Enum: 31735bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis case Decl::CXXRecord: 3180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case Decl::ObjCMethod: 3190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner case Decl::ObjCInterface: 32056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff case Decl::Block: 3210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return true; 3220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner default: 323d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis if (D->getKind() >= Decl::FunctionFirst && 324d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis D->getKind() <= Decl::FunctionLast) 325d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis return true; 326b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner return false; 3270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 3280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 329b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner static bool classof(const DeclContext *D) { return true; } 330ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis static bool classof(const TranslationUnitDecl *D) { return true; } 3312d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis static bool classof(const NamespaceDecl *D) { return true; } 3320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static bool classof(const FunctionDecl *D) { return true; } 333d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis static bool classof(const CXXRecordDecl *D) { return true; } 334b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner static bool classof(const EnumDecl *D) { return true; } 335d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis static bool classof(const ObjCMethodDecl *D) { return true; } 3360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner static bool classof(const ObjCInterfaceDecl *D) { return true; } 33756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff static bool classof(const BlockDecl *D) { return true; } 3387643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis 3397643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidisprivate: 3407643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis void EmitOutRec(llvm::Serializer& S) const; 3417643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis void ReadOutRec(llvm::Deserializer& D, ASTContext& C); 3427643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis 3437643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis friend class Decl; 3440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner}; 3450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 346b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct DeclContext::KindTrait<DeclContext> { 347b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner static Decl::Kind getKind(const DeclContext *D) { return D->DeclKind; } 3480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner}; 3490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 3500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner} // end clang. 3510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 3520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnernamespace llvm { 3530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 35442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis/// Implement a isa_impl_wrap specialization to check whether a DeclContext is 35542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis/// a specific Decl. 35642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy> 35742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct isa_impl_wrap<ToTy, 35842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis const ::clang::DeclContext,const ::clang::DeclContext> { 35942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis static bool doit(const ::clang::DeclContext &Val) { 36042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis return ToTy::classof(::clang::Decl::castFromDeclContext(&Val)); 3610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 3620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner}; 36342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy> 36442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct isa_impl_wrap<ToTy, ::clang::DeclContext, ::clang::DeclContext> 36542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis : public isa_impl_wrap<ToTy, 36642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis const ::clang::DeclContext,const ::clang::DeclContext> {}; 3670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 36842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis/// Implement cast_convert_val for Decl -> DeclContext conversions. 3690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy> 37042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val< ::clang::DeclContext, FromTy, FromTy> { 371b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner static ::clang::DeclContext &doit(const FromTy &Val) { 37242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis return *FromTy::castToDeclContext(&Val); 3730ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 3740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner}; 3750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 3760ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy> 37742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val< ::clang::DeclContext, FromTy*, FromTy*> { 378b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner static ::clang::DeclContext *doit(const FromTy *Val) { 37942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis return FromTy::castToDeclContext(Val); 3800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner } 3810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner}; 38242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 38342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis/// Implement cast_convert_val for DeclContext -> Decl conversions. 38442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy> 38542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val<ToTy, 38642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis const ::clang::DeclContext,const ::clang::DeclContext> { 38742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis static ToTy &doit(const ::clang::DeclContext &Val) { 38842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis return *reinterpret_cast<ToTy*>(ToTy::castFromDeclContext(&Val)); 38942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis } 39042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis}; 39142220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy> 39242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val<ToTy, ::clang::DeclContext, ::clang::DeclContext> 39342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis : public cast_convert_val<ToTy, 39442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis const ::clang::DeclContext,const ::clang::DeclContext> {}; 39542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 39642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy> 39742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val<ToTy, 39842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis const ::clang::DeclContext*, const ::clang::DeclContext*> { 39942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis static ToTy *doit(const ::clang::DeclContext *Val) { 40042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis return reinterpret_cast<ToTy*>(ToTy::castFromDeclContext(Val)); 40142220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis } 40242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis}; 40342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy> 40442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val<ToTy, ::clang::DeclContext*, ::clang::DeclContext*> 40542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis : public cast_convert_val<ToTy, 40642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis const ::clang::DeclContext*,const ::clang::DeclContext*> {}; 4070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 4080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner} // end namespace llvm 4090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner 4100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#endif 411