DeclarationName.h revision 909e58988b3a3bb2ad36bec03aafa1302544fd73
1//===-- DeclarationName.h - Representation of declaration names -*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file declares the DeclarationName and DeclarationNameTable classes. 11// 12//===----------------------------------------------------------------------===// 13#ifndef LLVM_CLANG_AST_DECLARATIONNAME_H 14#define LLVM_CLANG_AST_DECLARATIONNAME_H 15 16#include "clang/Basic/IdentifierTable.h" 17#include "clang/AST/Type.h" 18#include "clang/AST/CanonicalType.h" 19#include "clang/Basic/PartialDiagnostic.h" 20 21namespace llvm { 22 template <typename T> struct DenseMapInfo; 23} 24 25namespace clang { 26 class CXXSpecialName; 27 class CXXOperatorIdName; 28 class DeclarationNameExtra; 29 class IdentifierInfo; 30 class MultiKeywordSelector; 31 class UsingDirectiveDecl; 32 33/// DeclarationName - The name of a declaration. In the common case, 34/// this just stores an IdentifierInfo pointer to a normal 35/// name. However, it also provides encodings for Objective-C 36/// selectors (optimizing zero- and one-argument selectors, which make 37/// up 78% percent of all selectors in Cocoa.h) and special C++ names 38/// for constructors, destructors, and conversion functions. 39class DeclarationName { 40public: 41 /// NameKind - The kind of name this object contains. 42 enum NameKind { 43 Identifier, 44 ObjCZeroArgSelector, 45 ObjCOneArgSelector, 46 ObjCMultiArgSelector, 47 CXXConstructorName, 48 CXXDestructorName, 49 CXXConversionFunctionName, 50 CXXOperatorName, 51 CXXUsingDirective 52 }; 53 54private: 55 /// StoredNameKind - The kind of name that is actually stored in the 56 /// upper bits of the Ptr field. This is only used internally. 57 enum StoredNameKind { 58 StoredIdentifier = 0, 59 StoredObjCZeroArgSelector, 60 StoredObjCOneArgSelector, 61 StoredDeclarationNameExtra, 62 PtrMask = 0x03 63 }; 64 65 /// Ptr - The lowest two bits are used to express what kind of name 66 /// we're actually storing, using the values of NameKind. Depending 67 /// on the kind of name this is, the upper bits of Ptr may have one 68 /// of several different meanings: 69 /// 70 /// StoredIdentifier - The name is a normal identifier, and Ptr is 71 /// a normal IdentifierInfo pointer. 72 /// 73 /// StoredObjCZeroArgSelector - The name is an Objective-C 74 /// selector with zero arguments, and Ptr is an IdentifierInfo 75 /// pointer pointing to the selector name. 76 /// 77 /// StoredObjCOneArgSelector - The name is an Objective-C selector 78 /// with one argument, and Ptr is an IdentifierInfo pointer 79 /// pointing to the selector name. 80 /// 81 /// StoredDeclarationNameExtra - Ptr is actually a pointer to a 82 /// DeclarationNameExtra structure, whose first value will tell us 83 /// whether this is an Objective-C selector, C++ operator-id name, 84 /// or special C++ name. 85 uintptr_t Ptr; 86 87 /// getStoredNameKind - Return the kind of object that is stored in 88 /// Ptr. 89 StoredNameKind getStoredNameKind() const { 90 return static_cast<StoredNameKind>(Ptr & PtrMask); 91 } 92 93 /// getExtra - Get the "extra" information associated with this 94 /// multi-argument selector or C++ special name. 95 DeclarationNameExtra *getExtra() const { 96 assert(getStoredNameKind() == StoredDeclarationNameExtra && 97 "Declaration name does not store an Extra structure"); 98 return reinterpret_cast<DeclarationNameExtra *>(Ptr & ~PtrMask); 99 } 100 101 /// getAsCXXSpecialName - If the stored pointer is actually a 102 /// CXXSpecialName, returns a pointer to it. Otherwise, returns 103 /// a NULL pointer. 104 CXXSpecialName *getAsCXXSpecialName() const { 105 if (getNameKind() >= CXXConstructorName && 106 getNameKind() <= CXXConversionFunctionName) 107 return reinterpret_cast<CXXSpecialName *>(Ptr & ~PtrMask); 108 return 0; 109 } 110 111 /// getAsCXXOperatorIdName 112 CXXOperatorIdName *getAsCXXOperatorIdName() const { 113 if (getNameKind() == CXXOperatorName) 114 return reinterpret_cast<CXXOperatorIdName *>(Ptr & ~PtrMask); 115 return 0; 116 } 117 118 // Construct a declaration name from the name of a C++ constructor, 119 // destructor, or conversion function. 120 DeclarationName(CXXSpecialName *Name) 121 : Ptr(reinterpret_cast<uintptr_t>(Name)) { 122 assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXSpecialName"); 123 Ptr |= StoredDeclarationNameExtra; 124 } 125 126 // Construct a declaration name from the name of a C++ overloaded 127 // operator. 128 DeclarationName(CXXOperatorIdName *Name) 129 : Ptr(reinterpret_cast<uintptr_t>(Name)) { 130 assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXOperatorId"); 131 Ptr |= StoredDeclarationNameExtra; 132 } 133 134 /// Construct a declaration name from a raw pointer. 135 DeclarationName(uintptr_t Ptr) : Ptr(Ptr) { } 136 137 friend class DeclarationNameTable; 138 friend class NamedDecl; 139 140 /// getFETokenInfoAsVoid - Retrieves the front end-specified pointer 141 /// for this name as a void pointer. 142 void *getFETokenInfoAsVoid() const; 143 144public: 145 /// DeclarationName - Used to create an empty selector. 146 DeclarationName() : Ptr(0) { } 147 148 // Construct a declaration name from an IdentifierInfo *. 149 DeclarationName(const IdentifierInfo *II) 150 : Ptr(reinterpret_cast<uintptr_t>(II)) { 151 assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 152 } 153 154 // Construct a declaration name from an Objective-C selector. 155 DeclarationName(Selector Sel); 156 157 /// getUsingDirectiveName - Return name for all using-directives. 158 static DeclarationName getUsingDirectiveName(); 159 160 // operator bool() - Evaluates true when this declaration name is 161 // non-empty. 162 operator bool() const { 163 return ((Ptr & PtrMask) != 0) || 164 (reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask)); 165 } 166 167 /// Predicate functions for querying what type of name this is. 168 bool isIdentifier() const { return getStoredNameKind() == StoredIdentifier; } 169 bool isObjCZeroArgSelector() const { 170 return getStoredNameKind() == StoredObjCZeroArgSelector; 171 } 172 bool isObjCOneArgSelector() const { 173 return getStoredNameKind() == StoredObjCOneArgSelector; 174 } 175 176 /// getNameKind - Determine what kind of name this is. 177 NameKind getNameKind() const; 178 179 /// getName - Retrieve the human-readable string for this name. 180 std::string getAsString() const; 181 182 /// getAsIdentifierInfo - Retrieve the IdentifierInfo * stored in 183 /// this declaration name, or NULL if this declaration name isn't a 184 /// simple identifier. 185 IdentifierInfo *getAsIdentifierInfo() const { 186 if (isIdentifier()) 187 return reinterpret_cast<IdentifierInfo *>(Ptr); 188 return 0; 189 } 190 191 /// getAsOpaqueInteger - Get the representation of this declaration 192 /// name as an opaque integer. 193 uintptr_t getAsOpaqueInteger() const { return Ptr; } 194 195 /// getAsOpaquePtr - Get the representation of this declaration name as 196 /// an opaque pointer. 197 void *getAsOpaquePtr() const { return reinterpret_cast<void*>(Ptr); } 198 199 static DeclarationName getFromOpaquePtr(void *P) { 200 DeclarationName N; 201 N.Ptr = reinterpret_cast<uintptr_t> (P); 202 return N; 203 } 204 205 static DeclarationName getFromOpaqueInteger(uintptr_t P) { 206 DeclarationName N; 207 N.Ptr = P; 208 return N; 209 } 210 211 /// getCXXNameType - If this name is one of the C++ names (of a 212 /// constructor, destructor, or conversion function), return the 213 /// type associated with that name. 214 QualType getCXXNameType() const; 215 216 /// getCXXOverloadedOperator - If this name is the name of an 217 /// overloadable operator in C++ (e.g., @c operator+), retrieve the 218 /// kind of overloaded operator. 219 OverloadedOperatorKind getCXXOverloadedOperator() const; 220 221 /// getObjCSelector - Get the Objective-C selector stored in this 222 /// declaration name. 223 Selector getObjCSelector() const; 224 225 /// getFETokenInfo/setFETokenInfo - The language front-end is 226 /// allowed to associate arbitrary metadata with some kinds of 227 /// declaration names, including normal identifiers and C++ 228 /// constructors, destructors, and conversion functions. 229 template<typename T> 230 T *getFETokenInfo() const { return static_cast<T*>(getFETokenInfoAsVoid()); } 231 232 void setFETokenInfo(void *T); 233 234 /// operator== - Determine whether the specified names are identical.. 235 friend bool operator==(DeclarationName LHS, DeclarationName RHS) { 236 return LHS.Ptr == RHS.Ptr; 237 } 238 239 /// operator!= - Determine whether the specified names are different. 240 friend bool operator!=(DeclarationName LHS, DeclarationName RHS) { 241 return LHS.Ptr != RHS.Ptr; 242 } 243 244 static DeclarationName getEmptyMarker() { 245 return DeclarationName(uintptr_t(-1)); 246 } 247 248 static DeclarationName getTombstoneMarker() { 249 return DeclarationName(uintptr_t(-2)); 250 } 251 252 void dump() const; 253}; 254 255/// Ordering on two declaration names. If both names are identifiers, 256/// this provides a lexicographical ordering. 257bool operator<(DeclarationName LHS, DeclarationName RHS); 258 259/// Ordering on two declaration names. If both names are identifiers, 260/// this provides a lexicographical ordering. 261inline bool operator>(DeclarationName LHS, DeclarationName RHS) { 262 return RHS < LHS; 263} 264 265/// Ordering on two declaration names. If both names are identifiers, 266/// this provides a lexicographical ordering. 267inline bool operator<=(DeclarationName LHS, DeclarationName RHS) { 268 return !(RHS < LHS); 269} 270 271/// Ordering on two declaration names. If both names are identifiers, 272/// this provides a lexicographical ordering. 273inline bool operator>=(DeclarationName LHS, DeclarationName RHS) { 274 return !(LHS < RHS); 275} 276 277/// DeclarationNameTable - Used to store and retrieve DeclarationName 278/// instances for the various kinds of declaration names, e.g., normal 279/// identifiers, C++ constructor names, etc. This class contains 280/// uniqued versions of each of the C++ special names, which can be 281/// retrieved using its member functions (e.g., 282/// getCXXConstructorName). 283class DeclarationNameTable { 284 void *CXXSpecialNamesImpl; // Actually a FoldingSet<CXXSpecialName> * 285 CXXOperatorIdName *CXXOperatorNames; // Operator names 286 287 DeclarationNameTable(const DeclarationNameTable&); // NONCOPYABLE 288 DeclarationNameTable& operator=(const DeclarationNameTable&); // NONCOPYABLE 289 290public: 291 DeclarationNameTable(); 292 ~DeclarationNameTable(); 293 294 /// getIdentifier - Create a declaration name that is a simple 295 /// identifier. 296 DeclarationName getIdentifier(const IdentifierInfo *ID) { 297 return DeclarationName(ID); 298 } 299 300 /// getCXXConstructorName - Returns the name of a C++ constructor 301 /// for the given Type. 302 DeclarationName getCXXConstructorName(CanQualType Ty) { 303 return getCXXSpecialName(DeclarationName::CXXConstructorName, Ty); 304 } 305 306 /// getCXXDestructorName - Returns the name of a C++ destructor 307 /// for the given Type. 308 DeclarationName getCXXDestructorName(CanQualType Ty) { 309 return getCXXSpecialName(DeclarationName::CXXDestructorName, Ty); 310 } 311 312 /// getCXXConversionFunctionName - Returns the name of a C++ 313 /// conversion function for the given Type. 314 DeclarationName getCXXConversionFunctionName(CanQualType Ty) { 315 return getCXXSpecialName(DeclarationName::CXXConversionFunctionName, Ty); 316 } 317 318 /// getCXXSpecialName - Returns a declaration name for special kind 319 /// of C++ name, e.g., for a constructor, destructor, or conversion 320 /// function. 321 DeclarationName getCXXSpecialName(DeclarationName::NameKind Kind, 322 CanQualType Ty); 323 324 /// getCXXOperatorName - Get the name of the overloadable C++ 325 /// operator corresponding to Op. 326 DeclarationName getCXXOperatorName(OverloadedOperatorKind Op); 327}; 328 329/// Insertion operator for diagnostics. This allows sending DeclarationName's 330/// into a diagnostic with <<. 331inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 332 DeclarationName N) { 333 DB.AddTaggedVal(N.getAsOpaqueInteger(), 334 Diagnostic::ak_declarationname); 335 return DB; 336} 337 338/// Insertion operator for partial diagnostics. This allows binding 339/// DeclarationName's into a partial diagnostic with <<. 340inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, 341 DeclarationName N) { 342 PD.AddTaggedVal(N.getAsOpaqueInteger(), 343 Diagnostic::ak_declarationname); 344 return PD; 345} 346 347} // end namespace clang 348 349namespace llvm { 350/// Define DenseMapInfo so that DeclarationNames can be used as keys 351/// in DenseMap and DenseSets. 352template<> 353struct DenseMapInfo<clang::DeclarationName> { 354 static inline clang::DeclarationName getEmptyKey() { 355 return clang::DeclarationName::getEmptyMarker(); 356 } 357 358 static inline clang::DeclarationName getTombstoneKey() { 359 return clang::DeclarationName::getTombstoneMarker(); 360 } 361 362 static unsigned getHashValue(clang::DeclarationName); 363 364 static inline bool 365 isEqual(clang::DeclarationName LHS, clang::DeclarationName RHS) { 366 return LHS == RHS; 367 } 368 369 static inline bool isPod() { return true; } 370}; 371 372} // end namespace llvm 373 374#endif 375