11 #include "../../FuzzyMatch.h" 14 #include "llvm/ADT/ArrayRef.h" 15 #include "llvm/ADT/DenseSet.h" 16 #include "llvm/ADT/StringExtras.h" 36 std::vector<CharRole> Roles(Identifier.size());
38 llvm::makeMutableArrayRef(Roles.data(), Identifier.size()));
40 std::string LowercaseIdentifier = Identifier.lower();
51 std::vector<std::array<unsigned, 3>> Next(LowercaseIdentifier.size());
52 unsigned NextTail = 0, NextHead = 0, NextNextHead = 0;
53 for (
int I = LowercaseIdentifier.size() - 1; I >= 0; --I) {
54 Next[I] = {{NextTail, NextHead, NextNextHead}};
55 NextTail = Roles[I] ==
Tail ? I : 0;
56 if (Roles[I] ==
Head) {
57 NextNextHead = NextHead;
62 DenseSet<Token> UniqueTrigrams;
63 std::array<char, 4> Chars;
64 for (
size_t I = 0; I < LowercaseIdentifier.size(); ++I) {
66 if (Roles[I] !=
Head && Roles[I] !=
Tail)
68 for (
const unsigned J : Next[I]) {
71 for (
const unsigned K : Next[J]) {
74 Chars = {{LowercaseIdentifier[I], LowercaseIdentifier[J],
75 LowercaseIdentifier[K], 0}};
76 auto Trigram =
Token(Token::Kind::Trigram, Chars.data());
78 if (!UniqueTrigrams.count(Trigram)) {
79 UniqueTrigrams.insert(Trigram);
85 std::vector<Token> Result;
86 for (
const auto &Trigram : UniqueTrigrams)
87 Result.push_back(Trigram);
96 std::vector<CharRole> Roles(Query.size());
97 calculateRoles(Query, llvm::makeMutableArrayRef(Roles.data(), Query.size()));
99 std::string LowercaseQuery = Query.lower();
101 DenseSet<Token> UniqueTrigrams;
102 std::deque<char> Chars;
104 for (
size_t I = 0; I < LowercaseQuery.size(); ++I) {
106 if (Roles[I] !=
Head && Roles[I] !=
Tail)
109 Chars.push_back(LowercaseQuery[I]);
111 if (Chars.size() > 3)
113 if (Chars.size() == 3) {
115 Token(Token::Kind::Trigram, std::string(begin(Chars), end(Chars)));
117 if (!UniqueTrigrams.count(Trigram)) {
118 UniqueTrigrams.insert(Trigram);
123 std::vector<Token> Result;
124 for (
const auto &Trigram : UniqueTrigrams)
125 Result.push_back(Trigram);
Some operations such as code completion produce a set of candidates.
std::vector< Token > generateIdentifierTrigrams(llvm::StringRef Identifier)
Returns list of unique fuzzy-search trigrams from unqualified symbol.
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.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
CharTypeSet calculateRoles(StringRef Text, MutableArrayRef< CharRole > Roles)