]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/tools/clang/lib/Index/GlobalSelector.cpp
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / llvm / tools / clang / lib / Index / GlobalSelector.cpp
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.
22 Selector GlobalSelector::getSelector(ASTContext &AST) const {
23   if (isInvalid())
24     return Selector();
25
26   Selector GlobSel = Selector(reinterpret_cast<uintptr_t>(Val));
27
28   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.
40 std::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.
49 GlobalSelector GlobalSelector::get(Selector Sel, Program &Prog) {
50   if (Sel.isNull())
51     return GlobalSelector();
52
53   ProgramImpl &ProgImpl = *static_cast<ProgramImpl*>(Prog.Impl);
54
55   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
69 llvm::DenseMapInfo<GlobalSelector>::getHashValue(GlobalSelector Sel) {
70   return DenseMapInfo<void*>::getHashValue(Sel.getAsOpaquePtr());
71 }