| //===-- YamlSymbolIndex.cpp -----------------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "YamlSymbolIndex.h" |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/Support/Errc.h" |
| #include "llvm/Support/FileSystem.h" |
| #include "llvm/Support/MemoryBuffer.h" |
| #include "llvm/Support/Path.h" |
| #include <string> |
| #include <vector> |
| |
| using clang::find_all_symbols::SymbolInfo; |
| using clang::find_all_symbols::SymbolAndSignals; |
| |
| namespace clang { |
| namespace include_fixer { |
| |
| llvm::ErrorOr<std::unique_ptr<YamlSymbolIndex>> |
| YamlSymbolIndex::createFromFile(llvm::StringRef FilePath) { |
| auto Buffer = llvm::MemoryBuffer::getFile(FilePath); |
| if (!Buffer) |
| return Buffer.getError(); |
| |
| return std::unique_ptr<YamlSymbolIndex>(new YamlSymbolIndex( |
| find_all_symbols::ReadSymbolInfosFromYAML(Buffer.get()->getBuffer()))); |
| } |
| |
| llvm::ErrorOr<std::unique_ptr<YamlSymbolIndex>> |
| YamlSymbolIndex::createFromDirectory(llvm::StringRef Directory, |
| llvm::StringRef Name) { |
| // Walk upwards from Directory, looking for files. |
| for (llvm::SmallString<128> PathStorage = Directory; !Directory.empty(); |
| Directory = llvm::sys::path::parent_path(Directory)) { |
| assert(Directory.size() <= PathStorage.size()); |
| PathStorage.resize(Directory.size()); // Shrink to parent. |
| llvm::sys::path::append(PathStorage, Name); |
| if (auto DB = createFromFile(PathStorage)) |
| return DB; |
| } |
| return llvm::make_error_code(llvm::errc::no_such_file_or_directory); |
| } |
| |
| std::vector<SymbolAndSignals> |
| YamlSymbolIndex::search(llvm::StringRef Identifier) { |
| std::vector<SymbolAndSignals> Results; |
| for (const auto &Symbol : Symbols) { |
| if (Symbol.Symbol.getName() == Identifier) |
| Results.push_back(Symbol); |
| } |
| return Results; |
| } |
| |
| } // namespace include_fixer |
| } // namespace clang |