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) {
54 double NewScore =
similarityScore(FileName, Symbol.Symbol.getFilePath()) *
55 (1.0 + std::log2(1 + Symbol.Signals.Seen));
56 double &S = Score[Symbol.Symbol.getFilePath()];
57 S = std::max(S, NewScore);
61 std::sort(Symbols.begin(), Symbols.end(),
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());
96 Symbols.insert(Symbols.end(), Res.begin(), Res.end());
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);
149 rank(MatchedSymbols, FileName);
151 std::vector<SymbolInfo> Res;
152 for (
auto &SymAndSig : MatchedSymbols)
153 Res.push_back(std::move(SymAndSig.Symbol));
static void rank(std::vector< SymbolAndSignals > &Symbols, llvm::StringRef FileName)
const std::vector< SymbolInfo::Context > & getContexts() const
Get symbol contexts.
llvm::Optional< float > Score
clang::find_all_symbols::SymbolInfo SymbolInfo
static double similarityScore(llvm::StringRef FileName, llvm::StringRef Header)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
llvm::StringRef getFilePath() const
Get a relative file path where symbol comes from.
Describes a named symbol from a header.
std::vector< find_all_symbols::SymbolInfo > search(llvm::StringRef Identifier, bool IsNestedSearch=true, llvm::StringRef FileName="") const
Search for header files to be included for an identifier.
SymbolKind getSymbolKind() const
Get symbol type.