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
18using clang::find_all_symbols::SymbolAndSignals;
19
20namespace clang {
21namespace include_fixer {
22
23llvm::ErrorOr<std::unique_ptr<YamlSymbolIndex>>
24YamlSymbolIndex::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
33llvm::ErrorOr<std::unique_ptr<YamlSymbolIndex>>
34YamlSymbolIndex::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
48std::vector<SymbolAndSignals>
49YamlSymbolIndex::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

source code of clang-tools-extra/clang-include-fixer/YamlSymbolIndex.cpp