DeclarationName.h revision 1eb4433ac451dc16f4133a88af2d002ac26c58ef
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 {
1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    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.
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName(CXXSpecialName *Name)
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : 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.
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName(CXXOperatorIdName *Name)
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : 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 *.
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName(const IdentifierInfo *II)
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : 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.
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  operator bool() const {
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    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  }
1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getNameKind - Determine what kind of name this is.
1762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  NameKind getNameKind() const;
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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.
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  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  }
2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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.
3131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  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);
3191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
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}
3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  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