12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/ADT/DenseSet.h" 14 #include "llvm/ADT/StringExtras.h" 25 std::vector<CharRole> Roles(Identifier.size());
27 llvm::makeMutableArrayRef(Roles.data(), Identifier.size()));
29 std::string LowercaseIdentifier = Identifier.lower();
39 std::vector<std::array<unsigned, 3>> Next(LowercaseIdentifier.size());
40 unsigned NextTail = 0, NextHead = 0;
41 for (
int I = LowercaseIdentifier.size() - 1; I >= 0; --I) {
42 Next[I] = {{NextTail, NextHead}};
43 NextTail = Roles[I] ==
Tail ? I : 0;
44 if (Roles[I] ==
Head) {
49 llvm::DenseSet<Token> UniqueTrigrams;
51 auto Add = [&](std::string Chars) {
57 for (
size_t I = 0; I < LowercaseIdentifier.size(); ++I) {
59 if (Roles[I] !=
Head && Roles[I] !=
Tail)
61 for (
const unsigned J : Next[I]) {
64 for (
const unsigned K : Next[J]) {
67 Add({{LowercaseIdentifier[I], LowercaseIdentifier[J],
68 LowercaseIdentifier[K]}});
73 if (!LowercaseIdentifier.empty())
74 Add({LowercaseIdentifier[0]});
75 if (LowercaseIdentifier.size() >= 2)
76 Add({LowercaseIdentifier[0], LowercaseIdentifier[1]});
77 for (
size_t I = 1; I < LowercaseIdentifier.size(); ++I)
78 if (Roles[I] ==
Head) {
79 Add({LowercaseIdentifier[0], LowercaseIdentifier[I]});
83 return {UniqueTrigrams.begin(), UniqueTrigrams.end()};
89 std::string LowercaseQuery = Query.lower();
94 std::vector<CharRole> Roles(Query.size());
95 calculateRoles(Query, llvm::makeMutableArrayRef(Roles.data(), Query.size()));
97 llvm::DenseSet<Token> UniqueTrigrams;
99 for (
unsigned I = 0; I < Query.size(); ++I) {
100 if (Roles[I] !=
Head && Roles[I] !=
Tail)
102 Chars.push_back(LowercaseQuery[I]);
103 if (Chars.size() > 3)
104 Chars.erase(Chars.begin());
105 if (Chars.size() == 3)
109 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.
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 ...
A Token represents an attribute of a symbol, such as a particular trigram present in the name (used f...
Token objects represent a characteristic of a symbol, which can be used to perform efficient search...