1 | //===--- FuzzySymbolIndex.h - Lookup symbols for autocomplete ---*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_CLANG_TOOLS_EXTRA_INCLUDE_FIXER_FUZZY_SYMBOL_INDEX_H |
10 | #define |
11 | |
12 | #include "SymbolIndex.h" |
13 | #include "find-all-symbols/SymbolInfo.h" |
14 | #include "llvm/ADT/SmallString.h" |
15 | #include "llvm/ADT/StringRef.h" |
16 | #include "llvm/Support/Error.h" |
17 | #include <string> |
18 | #include <vector> |
19 | |
20 | namespace clang { |
21 | namespace include_fixer { |
22 | |
23 | // A FuzzySymbolIndex retrieves top-level symbols matching a query string. |
24 | // |
25 | // It refines the contract of SymbolIndex::search to do fuzzy matching: |
26 | // - symbol names are tokenized: "unique ptr", "string ref". |
27 | // - query must match prefixes of symbol tokens: [upt] |
28 | // - if the query has multiple tokens, splits must match: [StR], not [STr]. |
29 | // Helpers for tokenization and regex matching are provided. |
30 | // |
31 | // Implementations may choose to truncate results, refuse short queries, etc. |
32 | class FuzzySymbolIndex : public SymbolIndex { |
33 | public: |
34 | // Loads the specified clang-include-fixer database and returns an index serving it. |
35 | static llvm::Expected<std::unique_ptr<FuzzySymbolIndex>> |
36 | createFromYAML(llvm::StringRef File); |
37 | |
38 | // Helpers for implementing indexes: |
39 | |
40 | // Transforms a symbol name or query into a sequence of tokens. |
41 | // - URLHandlerCallback --> [url, handler, callback] |
42 | // - snake_case11 --> [snake, case, 11] |
43 | // - _WTF$ --> [wtf] |
44 | static std::vector<std::string> tokenize(llvm::StringRef Text); |
45 | |
46 | // Transforms query tokens into an unanchored regexp to match symbol tokens. |
47 | // - [fe f] --> /f(\w* )?e\w* f/, matches [fee fie foe]. |
48 | static std::string queryRegexp(const std::vector<std::string> &Tokens); |
49 | }; |
50 | |
51 | } // namespace include_fixer |
52 | } // namespace clang |
53 | |
54 | #endif // LLVM_CLANG_TOOLS_EXTRA_INCLUDE_FIXER_FUZZY_SYMBOL_INDEX_H |
55 | |