11 #include "llvm/ADT/DenseMap.h"
12 #include "llvm/ADT/SmallVector.h"
13 #include "llvm/Support/Debug.h"
14 #include "llvm/Support/Path.h"
16 #define DEBUG_TYPE "clang-include-fixer"
19 namespace include_fixer {
22 using find_all_symbols::SymbolAndSignals;
27 llvm::StringRef Header) {
34 for (
auto FileI = llvm::sys::path::begin(
FileName),
35 FileE = llvm::sys::path::end(
FileName);
36 FileI != FileE; ++FileI) {
38 for (
auto HeaderI = llvm::sys::path::begin(Header),
39 HeaderE = llvm::sys::path::end(Header), I = FileI;
40 HeaderI != HeaderE && *I == *HeaderI && I != FileE; ++I, ++HeaderI) {
43 MaxSegments = std::max(Segments, MaxSegments);
50 llvm::DenseMap<llvm::StringRef, double>
Score;
51 for (
const auto &Symbol :
Symbols) {
55 (1.0 + std::log2(1 + Symbol.Signals.Seen));
56 double &S =
Score[Symbol.Symbol.getFilePath()];
57 S = std::max(S, NewScore);
64 auto BS =
Score[B.Symbol.getFilePath()];
71 std::vector<find_all_symbols::SymbolInfo>
77 llvm::SmallVector<llvm::StringRef, 8> Names;
78 Identifier.split(Names,
"::");
80 bool IsFullyQualified =
false;
81 if (Identifier.startswith(
"::")) {
82 Names.erase(Names.begin());
83 IsFullyQualified =
true;
90 bool TookPrefix =
false;
91 std::vector<SymbolAndSignals> MatchedSymbols;
93 std::vector<SymbolAndSignals>
Symbols;
94 for (
const auto &DB : SymbolIndices) {
95 auto Res = DB.get()->search(Names.back());
99 LLVM_DEBUG(llvm::dbgs() <<
"Searching " << Names.back() <<
"... got "
100 <<
Symbols.size() <<
" results...\n");
102 for (
auto &SymAndSig :
Symbols) {
105 bool IsMatched =
true;
107 auto IdentiferContext = Names.rbegin() + 1;
109 while (IdentiferContext != Names.rend() &&
111 if (SymbolContext->second == *IdentiferContext) {
114 }
else if (SymbolContext->first ==
126 if (IsFullyQualified)
127 IsMatched &= (SymbolContext == Symbol.
getContexts().end());
131 if (IsMatched && IdentiferContext == Names.rend()) {
142 MatchedSymbols.push_back(std::move(SymAndSig));
147 }
while (MatchedSymbols.empty() && !Names.empty() && IsNestedSearch);
151 std::vector<SymbolInfo> Res;
152 for (
auto &SymAndSig : MatchedSymbols)
153 Res.push_back(std::move(SymAndSig.Symbol));