177dd8a79SJan Korous //===- DirectoryScanner.cpp - Utility functions for DirectoryWatcher ------===//
277dd8a79SJan Korous //
377dd8a79SJan Korous // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
477dd8a79SJan Korous // See https://llvm.org/LICENSE.txt for license information.
577dd8a79SJan Korous // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
677dd8a79SJan Korous //
777dd8a79SJan Korous //===----------------------------------------------------------------------===//
877dd8a79SJan Korous 
977dd8a79SJan Korous #include "DirectoryScanner.h"
1077dd8a79SJan Korous 
1177dd8a79SJan Korous #include "llvm/Support/Path.h"
1277dd8a79SJan Korous 
1377dd8a79SJan Korous namespace clang {
1477dd8a79SJan Korous 
1577dd8a79SJan Korous using namespace llvm;
1677dd8a79SJan Korous 
getFileStatus(StringRef Path)1777dd8a79SJan Korous Optional<sys::fs::file_status> getFileStatus(StringRef Path) {
1877dd8a79SJan Korous   sys::fs::file_status Status;
1977dd8a79SJan Korous   std::error_code EC = status(Path, Status);
2077dd8a79SJan Korous   if (EC)
2177dd8a79SJan Korous     return None;
2277dd8a79SJan Korous   return Status;
2377dd8a79SJan Korous }
2477dd8a79SJan Korous 
scanDirectory(StringRef Path)2577dd8a79SJan Korous std::vector<std::string> scanDirectory(StringRef Path) {
2677dd8a79SJan Korous   using namespace llvm::sys;
2777dd8a79SJan Korous   std::vector<std::string> Result;
2877dd8a79SJan Korous 
2977dd8a79SJan Korous   std::error_code EC;
3077dd8a79SJan Korous   for (auto It = fs::directory_iterator(Path, EC),
3177dd8a79SJan Korous             End = fs::directory_iterator();
3277dd8a79SJan Korous        !EC && It != End; It.increment(EC)) {
3377dd8a79SJan Korous     auto status = getFileStatus(It->path());
34*452db157SKazu Hirata     if (!status)
3577dd8a79SJan Korous       continue;
3677dd8a79SJan Korous     Result.emplace_back(sys::path::filename(It->path()));
3777dd8a79SJan Korous   }
3877dd8a79SJan Korous 
3977dd8a79SJan Korous   return Result;
4077dd8a79SJan Korous }
4177dd8a79SJan Korous 
4277dd8a79SJan Korous std::vector<DirectoryWatcher::Event>
getAsFileEvents(const std::vector<std::string> & Scan)4377dd8a79SJan Korous getAsFileEvents(const std::vector<std::string> &Scan) {
4477dd8a79SJan Korous   std::vector<DirectoryWatcher::Event> Events;
4577dd8a79SJan Korous   Events.reserve(Scan.size());
4677dd8a79SJan Korous 
4777dd8a79SJan Korous   for (const auto &File : Scan) {
4877dd8a79SJan Korous     Events.emplace_back(DirectoryWatcher::Event{
4977dd8a79SJan Korous         DirectoryWatcher::Event::EventKind::Modified, File});
5077dd8a79SJan Korous   }
5177dd8a79SJan Korous   return Events;
5277dd8a79SJan Korous }
5377dd8a79SJan Korous 
5477dd8a79SJan Korous } // namespace clang
55