1e5dd7070Spatrick //===- DirectoryScanner.cpp - Utility functions for DirectoryWatcher ------===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick 9e5dd7070Spatrick #include "DirectoryScanner.h" 10e5dd7070Spatrick 11e5dd7070Spatrick #include "llvm/Support/Path.h" 12*12c85518Srobert #include <optional> 13e5dd7070Spatrick 14e5dd7070Spatrick namespace clang { 15e5dd7070Spatrick 16e5dd7070Spatrick using namespace llvm; 17e5dd7070Spatrick getFileStatus(StringRef Path)18*12c85518Srobertstd::optional<sys::fs::file_status> getFileStatus(StringRef Path) { 19e5dd7070Spatrick sys::fs::file_status Status; 20e5dd7070Spatrick std::error_code EC = status(Path, Status); 21e5dd7070Spatrick if (EC) 22*12c85518Srobert return std::nullopt; 23e5dd7070Spatrick return Status; 24e5dd7070Spatrick } 25e5dd7070Spatrick scanDirectory(StringRef Path)26e5dd7070Spatrickstd::vector<std::string> scanDirectory(StringRef Path) { 27e5dd7070Spatrick using namespace llvm::sys; 28e5dd7070Spatrick std::vector<std::string> Result; 29e5dd7070Spatrick 30e5dd7070Spatrick std::error_code EC; 31e5dd7070Spatrick for (auto It = fs::directory_iterator(Path, EC), 32e5dd7070Spatrick End = fs::directory_iterator(); 33e5dd7070Spatrick !EC && It != End; It.increment(EC)) { 34e5dd7070Spatrick auto status = getFileStatus(It->path()); 35*12c85518Srobert if (!status) 36e5dd7070Spatrick continue; 37e5dd7070Spatrick Result.emplace_back(sys::path::filename(It->path())); 38e5dd7070Spatrick } 39e5dd7070Spatrick 40e5dd7070Spatrick return Result; 41e5dd7070Spatrick } 42e5dd7070Spatrick 43e5dd7070Spatrick std::vector<DirectoryWatcher::Event> getAsFileEvents(const std::vector<std::string> & Scan)44e5dd7070SpatrickgetAsFileEvents(const std::vector<std::string> &Scan) { 45e5dd7070Spatrick std::vector<DirectoryWatcher::Event> Events; 46e5dd7070Spatrick Events.reserve(Scan.size()); 47e5dd7070Spatrick 48e5dd7070Spatrick for (const auto &File : Scan) { 49e5dd7070Spatrick Events.emplace_back(DirectoryWatcher::Event{ 50e5dd7070Spatrick DirectoryWatcher::Event::EventKind::Modified, File}); 51e5dd7070Spatrick } 52e5dd7070Spatrick return Events; 53e5dd7070Spatrick } 54e5dd7070Spatrick 55e5dd7070Spatrick } // namespace clang 56