31 llvm::StringRef Header) {
38 for (
auto FileI = llvm::sys::path::begin(FileName),
39 FileE = llvm::sys::path::end(FileName);
40 FileI != FileE; ++FileI) {
42 for (
auto HeaderI = llvm::sys::path::begin(Header),
43 HeaderE = llvm::sys::path::end(Header), I = FileI;
44 HeaderI != HeaderE && *I == *HeaderI && I != FileE; ++I, ++HeaderI) {
47 MaxSegments = std::max(Segments, MaxSegments);
52static void rank(std::vector<SymbolAndSignals> &Symbols,
53 llvm::StringRef FileName) {
54 llvm::StringMap<double> Score;
55 for (
const auto &Symbol : Symbols) {
58 double NewScore =
similarityScore(FileName, Symbol.Symbol.getFilePath()) *
59 (1.0 + std::log2(1 + Symbol.Signals.Seen));
60 double &S = Score[Symbol.Symbol.getFilePath()];
61 S = std::max(S, NewScore);
67 auto AS = Score[A.Symbol.getFilePath()];
68 auto BS = Score[B.Symbol.getFilePath()];
71 return A.Symbol.getFilePath() < B.Symbol.getFilePath();
78 llvm::StringRef FileName)
const {
81 llvm::SmallVector<llvm::StringRef, 8> Names;
82 Identifier.split(Names,
"::");
84 bool IsFullyQualified =
false;
85 if (Identifier.starts_with(
"::")) {
86 Names.erase(Names.begin());
87 IsFullyQualified =
true;
94 bool TookPrefix =
false;
95 std::vector<SymbolAndSignals> MatchedSymbols;
97 std::vector<SymbolAndSignals> Symbols;
98 for (
const auto &DB : SymbolIndices) {
99 auto Res = DB.get()->search(Names.back());
100 Symbols.insert(Symbols.end(), Res.begin(), Res.end());
103 LLVM_DEBUG(llvm::dbgs() <<
"Searching " << Names.back() <<
"... got "
104 << Symbols.size() <<
" results...\n");
106 for (
auto &SymAndSig : Symbols) {
109 bool IsMatched =
true;
111 auto IdentiferContext = Names.rbegin() + 1;
113 while (IdentiferContext != Names.rend() &&
114 SymbolContext != Symbol.getContexts().end()) {
115 if (SymbolContext->second == *IdentiferContext) {
118 }
else if (SymbolContext->first ==
130 if (IsFullyQualified)
131 IsMatched &= (SymbolContext == Symbol.getContexts().end());
135 if (IsMatched && IdentiferContext == Names.rend()) {
141 Symbol.getSymbolKind() ==
146 MatchedSymbols.push_back(std::move(SymAndSig));
151 }
while (MatchedSymbols.empty() && !Names.empty() && IsNestedSearch);
153 rank(MatchedSymbols, FileName);
155 std::vector<SymbolInfo> Res;
156 Res.reserve(MatchedSymbols.size());
157 for (
auto &SymAndSig : MatchedSymbols)
158 Res.push_back(std::move(SymAndSig.Symbol));