16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/StringMap.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/Support/Path.h"
30 mutable llvm::SmallVector<CompiledFragment, 1> CachedValue;
31 std::string Directory;
38 std::chrono::steady_clock::time_point FreshTime,
bool Trusted,
39 std::vector<CompiledFragment> &
Out)
const {
42 [&](llvm::Optional<llvm::StringRef> Data) {
48 CachedValue.push_back(std::move(
Fragment).compile(DC));
51 [&]() { llvm::copy(CachedValue, std::back_inserter(
Out)); });
59 class AbsFileProvider :
public Provider {
64 std::vector<CompiledFragment>
66 std::vector<CompiledFragment> Result;
72 AbsFileProvider(llvm::StringRef
Path, llvm::StringRef
Directory,
75 assert(llvm::sys::path::is_absolute(
Path));
82 std::unique_ptr<Provider>
85 class RelFileProvider :
public Provider {
90 mutable std::mutex Mu;
94 mutable llvm::StringMap<FileConfigCache> Cache;
96 std::vector<CompiledFragment>
98 namespace path = llvm::sys::path;
104 llvm::SmallVector<llvm::StringRef, 8> Ancestors;
107 Ancestors.emplace_back(Ancestor);
110 llvm::SmallVector<FileConfigCache *, 8> Caches;
112 std::lock_guard<std::mutex> Lock(Mu);
113 for (llvm::StringRef Ancestor : Ancestors) {
114 auto It = Cache.find(Ancestor);
116 if (It == Cache.end()) {
117 llvm::SmallString<256> ConfigPath = Ancestor;
118 path::append(ConfigPath, RelPath);
120 llvm::sys::path::native(ConfigPath);
121 It = Cache.try_emplace(Ancestor, ConfigPath.str(), Ancestor).first;
123 Caches.push_back(&It->second);
128 std::vector<CompiledFragment> Result;
135 RelFileProvider(llvm::StringRef RelPath,
const ThreadsafeFS &FS,
138 assert(llvm::sys::path::is_relative(RelPath));
142 return std::make_unique<RelFileProvider>(RelPath, FS,
Trusted);
145 std::unique_ptr<Provider>
147 class CombinedProvider :
public Provider {
148 std::vector<const Provider *> Providers;
150 std::vector<CompiledFragment>
152 std::vector<CompiledFragment> Result;
153 for (
const auto &
Provider : Providers) {
155 Result.push_back(std::move(
Fragment));
161 CombinedProvider(std::vector<const Provider *> Providers)
162 : Providers(std::move(Providers)) {}
165 return std::make_unique<CombinedProvider>(std::move(Providers));
173 for (
const auto &
Fragment : getFragments(P, DC))