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