IdentifierTable.h revision f56faa01936b9cf909623d7f06e3c2569ca4a78e
1//===--- IdentifierTable.h - Hash table for identifier lookup ---*- 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/// \file
11/// \brief Defines the clang::IdentifierInfo, clang::IdentifierTable, and
12/// clang::Selector interfaces.
13///
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CLANG_BASIC_IDENTIFIERTABLE_H
17#define LLVM_CLANG_BASIC_IDENTIFIERTABLE_H
18
19#include "clang/Basic/OperatorKinds.h"
20#include "clang/Basic/TokenKinds.h"
21#include "clang/Basic/LLVM.h"
22#include "llvm/ADT/StringMap.h"
23#include "llvm/ADT/StringRef.h"
24#include "llvm/ADT/OwningPtr.h"
25#include "llvm/Support/PointerLikeTypeTraits.h"
26#include <cassert>
27#include <string>
28
29namespace llvm {
30  template <typename T> struct DenseMapInfo;
31}
32
33namespace clang {
34  class LangOptions;
35  class IdentifierInfo;
36  class IdentifierTable;
37  class SourceLocation;
38  class MultiKeywordSelector; // private class used by Selector
39  class DeclarationName;      // AST class that stores declaration names
40
41  /// \brief A simple pair of identifier info and location.
42  typedef std::pair<IdentifierInfo*, SourceLocation> IdentifierLocPair;
43
44
45/// One of these records is kept for each identifier that
46/// is lexed.  This contains information about whether the token was \#define'd,
47/// is a language keyword, or if it is a front-end token of some sort (e.g. a
48/// variable or function name).  The preprocessor keeps this information in a
49/// set, and all tok::identifier tokens have a pointer to one of these.
50class IdentifierInfo {
51  unsigned TokenID            : 9; // Front-end token ID or tok::identifier.
52  // Objective-C keyword ('protocol' in '@protocol') or builtin (__builtin_inf).
53  // First NUM_OBJC_KEYWORDS values are for Objective-C, the remaining values
54  // are for builtins.
55  unsigned ObjCOrBuiltinID    :11;
56  bool HasMacro               : 1; // True if there is a #define for this.
57  bool IsExtension            : 1; // True if identifier is a lang extension.
58  bool IsCXX11CompatKeyword   : 1; // True if identifier is a keyword in C++11.
59  bool IsPoisoned             : 1; // True if identifier is poisoned.
60  bool IsCPPOperatorKeyword   : 1; // True if ident is a C++ operator keyword.
61  bool NeedsHandleIdentifier  : 1; // See "RecomputeNeedsHandleIdentifier".
62  bool IsFromAST              : 1; // True if identifier was loaded (at least
63                                   // partially) from an AST file.
64  bool ChangedAfterLoad       : 1; // True if identifier has changed from the
65                                   // definition loaded from an AST file.
66  bool RevertedTokenID        : 1; // True if RevertTokenIDToIdentifier was
67                                   // called.
68  bool OutOfDate              : 1; // True if there may be additional
69                                   // information about this identifier
70                                   // stored externally.
71  bool IsModulesImport        : 1; // True if this is the 'import' contextual
72                                   // keyword.
73  // 1 bit left in 32-bit word.
74
75  void *FETokenInfo;               // Managed by the language front-end.
76  llvm::StringMapEntry<IdentifierInfo*> *Entry;
77
78  IdentifierInfo(const IdentifierInfo&);  // NONCOPYABLE.
79  void operator=(const IdentifierInfo&);  // NONASSIGNABLE.
80
81  friend class IdentifierTable;
82
83public:
84  IdentifierInfo();
85
86
87  /// \brief Return true if this is the identifier for the specified string.
88  ///
89  /// This is intended to be used for string literals only: II->isStr("foo").
90  template <std::size_t StrLen>
91  bool isStr(const char (&Str)[StrLen]) const {
92    return getLength() == StrLen-1 && !memcmp(getNameStart(), Str, StrLen-1);
93  }
94
95  /// \brief Return the beginning of the actual null-terminated string for this
96  /// identifier.
97  ///
98  const char *getNameStart() const {
99    if (Entry) return Entry->getKeyData();
100    // FIXME: This is gross. It would be best not to embed specific details
101    // of the PTH file format here.
102    // The 'this' pointer really points to a
103    // std::pair<IdentifierInfo, const char*>, where internal pointer
104    // points to the external string data.
105    typedef std::pair<IdentifierInfo, const char*> actualtype;
106    return ((const actualtype*) this)->second;
107  }
108
109  /// \brief Efficiently return the length of this identifier info.
110  ///
111  unsigned getLength() const {
112    if (Entry) return Entry->getKeyLength();
113    // FIXME: This is gross. It would be best not to embed specific details
114    // of the PTH file format here.
115    // The 'this' pointer really points to a
116    // std::pair<IdentifierInfo, const char*>, where internal pointer
117    // points to the external string data.
118    typedef std::pair<IdentifierInfo, const char*> actualtype;
119    const char* p = ((const actualtype*) this)->second - 2;
120    return (((unsigned) p[0]) | (((unsigned) p[1]) << 8)) - 1;
121  }
122
123  /// \brief Return the actual identifier string.
124  StringRef getName() const {
125    return StringRef(getNameStart(), getLength());
126  }
127
128  /// \brief Return true if this identifier is \#defined to some other value.
129  bool hasMacroDefinition() const {
130    return HasMacro;
131  }
132  void setHasMacroDefinition(bool Val) {
133    if (HasMacro == Val) return;
134
135    HasMacro = Val;
136    if (Val)
137      NeedsHandleIdentifier = 1;
138    else
139      RecomputeNeedsHandleIdentifier();
140  }
141
142  /// getTokenID - If this is a source-language token (e.g. 'for'), this API
143  /// can be used to cause the lexer to map identifiers to source-language
144  /// tokens.
145  tok::TokenKind getTokenID() const { return (tok::TokenKind)TokenID; }
146
147  /// \brief True if RevertTokenIDToIdentifier() was called.
148  bool hasRevertedTokenIDToIdentifier() const { return RevertedTokenID; }
149
150  /// \brief Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2
151  /// compatibility.
152  ///
153  /// TokenID is normally read-only but there are 2 instances where we revert it
154  /// to tok::identifier for libstdc++ 4.2. Keep track of when this happens
155  /// using this method so we can inform serialization about it.
156  void RevertTokenIDToIdentifier() {
157    assert(TokenID != tok::identifier && "Already at tok::identifier");
158    TokenID = tok::identifier;
159    RevertedTokenID = true;
160  }
161
162  /// \brief Return the preprocessor keyword ID for this identifier.
163  ///
164  /// For example, "define" will return tok::pp_define.
165  tok::PPKeywordKind getPPKeywordID() const;
166
167  /// \brief Return the Objective-C keyword ID for the this identifier.
168  ///
169  /// For example, 'class' will return tok::objc_class if ObjC is enabled.
170  tok::ObjCKeywordKind getObjCKeywordID() const {
171    if (ObjCOrBuiltinID < tok::NUM_OBJC_KEYWORDS)
172      return tok::ObjCKeywordKind(ObjCOrBuiltinID);
173    else
174      return tok::objc_not_keyword;
175  }
176  void setObjCKeywordID(tok::ObjCKeywordKind ID) { ObjCOrBuiltinID = ID; }
177
178  /// getBuiltinID - Return a value indicating whether this is a builtin
179  /// function.  0 is not-built-in.  1 is builtin-for-some-nonprimary-target.
180  /// 2+ are specific builtin functions.
181  unsigned getBuiltinID() const {
182    if (ObjCOrBuiltinID >= tok::NUM_OBJC_KEYWORDS)
183      return ObjCOrBuiltinID - tok::NUM_OBJC_KEYWORDS;
184    else
185      return 0;
186  }
187  void setBuiltinID(unsigned ID) {
188    ObjCOrBuiltinID = ID + tok::NUM_OBJC_KEYWORDS;
189    assert(ObjCOrBuiltinID - unsigned(tok::NUM_OBJC_KEYWORDS) == ID
190           && "ID too large for field!");
191  }
192
193  unsigned getObjCOrBuiltinID() const { return ObjCOrBuiltinID; }
194  void setObjCOrBuiltinID(unsigned ID) { ObjCOrBuiltinID = ID; }
195
196  /// get/setExtension - Initialize information about whether or not this
197  /// language token is an extension.  This controls extension warnings, and is
198  /// only valid if a custom token ID is set.
199  bool isExtensionToken() const { return IsExtension; }
200  void setIsExtensionToken(bool Val) {
201    IsExtension = Val;
202    if (Val)
203      NeedsHandleIdentifier = 1;
204    else
205      RecomputeNeedsHandleIdentifier();
206  }
207
208  /// is/setIsCXX11CompatKeyword - Initialize information about whether or not
209  /// this language token is a keyword in C++11. This controls compatibility
210  /// warnings, and is only true when not parsing C++11. Once a compatibility
211  /// problem has been diagnosed with this keyword, the flag will be cleared.
212  bool isCXX11CompatKeyword() const { return IsCXX11CompatKeyword; }
213  void setIsCXX11CompatKeyword(bool Val) {
214    IsCXX11CompatKeyword = Val;
215    if (Val)
216      NeedsHandleIdentifier = 1;
217    else
218      RecomputeNeedsHandleIdentifier();
219  }
220
221  /// setIsPoisoned - Mark this identifier as poisoned.  After poisoning, the
222  /// Preprocessor will emit an error every time this token is used.
223  void setIsPoisoned(bool Value = true) {
224    IsPoisoned = Value;
225    if (Value)
226      NeedsHandleIdentifier = 1;
227    else
228      RecomputeNeedsHandleIdentifier();
229  }
230
231  /// isPoisoned - Return true if this token has been poisoned.
232  bool isPoisoned() const { return IsPoisoned; }
233
234  /// isCPlusPlusOperatorKeyword/setIsCPlusPlusOperatorKeyword controls whether
235  /// this identifier is a C++ alternate representation of an operator.
236  void setIsCPlusPlusOperatorKeyword(bool Val = true) {
237    IsCPPOperatorKeyword = Val;
238    if (Val)
239      NeedsHandleIdentifier = 1;
240    else
241      RecomputeNeedsHandleIdentifier();
242  }
243  bool isCPlusPlusOperatorKeyword() const { return IsCPPOperatorKeyword; }
244
245  /// getFETokenInfo/setFETokenInfo - The language front-end is allowed to
246  /// associate arbitrary metadata with this token.
247  template<typename T>
248  T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }
249  void setFETokenInfo(void *T) { FETokenInfo = T; }
250
251  /// isHandleIdentifierCase - Return true if the Preprocessor::HandleIdentifier
252  /// must be called on a token of this identifier.  If this returns false, we
253  /// know that HandleIdentifier will not affect the token.
254  bool isHandleIdentifierCase() const { return NeedsHandleIdentifier; }
255
256  /// isFromAST - Return true if the identifier in its current state was loaded
257  /// from an AST file.
258  bool isFromAST() const { return IsFromAST; }
259
260  void setIsFromAST() { IsFromAST = true; }
261
262  /// \brief Determine whether this identifier has changed since it was loaded
263  /// from an AST file.
264  bool hasChangedSinceDeserialization() const {
265    return ChangedAfterLoad;
266  }
267
268  /// \brief Note that this identifier has changed since it was loaded from
269  /// an AST file.
270  void setChangedSinceDeserialization() {
271    ChangedAfterLoad = true;
272  }
273
274  /// \brief Determine whether the information for this identifier is out of
275  /// date with respect to the external source.
276  bool isOutOfDate() const { return OutOfDate; }
277
278  /// \brief Set whether the information for this identifier is out of
279  /// date with respect to the external source.
280  void setOutOfDate(bool OOD) {
281    OutOfDate = OOD;
282    if (OOD)
283      NeedsHandleIdentifier = true;
284    else
285      RecomputeNeedsHandleIdentifier();
286  }
287
288  /// \brief Determine whether this is the contextual keyword
289  /// '__experimental_modules_import'.
290  bool isModulesImport() const { return IsModulesImport; }
291
292  /// \brief Set whether this identifier is the contextual keyword
293  /// '__experimental_modules_import'.
294  void setModulesImport(bool I) {
295    IsModulesImport = I;
296    if (I)
297      NeedsHandleIdentifier = true;
298    else
299      RecomputeNeedsHandleIdentifier();
300  }
301
302private:
303  /// RecomputeNeedsHandleIdentifier - The Preprocessor::HandleIdentifier does
304  /// several special (but rare) things to identifiers of various sorts.  For
305  /// example, it changes the "for" keyword token from tok::identifier to
306  /// tok::for.
307  ///
308  /// This method is very tied to the definition of HandleIdentifier.  Any
309  /// change to it should be reflected here.
310  void RecomputeNeedsHandleIdentifier() {
311    NeedsHandleIdentifier =
312      (isPoisoned() | hasMacroDefinition() | isCPlusPlusOperatorKeyword() |
313       isExtensionToken() | isCXX11CompatKeyword() || isOutOfDate() ||
314       isModulesImport());
315  }
316};
317
318/// \brief an RAII object for [un]poisoning an identifier
319/// within a certain scope. II is allowed to be null, in
320/// which case, objects of this type have no effect.
321class PoisonIdentifierRAIIObject {
322  IdentifierInfo *const II;
323  const bool OldValue;
324public:
325  PoisonIdentifierRAIIObject(IdentifierInfo *II, bool NewValue)
326    : II(II), OldValue(II ? II->isPoisoned() : false) {
327    if(II)
328      II->setIsPoisoned(NewValue);
329  }
330
331  ~PoisonIdentifierRAIIObject() {
332    if(II)
333      II->setIsPoisoned(OldValue);
334  }
335};
336
337/// \brief An iterator that walks over all of the known identifiers
338/// in the lookup table.
339///
340/// Since this iterator uses an abstract interface via virtual
341/// functions, it uses an object-oriented interface rather than the
342/// more standard C++ STL iterator interface. In this OO-style
343/// iteration, the single function \c Next() provides dereference,
344/// advance, and end-of-sequence checking in a single
345/// operation. Subclasses of this iterator type will provide the
346/// actual functionality.
347class IdentifierIterator {
348private:
349  IdentifierIterator(const IdentifierIterator &) LLVM_DELETED_FUNCTION;
350  void operator=(const IdentifierIterator &) LLVM_DELETED_FUNCTION;
351
352protected:
353  IdentifierIterator() { }
354
355public:
356  virtual ~IdentifierIterator();
357
358  /// \brief Retrieve the next string in the identifier table and
359  /// advances the iterator for the following string.
360  ///
361  /// \returns The next string in the identifier table. If there is
362  /// no such string, returns an empty \c StringRef.
363  virtual StringRef Next() = 0;
364};
365
366/// IdentifierInfoLookup - An abstract class used by IdentifierTable that
367///  provides an interface for performing lookups from strings
368/// (const char *) to IdentiferInfo objects.
369class IdentifierInfoLookup {
370public:
371  virtual ~IdentifierInfoLookup();
372
373  /// get - Return the identifier token info for the specified named identifier.
374  ///  Unlike the version in IdentifierTable, this returns a pointer instead
375  ///  of a reference.  If the pointer is NULL then the IdentifierInfo cannot
376  ///  be found.
377  virtual IdentifierInfo* get(StringRef Name) = 0;
378
379  /// \brief Retrieve an iterator into the set of all identifiers
380  /// known to this identifier lookup source.
381  ///
382  /// This routine provides access to all of the identifiers known to
383  /// the identifier lookup, allowing access to the contents of the
384  /// identifiers without introducing the overhead of constructing
385  /// IdentifierInfo objects for each.
386  ///
387  /// \returns A new iterator into the set of known identifiers. The
388  /// caller is responsible for deleting this iterator.
389  virtual IdentifierIterator *getIdentifiers() const;
390};
391
392/// \brief An abstract class used to resolve numerical identifier
393/// references (meaningful only to some external source) into
394/// IdentifierInfo pointers.
395class ExternalIdentifierLookup {
396public:
397  virtual ~ExternalIdentifierLookup();
398
399  /// \brief Return the identifier associated with the given ID number.
400  ///
401  /// The ID 0 is associated with the NULL identifier.
402  virtual IdentifierInfo *GetIdentifier(unsigned ID) = 0;
403};
404
405/// \brief Implements an efficient mapping from strings to IdentifierInfo nodes.
406///
407/// This has no other purpose, but this is an extremely performance-critical
408/// piece of the code, as each occurrence of every identifier goes through
409/// here when lexed.
410class IdentifierTable {
411  // Shark shows that using MallocAllocator is *much* slower than using this
412  // BumpPtrAllocator!
413  typedef llvm::StringMap<IdentifierInfo*, llvm::BumpPtrAllocator> HashTableTy;
414  HashTableTy HashTable;
415
416  IdentifierInfoLookup* ExternalLookup;
417
418public:
419  /// \brief Create the identifier table, populating it with info about the
420  /// language keywords for the language specified by \p LangOpts.
421  IdentifierTable(const LangOptions &LangOpts,
422                  IdentifierInfoLookup* externalLookup = 0);
423
424  /// \brief Set the external identifier lookup mechanism.
425  void setExternalIdentifierLookup(IdentifierInfoLookup *IILookup) {
426    ExternalLookup = IILookup;
427  }
428
429  /// \brief Retrieve the external identifier lookup object, if any.
430  IdentifierInfoLookup *getExternalIdentifierLookup() const {
431    return ExternalLookup;
432  }
433
434  llvm::BumpPtrAllocator& getAllocator() {
435    return HashTable.getAllocator();
436  }
437
438  /// \brief Return the identifier token info for the specified named
439  /// identifier.
440  IdentifierInfo &get(StringRef Name) {
441    llvm::StringMapEntry<IdentifierInfo*> &Entry =
442      HashTable.GetOrCreateValue(Name);
443
444    IdentifierInfo *II = Entry.getValue();
445    if (II) return *II;
446
447    // No entry; if we have an external lookup, look there first.
448    if (ExternalLookup) {
449      II = ExternalLookup->get(Name);
450      if (II) {
451        // Cache in the StringMap for subsequent lookups.
452        Entry.setValue(II);
453        return *II;
454      }
455    }
456
457    // Lookups failed, make a new IdentifierInfo.
458    void *Mem = getAllocator().Allocate<IdentifierInfo>();
459    II = new (Mem) IdentifierInfo();
460    Entry.setValue(II);
461
462    // Make sure getName() knows how to find the IdentifierInfo
463    // contents.
464    II->Entry = &Entry;
465
466    return *II;
467  }
468
469  IdentifierInfo &get(StringRef Name, tok::TokenKind TokenCode) {
470    IdentifierInfo &II = get(Name);
471    II.TokenID = TokenCode;
472    assert(II.TokenID == (unsigned) TokenCode && "TokenCode too large");
473    return II;
474  }
475
476  /// \brief Gets an IdentifierInfo for the given name without consulting
477  ///        external sources.
478  ///
479  /// This is a version of get() meant for external sources that want to
480  /// introduce or modify an identifier. If they called get(), they would
481  /// likely end up in a recursion.
482  IdentifierInfo &getOwn(StringRef Name) {
483    llvm::StringMapEntry<IdentifierInfo*> &Entry =
484      HashTable.GetOrCreateValue(Name);
485
486    IdentifierInfo *II = Entry.getValue();
487    if (!II) {
488
489      // Lookups failed, make a new IdentifierInfo.
490      void *Mem = getAllocator().Allocate<IdentifierInfo>();
491      II = new (Mem) IdentifierInfo();
492      Entry.setValue(II);
493
494      // Make sure getName() knows how to find the IdentifierInfo
495      // contents.
496      II->Entry = &Entry;
497
498      // If this is the 'import' contextual keyword, mark it as such.
499      if (Name.equals("import"))
500        II->setModulesImport(true);
501    }
502
503    return *II;
504  }
505
506  typedef HashTableTy::const_iterator iterator;
507  typedef HashTableTy::const_iterator const_iterator;
508
509  iterator begin() const { return HashTable.begin(); }
510  iterator end() const   { return HashTable.end(); }
511  unsigned size() const { return HashTable.size(); }
512
513  /// \brief Print some statistics to stderr that indicate how well the
514  /// hashing is doing.
515  void PrintStats() const;
516
517  void AddKeywords(const LangOptions &LangOpts);
518};
519
520/// \brief A family of Objective-C methods.
521///
522/// These families have no inherent meaning in the language, but are
523/// nonetheless central enough in the existing implementations to
524/// merit direct AST support.  While, in theory, arbitrary methods can
525/// be considered to form families, we focus here on the methods
526/// involving allocation and retain-count management, as these are the
527/// most "core" and the most likely to be useful to diverse clients
528/// without extra information.
529///
530/// Both selectors and actual method declarations may be classified
531/// into families.  Method families may impose additional restrictions
532/// beyond their selector name; for example, a method called '_init'
533/// that returns void is not considered to be in the 'init' family
534/// (but would be if it returned 'id').  It is also possible to
535/// explicitly change or remove a method's family.  Therefore the
536/// method's family should be considered the single source of truth.
537enum ObjCMethodFamily {
538  /// \brief No particular method family.
539  OMF_None,
540
541  // Selectors in these families may have arbitrary arity, may be
542  // written with arbitrary leading underscores, and may have
543  // additional CamelCase "words" in their first selector chunk
544  // following the family name.
545  OMF_alloc,
546  OMF_copy,
547  OMF_init,
548  OMF_mutableCopy,
549  OMF_new,
550
551  // These families are singletons consisting only of the nullary
552  // selector with the given name.
553  OMF_autorelease,
554  OMF_dealloc,
555  OMF_finalize,
556  OMF_release,
557  OMF_retain,
558  OMF_retainCount,
559  OMF_self,
560
561  // performSelector families
562  OMF_performSelector
563};
564
565/// Enough bits to store any enumerator in ObjCMethodFamily or
566/// InvalidObjCMethodFamily.
567enum { ObjCMethodFamilyBitWidth = 4 };
568
569/// \brief An invalid value of ObjCMethodFamily.
570enum { InvalidObjCMethodFamily = (1 << ObjCMethodFamilyBitWidth) - 1 };
571
572/// \brief Smart pointer class that efficiently represents Objective-C method
573/// names.
574///
575/// This class will either point to an IdentifierInfo or a
576/// MultiKeywordSelector (which is private). This enables us to optimize
577/// selectors that take no arguments and selectors that take 1 argument, which
578/// accounts for 78% of all selectors in Cocoa.h.
579class Selector {
580  friend class Diagnostic;
581
582  enum IdentifierInfoFlag {
583    // Empty selector = 0.
584    ZeroArg  = 0x1,
585    OneArg   = 0x2,
586    MultiArg = 0x3,
587    ArgFlags = ZeroArg|OneArg
588  };
589  uintptr_t InfoPtr; // a pointer to the MultiKeywordSelector or IdentifierInfo.
590
591  Selector(IdentifierInfo *II, unsigned nArgs) {
592    InfoPtr = reinterpret_cast<uintptr_t>(II);
593    assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
594    assert(nArgs < 2 && "nArgs not equal to 0/1");
595    InfoPtr |= nArgs+1;
596  }
597  Selector(MultiKeywordSelector *SI) {
598    InfoPtr = reinterpret_cast<uintptr_t>(SI);
599    assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
600    InfoPtr |= MultiArg;
601  }
602
603  IdentifierInfo *getAsIdentifierInfo() const {
604    if (getIdentifierInfoFlag() < MultiArg)
605      return reinterpret_cast<IdentifierInfo *>(InfoPtr & ~ArgFlags);
606    return 0;
607  }
608  MultiKeywordSelector *getMultiKeywordSelector() const {
609    return reinterpret_cast<MultiKeywordSelector *>(InfoPtr & ~ArgFlags);
610  }
611
612  unsigned getIdentifierInfoFlag() const {
613    return InfoPtr & ArgFlags;
614  }
615
616  static ObjCMethodFamily getMethodFamilyImpl(Selector sel);
617
618public:
619  friend class SelectorTable; // only the SelectorTable can create these
620  friend class DeclarationName; // and the AST's DeclarationName.
621
622  /// The default ctor should only be used when creating data structures that
623  ///  will contain selectors.
624  Selector() : InfoPtr(0) {}
625  Selector(uintptr_t V) : InfoPtr(V) {}
626
627  /// operator==/!= - Indicate whether the specified selectors are identical.
628  bool operator==(Selector RHS) const {
629    return InfoPtr == RHS.InfoPtr;
630  }
631  bool operator!=(Selector RHS) const {
632    return InfoPtr != RHS.InfoPtr;
633  }
634  void *getAsOpaquePtr() const {
635    return reinterpret_cast<void*>(InfoPtr);
636  }
637
638  /// \brief Determine whether this is the empty selector.
639  bool isNull() const { return InfoPtr == 0; }
640
641  // Predicates to identify the selector type.
642  bool isKeywordSelector() const {
643    return getIdentifierInfoFlag() != ZeroArg;
644  }
645  bool isUnarySelector() const {
646    return getIdentifierInfoFlag() == ZeroArg;
647  }
648  unsigned getNumArgs() const;
649
650
651  /// \brief Retrieve the identifier at a given position in the selector.
652  ///
653  /// Note that the identifier pointer returned may be NULL. Clients that only
654  /// care about the text of the identifier string, and not the specific,
655  /// uniqued identifier pointer, should use \c getNameForSlot(), which returns
656  /// an empty string when the identifier pointer would be NULL.
657  ///
658  /// \param argIndex The index for which we want to retrieve the identifier.
659  /// This index shall be less than \c getNumArgs() unless this is a keyword
660  /// selector, in which case 0 is the only permissible value.
661  ///
662  /// \returns the uniqued identifier for this slot, or NULL if this slot has
663  /// no corresponding identifier.
664  IdentifierInfo *getIdentifierInfoForSlot(unsigned argIndex) const;
665
666  /// \brief Retrieve the name at a given position in the selector.
667  ///
668  /// \param argIndex The index for which we want to retrieve the name.
669  /// This index shall be less than \c getNumArgs() unless this is a keyword
670  /// selector, in which case 0 is the only permissible value.
671  ///
672  /// \returns the name for this slot, which may be the empty string if no
673  /// name was supplied.
674  StringRef getNameForSlot(unsigned argIndex) const;
675
676  /// \brief Derive the full selector name (e.g. "foo:bar:") and return
677  /// it as an std::string.
678  // FIXME: Add a print method that uses a raw_ostream.
679  std::string getAsString() const;
680
681  /// \brief Derive the conventional family of this method.
682  ObjCMethodFamily getMethodFamily() const {
683    return getMethodFamilyImpl(*this);
684  }
685
686  static Selector getEmptyMarker() {
687    return Selector(uintptr_t(-1));
688  }
689  static Selector getTombstoneMarker() {
690    return Selector(uintptr_t(-2));
691  }
692};
693
694/// \brief This table allows us to fully hide how we implement
695/// multi-keyword caching.
696class SelectorTable {
697  void *Impl;  // Actually a SelectorTableImpl
698  SelectorTable(const SelectorTable &) LLVM_DELETED_FUNCTION;
699  void operator=(const SelectorTable &) LLVM_DELETED_FUNCTION;
700public:
701  SelectorTable();
702  ~SelectorTable();
703
704  /// \brief Can create any sort of selector.
705  ///
706  /// \p NumArgs indicates whether this is a no argument selector "foo", a
707  /// single argument selector "foo:" or multi-argument "foo:bar:".
708  Selector getSelector(unsigned NumArgs, IdentifierInfo **IIV);
709
710  Selector getUnarySelector(IdentifierInfo *ID) {
711    return Selector(ID, 1);
712  }
713  Selector getNullarySelector(IdentifierInfo *ID) {
714    return Selector(ID, 0);
715  }
716
717  /// \brief Return the total amount of memory allocated for managing selectors.
718  size_t getTotalMemory() const;
719
720  /// \brief Return the setter name for the given identifier.
721  ///
722  /// This is "set" + \p Name where the initial character of \p Name
723  /// has been capitalized.
724  static Selector constructSetterName(IdentifierTable &Idents,
725                                      SelectorTable &SelTable,
726                                      const IdentifierInfo *Name);
727};
728
729/// DeclarationNameExtra - Common base of the MultiKeywordSelector,
730/// CXXSpecialName, and CXXOperatorIdName classes, all of which are
731/// private classes that describe different kinds of names.
732class DeclarationNameExtra {
733public:
734  /// ExtraKind - The kind of "extra" information stored in the
735  /// DeclarationName. See @c ExtraKindOrNumArgs for an explanation of
736  /// how these enumerator values are used.
737  enum ExtraKind {
738    CXXConstructor = 0,
739    CXXDestructor,
740    CXXConversionFunction,
741#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
742    CXXOperator##Name,
743#include "clang/Basic/OperatorKinds.def"
744    CXXLiteralOperator,
745    CXXUsingDirective,
746    NUM_EXTRA_KINDS
747  };
748
749  /// ExtraKindOrNumArgs - Either the kind of C++ special name or
750  /// operator-id (if the value is one of the CXX* enumerators of
751  /// ExtraKind), in which case the DeclarationNameExtra is also a
752  /// CXXSpecialName, (for CXXConstructor, CXXDestructor, or
753  /// CXXConversionFunction) CXXOperatorIdName, or CXXLiteralOperatorName,
754  /// it may be also name common to C++ using-directives (CXXUsingDirective),
755  /// otherwise it is NUM_EXTRA_KINDS+NumArgs, where NumArgs is the number of
756  /// arguments in the Objective-C selector, in which case the
757  /// DeclarationNameExtra is also a MultiKeywordSelector.
758  unsigned ExtraKindOrNumArgs;
759};
760
761}  // end namespace clang
762
763namespace llvm {
764/// Define DenseMapInfo so that Selectors can be used as keys in DenseMap and
765/// DenseSets.
766template <>
767struct DenseMapInfo<clang::Selector> {
768  static inline clang::Selector getEmptyKey() {
769    return clang::Selector::getEmptyMarker();
770  }
771  static inline clang::Selector getTombstoneKey() {
772    return clang::Selector::getTombstoneMarker();
773  }
774
775  static unsigned getHashValue(clang::Selector S);
776
777  static bool isEqual(clang::Selector LHS, clang::Selector RHS) {
778    return LHS == RHS;
779  }
780};
781
782template <>
783struct isPodLike<clang::Selector> { static const bool value = true; };
784
785template<>
786class PointerLikeTypeTraits<clang::Selector> {
787public:
788  static inline const void *getAsVoidPointer(clang::Selector P) {
789    return P.getAsOpaquePtr();
790  }
791  static inline clang::Selector getFromVoidPointer(const void *P) {
792    return clang::Selector(reinterpret_cast<uintptr_t>(P));
793  }
794  enum { NumLowBitsAvailable = 0 };
795};
796
797// Provide PointerLikeTypeTraits for IdentifierInfo pointers, which
798// are not guaranteed to be 8-byte aligned.
799template<>
800class PointerLikeTypeTraits<clang::IdentifierInfo*> {
801public:
802  static inline void *getAsVoidPointer(clang::IdentifierInfo* P) {
803    return P;
804  }
805  static inline clang::IdentifierInfo *getFromVoidPointer(void *P) {
806    return static_cast<clang::IdentifierInfo*>(P);
807  }
808  enum { NumLowBitsAvailable = 1 };
809};
810
811template<>
812class PointerLikeTypeTraits<const clang::IdentifierInfo*> {
813public:
814  static inline const void *getAsVoidPointer(const clang::IdentifierInfo* P) {
815    return P;
816  }
817  static inline const clang::IdentifierInfo *getFromVoidPointer(const void *P) {
818    return static_cast<const clang::IdentifierInfo*>(P);
819  }
820  enum { NumLowBitsAvailable = 1 };
821};
822
823}  // end namespace llvm
824#endif
825