1 //===-- GlobalSelector.cpp - Cross-translation-unit "token" for selectors -===// 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 // GlobalSelector is a ASTContext-independent way to refer to selectors. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Index/GlobalSelector.h" 15 #include "ProgramImpl.h" 16 #include "clang/Index/Program.h" 17 #include "clang/AST/ASTContext.h" 18 using namespace clang; 19 using namespace idx; 20 21 /// \brief Get the ASTContext-specific selector. getSelector(ASTContext & AST) const22Selector GlobalSelector::getSelector(ASTContext &AST) const { 23 if (isInvalid()) 24 return Selector(); 25 26 Selector GlobSel = Selector(reinterpret_cast<uintptr_t>(Val)); 27 28 llvm::SmallVector<IdentifierInfo *, 8> Ids; 29 for (unsigned i = 0, e = GlobSel.isUnarySelector() ? 1 : GlobSel.getNumArgs(); 30 i != e; ++i) { 31 IdentifierInfo *GlobII = GlobSel.getIdentifierInfoForSlot(i); 32 IdentifierInfo *II = &AST.Idents.get(GlobII->getName()); 33 Ids.push_back(II); 34 } 35 36 return AST.Selectors.getSelector(GlobSel.getNumArgs(), Ids.data()); 37 } 38 39 /// \brief Get a printable name for debugging purpose. getPrintableName() const40std::string GlobalSelector::getPrintableName() const { 41 if (isInvalid()) 42 return "<< Invalid >>"; 43 44 Selector GlobSel = Selector(reinterpret_cast<uintptr_t>(Val)); 45 return GlobSel.getAsString(); 46 } 47 48 /// \brief Get a GlobalSelector for the ASTContext-specific selector. get(Selector Sel,Program & Prog)49GlobalSelector GlobalSelector::get(Selector Sel, Program &Prog) { 50 if (Sel.isNull()) 51 return GlobalSelector(); 52 53 ProgramImpl &ProgImpl = *static_cast<ProgramImpl*>(Prog.Impl); 54 55 llvm::SmallVector<IdentifierInfo *, 8> Ids; 56 for (unsigned i = 0, e = Sel.isUnarySelector() ? 1 : Sel.getNumArgs(); 57 i != e; ++i) { 58 IdentifierInfo *II = Sel.getIdentifierInfoForSlot(i); 59 IdentifierInfo *GlobII = &ProgImpl.getIdents().get(II->getName()); 60 Ids.push_back(GlobII); 61 } 62 63 Selector GlobSel = ProgImpl.getSelectors().getSelector(Sel.getNumArgs(), 64 Ids.data()); 65 return GlobalSelector(GlobSel.getAsOpaquePtr()); 66 } 67 68 unsigned getHashValue(GlobalSelector Sel)69llvm::DenseMapInfo<GlobalSelector>::getHashValue(GlobalSelector Sel) { 70 return DenseMapInfo<void*>::getHashValue(Sel.getAsOpaquePtr()); 71 } 72