[AMDGPU][AsmParser][NFC] Translate parsed MIMG instructions to MCInsts automatically.
[llvm-project.git] / clang-tools-extra / clangd / unittests / TestFS.h
blob6bdadc9c07439d8d1c12ad4a19486d01987bf737
1 //===-- TestFS.h ------------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Allows setting up fake filesystem environments for tests.
11 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_TESTFS_H
13 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_TESTFS_H
14 #include "GlobalCompilationDatabase.h"
15 #include "support/Path.h"
16 #include "support/ThreadsafeFS.h"
17 #include "llvm/ADT/IntrusiveRefCntPtr.h"
18 #include "llvm/Support/Path.h"
19 #include "llvm/Support/VirtualFileSystem.h"
20 #include <optional>
22 namespace clang {
23 namespace clangd {
25 // Builds a VFS that provides access to the provided files, plus temporary
26 // directories.
27 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>
28 buildTestFS(llvm::StringMap<std::string> const &Files,
29 llvm::StringMap<time_t> const &Timestamps = {});
31 // A VFS provider that returns TestFSes containing a provided set of files.
32 class MockFS : public ThreadsafeFS {
33 public:
34 IntrusiveRefCntPtr<llvm::vfs::FileSystem> viewImpl() const override {
35 auto MemFS = buildTestFS(Files, Timestamps);
36 if (!OverlayRealFileSystemForModules)
37 return MemFS;
38 llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> OverlayFileSystem =
39 new llvm::vfs::OverlayFileSystem(llvm::vfs::getRealFileSystem());
40 OverlayFileSystem->pushOverlay(MemFS);
41 return OverlayFileSystem;
44 // If relative paths are used, they are resolved with testPath().
45 llvm::StringMap<std::string> Files;
46 llvm::StringMap<time_t> Timestamps;
47 // If true, real file system will be used as fallback for the in-memory one.
48 // This is useful for testing module support.
49 bool OverlayRealFileSystemForModules = false;
52 // A Compilation database that returns a fixed set of compile flags.
53 class MockCompilationDatabase : public GlobalCompilationDatabase {
54 public:
55 /// If \p Directory is not empty, use that as the Directory field of the
56 /// CompileCommand, and as project SourceRoot.
57 ///
58 /// If \p RelPathPrefix is not empty, use that as a prefix in front of the
59 /// source file name, instead of using an absolute path.
60 MockCompilationDatabase(StringRef Directory = StringRef(),
61 StringRef RelPathPrefix = StringRef());
63 std::optional<tooling::CompileCommand>
64 getCompileCommand(PathRef File) const override;
66 std::optional<ProjectInfo> getProjectInfo(PathRef File) const override;
68 std::vector<std::string> ExtraClangFlags;
70 private:
71 StringRef Directory;
72 StringRef RelPathPrefix;
75 // Returns an absolute (fake) test directory for this OS.
76 const char *testRoot();
78 // Returns a suitable absolute path for this OS.
79 std::string testPath(PathRef File,
80 llvm::sys::path::Style = llvm::sys::path::Style::native);
82 // unittest: is a scheme that refers to files relative to testRoot()
83 // This anchor is used to force the linker to link in the generated object file
84 // and thus register unittest: URI scheme plugin.
85 extern volatile int UnittestSchemeAnchorSource;
87 } // namespace clangd
88 } // namespace clang
89 #endif