DeclarationName.h revision d5a423b279e787e9fdd8309fe52cb515388c54ea
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" 19d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor#include "clang/Basic/PartialDiagnostic.h" 202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace llvm { 222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor template <typename T> struct DenseMapInfo; 232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang { 26011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class CXXSpecialName; 27011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class CXXOperatorIdName; 28011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class DeclarationNameExtra; 292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor class IdentifierInfo; 30011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class MultiKeywordSelector; 312a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor class UsingDirectiveDecl; 322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// DeclarationName - The name of a declaration. In the common case, 342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this just stores an IdentifierInfo pointer to a normal 352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// name. However, it also provides encodings for Objective-C 362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// selectors (optimizing zero- and one-argument selectors, which make 372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// up 78% percent of all selectors in Cocoa.h) and special C++ names 382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// for constructors, destructors, and conversion functions. 392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass DeclarationName { 402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// NameKind - The kind of name this object contains. 422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor enum NameKind { 432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Identifier, 442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCZeroArgSelector, 452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCOneArgSelector, 462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCMultiArgSelector, 472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXConstructorName, 482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXDestructorName, 49e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXConversionFunctionName, 502a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor CXXOperatorName, 512a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor CXXUsingDirective 522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor }; 532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorprivate: 552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// StoredNameKind - The kind of name that is actually stored in the 562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// upper bits of the Ptr field. This is only used internally. 572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor enum StoredNameKind { 582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredIdentifier = 0, 592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredObjCZeroArgSelector, 602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredObjCOneArgSelector, 61e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor StoredDeclarationNameExtra, 622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor PtrMask = 0x03 632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor }; 642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Ptr - The lowest two bits are used to express what kind of name 662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// we're actually storing, using the values of NameKind. Depending 672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// on the kind of name this is, the upper bits of Ptr may have one 682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// of several different meanings: 692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 70e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredIdentifier - The name is a normal identifier, and Ptr is 71e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// a normal IdentifierInfo pointer. 722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 73e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredObjCZeroArgSelector - The name is an Objective-C 74e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// selector with zero arguments, and Ptr is an IdentifierInfo 75e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// pointer pointing to the selector name. 762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 77e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredObjCOneArgSelector - The name is an Objective-C selector 78e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// with one argument, and Ptr is an IdentifierInfo pointer 79e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// pointing to the selector name. 802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 81e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredDeclarationNameExtra - Ptr is actually a pointer to a 82e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// DeclarationNameExtra structure, whose first value will tell us 83e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// whether this is an Objective-C selector, C++ operator-id name, 84e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// or special C++ name. 852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor uintptr_t Ptr; 862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getStoredNameKind - Return the kind of object that is stored in 882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Ptr. 892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredNameKind getStoredNameKind() const { 902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return static_cast<StoredNameKind>(Ptr & PtrMask); 912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getExtra - Get the "extra" information associated with this 942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// multi-argument selector or C++ special name. 952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra *getExtra() const { 96e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert(getStoredNameKind() == StoredDeclarationNameExtra && 972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Declaration name does not store an Extra structure"); 982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<DeclarationNameExtra *>(Ptr & ~PtrMask); 992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsCXXSpecialName - If the stored pointer is actually a 1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// CXXSpecialName, returns a pointer to it. Otherwise, returns 1032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// a NULL pointer. 1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialName *getAsCXXSpecialName() const { 1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (getNameKind() >= CXXConstructorName && 1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor getNameKind() <= CXXConversionFunctionName) 1072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<CXXSpecialName *>(Ptr & ~PtrMask); 108ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 111e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getAsCXXOperatorIdName 112e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorIdName *getAsCXXOperatorIdName() const { 113e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getNameKind() == CXXOperatorName) 114e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return reinterpret_cast<CXXOperatorIdName *>(Ptr & ~PtrMask); 115ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 116e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 117e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from the name of a C++ constructor, 1192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // destructor, or conversion function. 1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName(CXXSpecialName *Name) 1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Ptr(reinterpret_cast<uintptr_t>(Name)) { 1222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXSpecialName"); 123e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 124e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 125e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 126e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Construct a declaration name from the name of a C++ overloaded 127e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // operator. 1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName(CXXOperatorIdName *Name) 1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Ptr(reinterpret_cast<uintptr_t>(Name)) { 130e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXOperatorId"); 131e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 1322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Construct a declaration name from a raw pointer. 1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName(uintptr_t Ptr) : Ptr(Ptr) { } 1362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend class DeclarationNameTable; 1382a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor friend class NamedDecl; 1392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// getFETokenInfoAsVoid - Retrieves the front end-specified pointer 1412def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// for this name as a void pointer. 1422def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void *getFETokenInfoAsVoid() const; 1432def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 1442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 1452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// DeclarationName - Used to create an empty selector. 1462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName() : Ptr(0) { } 1472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from an IdentifierInfo *. 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName(const IdentifierInfo *II) 1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Ptr(reinterpret_cast<uintptr_t>(II)) { 1512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 1522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from an Objective-C selector. 1552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName(Selector Sel); 1562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1576ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor /// getUsingDirectiveName - Return name for all using-directives. 1586ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor static DeclarationName getUsingDirectiveName(); 1596ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor 1602def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor // operator bool() - Evaluates true when this declaration name is 1612def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor // non-empty. 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump operator bool() const { 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return ((Ptr & PtrMask) != 0) || 1642def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor (reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask)); 1652def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 1662def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 16791058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner /// Predicate functions for querying what type of name this is. 16891058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isIdentifier() const { return getStoredNameKind() == StoredIdentifier; } 16991058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isObjCZeroArgSelector() const { 17091058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner return getStoredNameKind() == StoredObjCZeroArgSelector; 17191058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner } 17291058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isObjCOneArgSelector() const { 17391058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner return getStoredNameKind() == StoredObjCOneArgSelector; 17491058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner } 1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getNameKind - Determine what kind of name this is. 1772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor NameKind getNameKind() const; 1781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 18010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor /// getName - Retrieve the human-readable string for this name. 18110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string getAsString() const; 18210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 1832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsIdentifierInfo - Retrieve the IdentifierInfo * stored in 1842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// this declaration name, or NULL if this declaration name isn't a 1852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// simple identifier. 1861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump IdentifierInfo *getAsIdentifierInfo() const { 18791058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner if (isIdentifier()) 1882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<IdentifierInfo *>(Ptr); 189ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 1902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsOpaqueInteger - Get the representation of this declaration 1932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// name as an opaque integer. 1942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor uintptr_t getAsOpaqueInteger() const { return Ptr; } 1952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 19644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// getAsOpaquePtr - Get the representation of this declaration name as 19744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// an opaque pointer. 19844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor void *getAsOpaquePtr() const { return reinterpret_cast<void*>(Ptr); } 19944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 200011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner static DeclarationName getFromOpaqueInteger(uintptr_t P) { 201011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DeclarationName N; 202011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner N.Ptr = P; 203011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner return N; 204011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner } 2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXNameType - If this name is one of the C++ names (of a 2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// constructor, destructor, or conversion function), return the 2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// type associated with that name. 2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType getCXXNameType() const; 2102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 211e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getCXXOverloadedOperator - If this name is the name of an 212e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// overloadable operator in C++ (e.g., @c operator+), retrieve the 213e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// kind of overloaded operator. 214e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor OverloadedOperatorKind getCXXOverloadedOperator() const; 215e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getObjCSelector - Get the Objective-C selector stored in this 2172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// declaration name. 2182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Selector getObjCSelector() const; 2192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2202def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// getFETokenInfo/setFETokenInfo - The language front-end is 2212def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// allowed to associate arbitrary metadata with some kinds of 2222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// declaration names, including normal identifiers and C++ 2232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// constructors, destructors, and conversion functions. 2242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor template<typename T> 2252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor T *getFETokenInfo() const { return static_cast<T*>(getFETokenInfoAsVoid()); } 2262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void setFETokenInfo(void *T); 2282def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// operator== - Determine whether the specified names are identical.. 2302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend bool operator==(DeclarationName LHS, DeclarationName RHS) { 2312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS.Ptr == RHS.Ptr; 2322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// operator!= - Determine whether the specified names are different. 2352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend bool operator!=(DeclarationName LHS, DeclarationName RHS) { 2362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS.Ptr != RHS.Ptr; 2372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static DeclarationName getEmptyMarker() { 2402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(uintptr_t(-1)); 2412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static DeclarationName getTombstoneMarker() { 2442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(uintptr_t(-2)); 2452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 2472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS); 2512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator>(DeclarationName LHS, DeclarationName RHS) { 2552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return RHS < LHS; 2562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator<=(DeclarationName LHS, DeclarationName RHS) { 2612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return !(RHS < LHS); 2622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator>=(DeclarationName LHS, DeclarationName RHS) { 2672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return !(LHS < RHS); 2682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// DeclarationNameTable - Used to store and retrieve DeclarationName 2712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// instances for the various kinds of declaration names, e.g., normal 2722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// identifiers, C++ constructor names, etc. This class contains 2732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// uniqued versions of each of the C++ special names, which can be 2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// retrieved using its member functions (e.g., 2752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// getCXXConstructorName). 2762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass DeclarationNameTable { 2772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void *CXXSpecialNamesImpl; // Actually a FoldingSet<CXXSpecialName> * 278e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorIdName *CXXOperatorNames; // Operator names 2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable(const DeclarationNameTable&); // NONCOPYABLE 2812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable& operator=(const DeclarationNameTable&); // NONCOPYABLE 2822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable(); 2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ~DeclarationNameTable(); 2862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getIdentifier - Create a declaration name that is a simple 2882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// identifier. 2892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName getIdentifier(IdentifierInfo *ID) { 2902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(ID); 2912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXConstructorName - Returns the name of a C++ constructor 2942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// for the given Type. 29550d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXConstructorName(CanQualType Ty) { 2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXConstructorName, Ty); 2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXDestructorName - Returns the name of a C++ destructor 3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// for the given Type. 30150d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXDestructorName(CanQualType Ty) { 3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXDestructorName, Ty); 3032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXConversionFunctionName - Returns the name of a C++ 3062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// conversion function for the given Type. 30750d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXConversionFunctionName(CanQualType Ty) { 3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXConversionFunctionName, Ty); 3092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXSpecialName - Returns a declaration name for special kind 3122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// of C++ name, e.g., for a constructor, destructor, or conversion 3132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// function. 3141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName getCXXSpecialName(DeclarationName::NameKind Kind, 31550d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor CanQualType Ty); 316e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 317e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getCXXOperatorName - Get the name of the overloadable C++ 318e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// operator corresponding to Op. 319e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor DeclarationName getCXXOperatorName(OverloadedOperatorKind Op); 3201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 3212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 322011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner/// Insertion operator for diagnostics. This allows sending DeclarationName's 323011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner/// into a diagnostic with <<. 324011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattnerinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 325011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DeclarationName N) { 326011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DB.AddTaggedVal(N.getAsOpaqueInteger(), 327011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner Diagnostic::ak_declarationname); 328011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner return DB; 329011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner} 3301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor/// Insertion operator for partial diagnostics. This allows binding 332d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor/// DeclarationName's into a partial diagnostic with <<. 333d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregorinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, 334d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor DeclarationName N) { 335d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor PD.AddTaggedVal(N.getAsOpaqueInteger(), 336d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor Diagnostic::ak_declarationname); 337d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor return PD; 338d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor} 339d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor 3402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang 3412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace llvm { 3432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Define DenseMapInfo so that DeclarationNames can be used as keys 3442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// in DenseMap and DenseSets. 3452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregortemplate<> 3462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorstruct DenseMapInfo<clang::DeclarationName> { 3472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline clang::DeclarationName getEmptyKey() { 3482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return clang::DeclarationName::getEmptyMarker(); 3492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline clang::DeclarationName getTombstoneKey() { 3522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return clang::DeclarationName::getTombstoneMarker(); 3532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static unsigned getHashValue(clang::DeclarationName); 3562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static inline bool 3582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor isEqual(clang::DeclarationName LHS, clang::DeclarationName RHS) { 3592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS == RHS; 3602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline bool isPod() { return true; } 3632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 3642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace llvm 3662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#endif 368