DeclarationName.h revision 50d62d1b4a98adbc83de8f8cd1379ea1c25656f7
12e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===-- DeclarationName.h - Representation of declaration names -*- C++ -*-===// 22e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 32e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// The LLVM Compiler Infrastructure 42e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 52e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// This file is distributed under the University of Illinois Open Source 62e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// License. See LICENSE.TXT for details. 72e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 82e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===// 92e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// This file declares the DeclarationName and DeclarationNameTable classes. 112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===// 132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#ifndef LLVM_CLANG_AST_DECLARATIONNAME_H 142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#define LLVM_CLANG_AST_DECLARATIONNAME_H 152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/Basic/IdentifierTable.h" 172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/AST/Type.h" 1850d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor#include "clang/AST/CanonicalType.h" 192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace llvm { 212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor template <typename T> struct DenseMapInfo; 222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang { 25011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class CXXSpecialName; 26011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class CXXOperatorIdName; 27011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class DeclarationNameExtra; 282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor class IdentifierInfo; 29011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class MultiKeywordSelector; 302a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor class UsingDirectiveDecl; 312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// DeclarationName - The name of a declaration. In the common case, 332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this just stores an IdentifierInfo pointer to a normal 342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// name. However, it also provides encodings for Objective-C 352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// selectors (optimizing zero- and one-argument selectors, which make 362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// up 78% percent of all selectors in Cocoa.h) and special C++ names 372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// for constructors, destructors, and conversion functions. 382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass DeclarationName { 392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// NameKind - The kind of name this object contains. 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor enum NameKind { 422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Identifier, 432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCZeroArgSelector, 442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCOneArgSelector, 452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCMultiArgSelector, 462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXConstructorName, 472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXDestructorName, 48e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXConversionFunctionName, 492a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor CXXOperatorName, 502a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor CXXUsingDirective 512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor }; 522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorprivate: 542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// StoredNameKind - The kind of name that is actually stored in the 552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// upper bits of the Ptr field. This is only used internally. 562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor enum StoredNameKind { 572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredIdentifier = 0, 582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredObjCZeroArgSelector, 592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredObjCOneArgSelector, 60e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor StoredDeclarationNameExtra, 612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor PtrMask = 0x03 622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor }; 632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Ptr - The lowest two bits are used to express what kind of name 652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// we're actually storing, using the values of NameKind. Depending 662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// on the kind of name this is, the upper bits of Ptr may have one 672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// of several different meanings: 682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 69e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredIdentifier - The name is a normal identifier, and Ptr is 70e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// a normal IdentifierInfo pointer. 712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 72e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredObjCZeroArgSelector - The name is an Objective-C 73e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// selector with zero arguments, and Ptr is an IdentifierInfo 74e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// pointer pointing to the selector name. 752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 76e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredObjCOneArgSelector - The name is an Objective-C selector 77e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// with one argument, and Ptr is an IdentifierInfo pointer 78e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// pointing to the selector name. 792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 80e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredDeclarationNameExtra - Ptr is actually a pointer to a 81e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// DeclarationNameExtra structure, whose first value will tell us 82e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// whether this is an Objective-C selector, C++ operator-id name, 83e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// or special C++ name. 842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor uintptr_t Ptr; 852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getStoredNameKind - Return the kind of object that is stored in 872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Ptr. 882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredNameKind getStoredNameKind() const { 892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return static_cast<StoredNameKind>(Ptr & PtrMask); 902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getExtra - Get the "extra" information associated with this 932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// multi-argument selector or C++ special name. 942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra *getExtra() const { 95e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert(getStoredNameKind() == StoredDeclarationNameExtra && 962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Declaration name does not store an Extra structure"); 972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<DeclarationNameExtra *>(Ptr & ~PtrMask); 982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsCXXSpecialName - If the stored pointer is actually a 1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// CXXSpecialName, returns a pointer to it. Otherwise, returns 1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// a NULL pointer. 1032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialName *getAsCXXSpecialName() const { 1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (getNameKind() >= CXXConstructorName && 1052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor getNameKind() <= CXXConversionFunctionName) 1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<CXXSpecialName *>(Ptr & ~PtrMask); 107ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 110e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getAsCXXOperatorIdName 111e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorIdName *getAsCXXOperatorIdName() const { 112e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getNameKind() == CXXOperatorName) 113e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return reinterpret_cast<CXXOperatorIdName *>(Ptr & ~PtrMask); 114ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 115e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 116e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from the name of a C++ constructor, 1182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // destructor, or conversion function. 1192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName(CXXSpecialName *Name) 1202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor : Ptr(reinterpret_cast<uintptr_t>(Name)) { 1212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXSpecialName"); 122e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 123e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 124e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 125e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Construct a declaration name from the name of a C++ overloaded 126e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // operator. 127e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor DeclarationName(CXXOperatorIdName *Name) 128e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor : Ptr(reinterpret_cast<uintptr_t>(Name)) { 129e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXOperatorId"); 130e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 1312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Construct a declaration name from a raw pointer. 1342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName(uintptr_t Ptr) : Ptr(Ptr) { } 1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend class DeclarationNameTable; 1372a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor friend class NamedDecl; 1382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// getFETokenInfoAsVoid - Retrieves the front end-specified pointer 1402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// for this name as a void pointer. 1412def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void *getFETokenInfoAsVoid() const; 1422def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 1432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 1442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// DeclarationName - Used to create an empty selector. 1452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName() : Ptr(0) { } 1462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from an IdentifierInfo *. 148d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor DeclarationName(const IdentifierInfo *II) 149d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor : Ptr(reinterpret_cast<uintptr_t>(II)) { 1502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 1512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from an Objective-C selector. 1542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName(Selector Sel); 1552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1566ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor /// getUsingDirectiveName - Return name for all using-directives. 1576ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor static DeclarationName getUsingDirectiveName(); 1586ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor 1592def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor // operator bool() - Evaluates true when this declaration name is 1602def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor // non-empty. 1612def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor operator bool() const { 1622def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return ((Ptr & PtrMask) != 0) || 1632def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor (reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask)); 1642def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 1652def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 16691058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner /// Predicate functions for querying what type of name this is. 16791058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isIdentifier() const { return getStoredNameKind() == StoredIdentifier; } 16891058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isObjCZeroArgSelector() const { 16991058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner return getStoredNameKind() == StoredObjCZeroArgSelector; 17091058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner } 17191058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isObjCOneArgSelector() const { 17291058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner return getStoredNameKind() == StoredObjCOneArgSelector; 17391058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner } 17491058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner 1752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getNameKind - Determine what kind of name this is. 1762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor NameKind getNameKind() const; 17791058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner 1782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 17910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor /// getName - Retrieve the human-readable string for this name. 18010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string getAsString() const; 18110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 1822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsIdentifierInfo - Retrieve the IdentifierInfo * stored in 1832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// this declaration name, or NULL if this declaration name isn't a 1842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// simple identifier. 1852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor IdentifierInfo *getAsIdentifierInfo() const { 18691058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner if (isIdentifier()) 1872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<IdentifierInfo *>(Ptr); 188ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 1892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsOpaqueInteger - Get the representation of this declaration 1922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// name as an opaque integer. 1932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor uintptr_t getAsOpaqueInteger() const { return Ptr; } 1942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 19544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// getAsOpaquePtr - Get the representation of this declaration name as 19644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// an opaque pointer. 19744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor void *getAsOpaquePtr() const { return reinterpret_cast<void*>(Ptr); } 19844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 199011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner static DeclarationName getFromOpaqueInteger(uintptr_t P) { 200011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DeclarationName N; 201011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner N.Ptr = P; 202011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner return N; 203011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner } 204011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner 2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXNameType - If this name is one of the C++ names (of a 2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// constructor, destructor, or conversion function), return the 2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// type associated with that name. 2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType getCXXNameType() const; 2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 210e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getCXXOverloadedOperator - If this name is the name of an 211e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// overloadable operator in C++ (e.g., @c operator+), retrieve the 212e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// kind of overloaded operator. 213e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor OverloadedOperatorKind getCXXOverloadedOperator() const; 214e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getObjCSelector - Get the Objective-C selector stored in this 2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// declaration name. 2172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Selector getObjCSelector() const; 2182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2192def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// getFETokenInfo/setFETokenInfo - The language front-end is 2202def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// allowed to associate arbitrary metadata with some kinds of 2212def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// declaration names, including normal identifiers and C++ 2222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// constructors, destructors, and conversion functions. 2232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor template<typename T> 2242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor T *getFETokenInfo() const { return static_cast<T*>(getFETokenInfoAsVoid()); } 2252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void setFETokenInfo(void *T); 2272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// operator== - Determine whether the specified names are identical.. 2292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend bool operator==(DeclarationName LHS, DeclarationName RHS) { 2302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS.Ptr == RHS.Ptr; 2312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// operator!= - Determine whether the specified names are different. 2342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend bool operator!=(DeclarationName LHS, DeclarationName RHS) { 2352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS.Ptr != RHS.Ptr; 2362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static DeclarationName getEmptyMarker() { 2392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(uintptr_t(-1)); 2402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static DeclarationName getTombstoneMarker() { 2432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(uintptr_t(-2)); 2442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 2462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS); 2502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator>(DeclarationName LHS, DeclarationName RHS) { 2542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return RHS < LHS; 2552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator<=(DeclarationName LHS, DeclarationName RHS) { 2602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return !(RHS < LHS); 2612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator>=(DeclarationName LHS, DeclarationName RHS) { 2662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return !(LHS < RHS); 2672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// DeclarationNameTable - Used to store and retrieve DeclarationName 2702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// instances for the various kinds of declaration names, e.g., normal 2712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// identifiers, C++ constructor names, etc. This class contains 2722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// uniqued versions of each of the C++ special names, which can be 2732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// retrieved using its member functions (e.g., 2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// getCXXConstructorName). 2752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass DeclarationNameTable { 2762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void *CXXSpecialNamesImpl; // Actually a FoldingSet<CXXSpecialName> * 277e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorIdName *CXXOperatorNames; // Operator names 2782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable(const DeclarationNameTable&); // NONCOPYABLE 2802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable& operator=(const DeclarationNameTable&); // NONCOPYABLE 2812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 2832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable(); 2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ~DeclarationNameTable(); 2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getIdentifier - Create a declaration name that is a simple 2872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// identifier. 2882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName getIdentifier(IdentifierInfo *ID) { 2892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(ID); 2902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXConstructorName - Returns the name of a C++ constructor 2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// for the given Type. 29450d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXConstructorName(CanQualType Ty) { 2952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXConstructorName, Ty); 2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXDestructorName - Returns the name of a C++ destructor 2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// for the given Type. 30050d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXDestructorName(CanQualType Ty) { 3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXDestructorName, Ty); 3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXConversionFunctionName - Returns the name of a C++ 3052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// conversion function for the given Type. 30650d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXConversionFunctionName(CanQualType Ty) { 3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXConversionFunctionName, Ty); 3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXSpecialName - Returns a declaration name for special kind 3112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// of C++ name, e.g., for a constructor, destructor, or conversion 3122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// function. 3132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName getCXXSpecialName(DeclarationName::NameKind Kind, 31450d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor CanQualType Ty); 315e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 316e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getCXXOperatorName - Get the name of the overloadable C++ 317e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// operator corresponding to Op. 318e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor DeclarationName getCXXOperatorName(OverloadedOperatorKind Op); 3192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 3202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 321011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner/// Insertion operator for diagnostics. This allows sending DeclarationName's 322011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner/// into a diagnostic with <<. 323011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattnerinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 324011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DeclarationName N) { 325011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DB.AddTaggedVal(N.getAsOpaqueInteger(), 326011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner Diagnostic::ak_declarationname); 327011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner return DB; 328011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner} 329011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner 330011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner 3312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang 3322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace llvm { 3342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Define DenseMapInfo so that DeclarationNames can be used as keys 3352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// in DenseMap and DenseSets. 3362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregortemplate<> 3372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorstruct DenseMapInfo<clang::DeclarationName> { 3382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline clang::DeclarationName getEmptyKey() { 3392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return clang::DeclarationName::getEmptyMarker(); 3402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline clang::DeclarationName getTombstoneKey() { 3432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return clang::DeclarationName::getTombstoneMarker(); 3442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static unsigned getHashValue(clang::DeclarationName); 3472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline bool 3492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor isEqual(clang::DeclarationName LHS, clang::DeclarationName RHS) { 3502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS == RHS; 3512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline bool isPod() { return true; } 3542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 3552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace llvm 3572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#endif 359