1 | //===-- YamlSymbolIndex.cpp -----------------------------------------------===// |
---|---|
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 | #include "YamlSymbolIndex.h" |
10 | #include "llvm/ADT/SmallVector.h" |
11 | #include "llvm/Support/Errc.h" |
12 | #include "llvm/Support/FileSystem.h" |
13 | #include "llvm/Support/MemoryBuffer.h" |
14 | #include "llvm/Support/Path.h" |
15 | #include <string> |
16 | #include <vector> |
17 | |
18 | using clang::find_all_symbols::SymbolAndSignals; |
19 | |
20 | namespace clang { |
21 | namespace include_fixer { |
22 | |
23 | llvm::ErrorOr<std::unique_ptr<YamlSymbolIndex>> |
24 | YamlSymbolIndex::createFromFile(llvm::StringRef FilePath) { |
25 | auto Buffer = llvm::MemoryBuffer::getFile(Filename: FilePath); |
26 | if (!Buffer) |
27 | return Buffer.getError(); |
28 | |
29 | return std::unique_ptr<YamlSymbolIndex>(new YamlSymbolIndex( |
30 | find_all_symbols::ReadSymbolInfosFromYAML(Yaml: Buffer.get()->getBuffer()))); |
31 | } |
32 | |
33 | llvm::ErrorOr<std::unique_ptr<YamlSymbolIndex>> |
34 | YamlSymbolIndex::createFromDirectory(llvm::StringRef Directory, |
35 | llvm::StringRef Name) { |
36 | // Walk upwards from Directory, looking for files. |
37 | for (llvm::SmallString<128> PathStorage = Directory; !Directory.empty(); |
38 | Directory = llvm::sys::path::parent_path(path: Directory)) { |
39 | assert(Directory.size() <= PathStorage.size()); |
40 | PathStorage.resize(N: Directory.size()); // Shrink to parent. |
41 | llvm::sys::path::append(path&: PathStorage, a: Name); |
42 | if (auto DB = createFromFile(FilePath: PathStorage)) |
43 | return DB; |
44 | } |
45 | return llvm::make_error_code(E: llvm::errc::no_such_file_or_directory); |
46 | } |
47 | |
48 | std::vector<SymbolAndSignals> |
49 | YamlSymbolIndex::search(llvm::StringRef Identifier) { |
50 | std::vector<SymbolAndSignals> Results; |
51 | for (const auto &Symbol : Symbols) { |
52 | if (Symbol.Symbol.getName() == Identifier) |
53 | Results.push_back(x: Symbol); |
54 | } |
55 | return Results; |
56 | } |
57 | |
58 | } // namespace include_fixer |
59 | } // namespace clang |
60 |