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 LLVM_CLANG_TOOLS_EXTRA_INCLUDE_FIXER_FUZZY_SYMBOL_INDEX_H 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