13 #include "llvm/ADT/ArrayRef.h" 14 #include "llvm/ADT/DenseSet.h" 15 #include "llvm/ADT/StringExtras.h" 26 std::vector<CharRole> Roles(Identifier.size());
28 llvm::makeMutableArrayRef(Roles.data(), Identifier.size()));
30 std::string LowercaseIdentifier = Identifier.lower();
40 std::vector<std::array<unsigned, 3>> Next(LowercaseIdentifier.size());
41 unsigned NextTail = 0, NextHead = 0;
42 for (
int I = LowercaseIdentifier.size() - 1; I >= 0; --I) {
43 Next[I] = {{NextTail, NextHead}};
44 NextTail = Roles[I] ==
Tail ? I : 0;
45 if (Roles[I] ==
Head) {
50 llvm::DenseSet<Token> UniqueTrigrams;
52 auto Add = [&](std::string Chars) {
58 for (
size_t I = 0; I < LowercaseIdentifier.size(); ++I) {
60 if (Roles[I] !=
Head && Roles[I] !=
Tail)
62 for (
const unsigned J : Next[I]) {
65 for (
const unsigned K : Next[J]) {
68 Add({{LowercaseIdentifier[I], LowercaseIdentifier[J],
69 LowercaseIdentifier[K]}});
74 if (!LowercaseIdentifier.empty())
75 Add({LowercaseIdentifier[0]});
76 if (LowercaseIdentifier.size() >= 2)
77 Add({LowercaseIdentifier[0], LowercaseIdentifier[1]});
78 for (
size_t I = 1; I < LowercaseIdentifier.size(); ++I)
79 if (Roles[I] ==
Head) {
80 Add({LowercaseIdentifier[0], LowercaseIdentifier[I]});
84 return {UniqueTrigrams.begin(), UniqueTrigrams.end()};
90 std::string LowercaseQuery = Query.lower();
95 std::vector<CharRole> Roles(Query.size());
96 calculateRoles(Query, llvm::makeMutableArrayRef(Roles.data(), Query.size()));
98 llvm::DenseSet<Token> UniqueTrigrams;
100 for (
unsigned I = 0; I < Query.size(); ++I) {
101 if (Roles[I] !=
Head && Roles[I] !=
Tail)
103 Chars.push_back(LowercaseQuery[I]);
104 if (Chars.size() > 3)
105 Chars.erase(Chars.begin());
106 if (Chars.size() == 3)
110 return {UniqueTrigrams.begin(), UniqueTrigrams.end()};
std::vector< Token > generateIdentifierTrigrams(llvm::StringRef Identifier)
Returns list of unique fuzzy-search trigrams from unqualified symbol.
Represents trigram used for fuzzy search of unqualified symbol names.
A Token represents an attribute of a symbol, such as a particular trigram present in the name (used f...
std::vector< Token > generateQueryTrigrams(llvm::StringRef Query)
Returns list of unique fuzzy-search trigrams given a query.
CharTypeSet calculateRoles(llvm::StringRef Text, llvm::MutableArrayRef< CharRole > Roles)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Trigrams are attributes of the symbol unqualified name used to effectively extract symbols which can ...
Token objects represent a characteristic of a symbol, which can be used to perform efficient search...