10b57cec5SDimitry Andric //===- DirectoryScanner.cpp - Utility functions for DirectoryWatcher ------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "DirectoryScanner.h" 100b57cec5SDimitry Andric 110b57cec5SDimitry Andric #include "llvm/Support/Path.h" 12*bdd1243dSDimitry Andric #include <optional> 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric namespace clang { 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric using namespace llvm; 170b57cec5SDimitry Andric getFileStatus(StringRef Path)18*bdd1243dSDimitry Andricstd::optional<sys::fs::file_status> getFileStatus(StringRef Path) { 190b57cec5SDimitry Andric sys::fs::file_status Status; 200b57cec5SDimitry Andric std::error_code EC = status(Path, Status); 210b57cec5SDimitry Andric if (EC) 22*bdd1243dSDimitry Andric return std::nullopt; 230b57cec5SDimitry Andric return Status; 240b57cec5SDimitry Andric } 250b57cec5SDimitry Andric scanDirectory(StringRef Path)260b57cec5SDimitry Andricstd::vector<std::string> scanDirectory(StringRef Path) { 270b57cec5SDimitry Andric using namespace llvm::sys; 280b57cec5SDimitry Andric std::vector<std::string> Result; 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric std::error_code EC; 310b57cec5SDimitry Andric for (auto It = fs::directory_iterator(Path, EC), 320b57cec5SDimitry Andric End = fs::directory_iterator(); 330b57cec5SDimitry Andric !EC && It != End; It.increment(EC)) { 340b57cec5SDimitry Andric auto status = getFileStatus(It->path()); 3581ad6265SDimitry Andric if (!status) 360b57cec5SDimitry Andric continue; 370b57cec5SDimitry Andric Result.emplace_back(sys::path::filename(It->path())); 380b57cec5SDimitry Andric } 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric return Result; 410b57cec5SDimitry Andric } 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric std::vector<DirectoryWatcher::Event> getAsFileEvents(const std::vector<std::string> & Scan)440b57cec5SDimitry AndricgetAsFileEvents(const std::vector<std::string> &Scan) { 450b57cec5SDimitry Andric std::vector<DirectoryWatcher::Event> Events; 460b57cec5SDimitry Andric Events.reserve(Scan.size()); 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric for (const auto &File : Scan) { 490b57cec5SDimitry Andric Events.emplace_back(DirectoryWatcher::Event{ 500b57cec5SDimitry Andric DirectoryWatcher::Event::EventKind::Modified, File}); 510b57cec5SDimitry Andric } 520b57cec5SDimitry Andric return Events; 530b57cec5SDimitry Andric } 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric } // namespace clang 56