DeclarationName.h revision 3e518bda00d710754ca077cf9be8dd821e16a854
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; 283e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt class CXXLiteralOperatorIdName; 29011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class DeclarationNameExtra; 302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor class IdentifierInfo; 31011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner class MultiKeywordSelector; 322a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor class UsingDirectiveDecl; 332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// DeclarationName - The name of a declaration. In the common case, 352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this just stores an IdentifierInfo pointer to a normal 362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// name. However, it also provides encodings for Objective-C 372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// selectors (optimizing zero- and one-argument selectors, which make 382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// up 78% percent of all selectors in Cocoa.h) and special C++ names 392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// for constructors, destructors, and conversion functions. 402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass DeclarationName { 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// NameKind - The kind of name this object contains. 432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor enum NameKind { 442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Identifier, 452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCZeroArgSelector, 462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCOneArgSelector, 472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ObjCMultiArgSelector, 482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXConstructorName, 492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXDestructorName, 50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXConversionFunctionName, 512a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor CXXOperatorName, 523e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt CXXLiteralOperatorName, 532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor CXXUsingDirective 542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor }; 552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorprivate: 572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// StoredNameKind - The kind of name that is actually stored in the 582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// upper bits of the Ptr field. This is only used internally. 592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor enum StoredNameKind { 602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredIdentifier = 0, 612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredObjCZeroArgSelector, 622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredObjCOneArgSelector, 63e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor StoredDeclarationNameExtra, 642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor PtrMask = 0x03 652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor }; 662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Ptr - The lowest two bits are used to express what kind of name 682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// we're actually storing, using the values of NameKind. Depending 692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// on the kind of name this is, the upper bits of Ptr may have one 702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// of several different meanings: 712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 72e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredIdentifier - The name is a normal identifier, and Ptr is 73e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// a normal IdentifierInfo pointer. 742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 75e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredObjCZeroArgSelector - The name is an Objective-C 76e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// selector with zero arguments, and Ptr is an IdentifierInfo 77e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// pointer pointing to the selector name. 782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 79e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredObjCOneArgSelector - The name is an Objective-C selector 80e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// with one argument, and Ptr is an IdentifierInfo pointer 81e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// pointing to the selector name. 822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// 83e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// StoredDeclarationNameExtra - Ptr is actually a pointer to a 84e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// DeclarationNameExtra structure, whose first value will tell us 85e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// whether this is an Objective-C selector, C++ operator-id name, 86e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// or special C++ name. 872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor uintptr_t Ptr; 882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getStoredNameKind - Return the kind of object that is stored in 902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Ptr. 912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StoredNameKind getStoredNameKind() const { 922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return static_cast<StoredNameKind>(Ptr & PtrMask); 932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getExtra - Get the "extra" information associated with this 962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// multi-argument selector or C++ special name. 972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra *getExtra() const { 98e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert(getStoredNameKind() == StoredDeclarationNameExtra && 992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Declaration name does not store an Extra structure"); 1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<DeclarationNameExtra *>(Ptr & ~PtrMask); 1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsCXXSpecialName - If the stored pointer is actually a 1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// CXXSpecialName, returns a pointer to it. Otherwise, returns 1052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// a NULL pointer. 1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialName *getAsCXXSpecialName() const { 1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (getNameKind() >= CXXConstructorName && 1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor getNameKind() <= CXXConversionFunctionName) 1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<CXXSpecialName *>(Ptr & ~PtrMask); 110ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 113e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getAsCXXOperatorIdName 114e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorIdName *getAsCXXOperatorIdName() const { 115e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getNameKind() == CXXOperatorName) 116e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return reinterpret_cast<CXXOperatorIdName *>(Ptr & ~PtrMask); 117ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 118e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 119e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1203e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt CXXLiteralOperatorIdName *getAsCXXLiteralOperatorIdName() const { 1213e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt if (getNameKind() == CXXLiteralOperatorName) 1223e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return reinterpret_cast<CXXLiteralOperatorIdName *>(Ptr & ~PtrMask); 1233e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return 0; 1243e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt } 1253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 1262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from the name of a C++ constructor, 1272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // destructor, or conversion function. 1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName(CXXSpecialName *Name) 1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Ptr(reinterpret_cast<uintptr_t>(Name)) { 1302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXSpecialName"); 131e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 132e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 133e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 134e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Construct a declaration name from the name of a C++ overloaded 135e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // operator. 1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName(CXXOperatorIdName *Name) 1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Ptr(reinterpret_cast<uintptr_t>(Name)) { 138e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXOperatorId"); 139e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 1402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1423e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt DeclarationName(CXXLiteralOperatorIdName *Name) 1433e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt : Ptr(reinterpret_cast<uintptr_t>(Name)) { 1443e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXLiteralOperatorId"); 1453e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt Ptr |= StoredDeclarationNameExtra; 1463e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt } 1473e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 1482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// Construct a declaration name from a raw pointer. 1492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName(uintptr_t Ptr) : Ptr(Ptr) { } 1502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend class DeclarationNameTable; 1522a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor friend class NamedDecl; 1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1542def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// getFETokenInfoAsVoid - Retrieves the front end-specified pointer 1552def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// for this name as a void pointer. 1562def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void *getFETokenInfoAsVoid() const; 1572def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 1582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 1592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// DeclarationName - Used to create an empty selector. 1602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName() : Ptr(0) { } 1612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from an IdentifierInfo *. 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName(const IdentifierInfo *II) 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Ptr(reinterpret_cast<uintptr_t>(II)) { 1652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 1662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Construct a declaration name from an Objective-C selector. 1692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationName(Selector Sel); 1702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1716ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor /// getUsingDirectiveName - Return name for all using-directives. 1726ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor static DeclarationName getUsingDirectiveName(); 1736ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor 1742def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor // operator bool() - Evaluates true when this declaration name is 1752def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor // non-empty. 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump operator bool() const { 1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return ((Ptr & PtrMask) != 0) || 1782def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor (reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask)); 1792def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 1802def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 18191058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner /// Predicate functions for querying what type of name this is. 18291058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isIdentifier() const { return getStoredNameKind() == StoredIdentifier; } 18391058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isObjCZeroArgSelector() const { 18491058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner return getStoredNameKind() == StoredObjCZeroArgSelector; 18591058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner } 18691058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner bool isObjCOneArgSelector() const { 18791058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner return getStoredNameKind() == StoredObjCOneArgSelector; 18891058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner } 1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getNameKind - Determine what kind of name this is. 1912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor NameKind getNameKind() const; 1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor /// getName - Retrieve the human-readable string for this name. 19410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string getAsString() const; 19510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 1962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsIdentifierInfo - Retrieve the IdentifierInfo * stored in 1972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// this declaration name, or NULL if this declaration name isn't a 1982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// simple identifier. 1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump IdentifierInfo *getAsIdentifierInfo() const { 20091058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner if (isIdentifier()) 2012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return reinterpret_cast<IdentifierInfo *>(Ptr); 202ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner return 0; 2032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getAsOpaqueInteger - Get the representation of this declaration 2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// name as an opaque integer. 2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor uintptr_t getAsOpaqueInteger() const { return Ptr; } 2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 20944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// getAsOpaquePtr - Get the representation of this declaration name as 21044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// an opaque pointer. 21144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor void *getAsOpaquePtr() const { return reinterpret_cast<void*>(Ptr); } 21244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 213a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor static DeclarationName getFromOpaquePtr(void *P) { 214a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor DeclarationName N; 215a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor N.Ptr = reinterpret_cast<uintptr_t> (P); 216a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor return N; 217a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor } 2183e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 219011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner static DeclarationName getFromOpaqueInteger(uintptr_t P) { 220011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DeclarationName N; 221011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner N.Ptr = P; 222011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner return N; 223011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner } 2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXNameType - If this name is one of the C++ names (of a 2262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// constructor, destructor, or conversion function), return the 2272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// type associated with that name. 2282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType getCXXNameType() const; 2292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 230e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getCXXOverloadedOperator - If this name is the name of an 231e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// overloadable operator in C++ (e.g., @c operator+), retrieve the 232e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// kind of overloaded operator. 233e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor OverloadedOperatorKind getCXXOverloadedOperator() const; 234e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2353e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt /// getCXXLiteralIdentifier - If this name is the name of a literal 2363e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt /// operator, retrieve the identifier associated with it. 2373e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt IdentifierInfo *getCXXLiteralIdentifier() const; 2383e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 2392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getObjCSelector - Get the Objective-C selector stored in this 2402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// declaration name. 2412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Selector getObjCSelector() const; 2422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2432def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// getFETokenInfo/setFETokenInfo - The language front-end is 2442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// allowed to associate arbitrary metadata with some kinds of 2452def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// declaration names, including normal identifiers and C++ 2462def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// constructors, destructors, and conversion functions. 2472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor template<typename T> 2482def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor T *getFETokenInfo() const { return static_cast<T*>(getFETokenInfoAsVoid()); } 2492def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2502def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void setFETokenInfo(void *T); 2512def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// operator== - Determine whether the specified names are identical.. 2532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend bool operator==(DeclarationName LHS, DeclarationName RHS) { 2542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS.Ptr == RHS.Ptr; 2552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// operator!= - Determine whether the specified names are different. 2582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor friend bool operator!=(DeclarationName LHS, DeclarationName RHS) { 2592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS.Ptr != RHS.Ptr; 2602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static DeclarationName getEmptyMarker() { 2632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(uintptr_t(-1)); 2642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static DeclarationName getTombstoneMarker() { 2672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(uintptr_t(-2)); 2682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 26970f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson 27070f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson void dump() const; 2712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 2722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS); 2762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator>(DeclarationName LHS, DeclarationName RHS) { 2802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return RHS < LHS; 2812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator<=(DeclarationName LHS, DeclarationName RHS) { 2862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return !(RHS < LHS); 2872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers, 2902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering. 2912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator>=(DeclarationName LHS, DeclarationName RHS) { 2922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return !(LHS < RHS); 2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// DeclarationNameTable - Used to store and retrieve DeclarationName 2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// instances for the various kinds of declaration names, e.g., normal 2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// identifiers, C++ constructor names, etc. This class contains 2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// uniqued versions of each of the C++ special names, which can be 2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// retrieved using its member functions (e.g., 3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// getCXXConstructorName). 3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass DeclarationNameTable { 3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void *CXXSpecialNamesImpl; // Actually a FoldingSet<CXXSpecialName> * 303e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorIdName *CXXOperatorNames; // Operator names 3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable(const DeclarationNameTable&); // NONCOPYABLE 3062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable& operator=(const DeclarationNameTable&); // NONCOPYABLE 3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 3092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameTable(); 3102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ~DeclarationNameTable(); 3112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getIdentifier - Create a declaration name that is a simple 3132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// identifier. 314909e58988b3a3bb2ad36bec03aafa1302544fd73John McCall DeclarationName getIdentifier(const IdentifierInfo *ID) { 3152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(ID); 3162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXConstructorName - Returns the name of a C++ constructor 3192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// for the given Type. 32050d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXConstructorName(CanQualType Ty) { 3212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXConstructorName, Ty); 3222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXDestructorName - Returns the name of a C++ destructor 3252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// for the given Type. 32650d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXDestructorName(CanQualType Ty) { 3272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXDestructorName, Ty); 3282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXConversionFunctionName - Returns the name of a C++ 3312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// conversion function for the given Type. 33250d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor DeclarationName getCXXConversionFunctionName(CanQualType Ty) { 3332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return getCXXSpecialName(DeclarationName::CXXConversionFunctionName, Ty); 3342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// getCXXSpecialName - Returns a declaration name for special kind 3372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// of C++ name, e.g., for a constructor, destructor, or conversion 3382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor /// function. 3391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName getCXXSpecialName(DeclarationName::NameKind Kind, 34050d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor CanQualType Ty); 341e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 342e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// getCXXOperatorName - Get the name of the overloadable C++ 343e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// operator corresponding to Op. 344e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor DeclarationName getCXXOperatorName(OverloadedOperatorKind Op); 3453e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 3463e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt /// getCXXLiteralOperatorName - Get the name of the literal operator function 3473e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt /// with II as the identifier. 3483e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt DeclarationName getCXXLiteralOperatorName(IdentifierInfo *II); 3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 3502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 351011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner/// Insertion operator for diagnostics. This allows sending DeclarationName's 352011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner/// into a diagnostic with <<. 353011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattnerinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 354011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DeclarationName N) { 355011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DB.AddTaggedVal(N.getAsOpaqueInteger(), 356011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner Diagnostic::ak_declarationname); 357011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner return DB; 358011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner} 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor/// Insertion operator for partial diagnostics. This allows binding 361d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor/// DeclarationName's into a partial diagnostic with <<. 362d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregorinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, 363d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor DeclarationName N) { 364d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor PD.AddTaggedVal(N.getAsOpaqueInteger(), 365d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor Diagnostic::ak_declarationname); 366d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor return PD; 367d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor} 368d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor 3692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang 3702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace llvm { 3722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Define DenseMapInfo so that DeclarationNames can be used as keys 3732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// in DenseMap and DenseSets. 3742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregortemplate<> 3752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorstruct DenseMapInfo<clang::DeclarationName> { 3762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline clang::DeclarationName getEmptyKey() { 3772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return clang::DeclarationName::getEmptyMarker(); 3782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline clang::DeclarationName getTombstoneKey() { 3812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return clang::DeclarationName::getTombstoneMarker(); 3822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static unsigned getHashValue(clang::DeclarationName); 3852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static inline bool 3872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor isEqual(clang::DeclarationName LHS, clang::DeclarationName RHS) { 3882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS == RHS; 3892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor static inline bool isPod() { return true; } 3922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 3932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace llvm 3952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#endif 397