clang-tools  15.0.0git
TestFS.h
Go to the documentation of this file.
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.
10 //
11 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_TESTFS_H
13 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_TESTFS_H
15 #include "support/Path.h"
16 #include "support/ThreadsafeFS.h"
17 #include "llvm/ADT/IntrusiveRefCntPtr.h"
18 #include "llvm/ADT/Optional.h"
19 #include "llvm/Support/Path.h"
20 #include "llvm/Support/VirtualFileSystem.h"
21 
22 namespace clang {
23 namespace clangd {
24 
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 = {});
30 
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);
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;
42  }
43 
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.
50 };
51 
52 // A Compilation database that returns a fixed set of compile flags.
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());
62 
63  llvm::Optional<tooling::CompileCommand>
64  getCompileCommand(PathRef File) const override;
65 
66  llvm::Optional<ProjectInfo> getProjectInfo(PathRef File) const override;
67 
68  std::vector<std::string> ExtraClangFlags;
69 
70 private:
71  StringRef Directory;
72  StringRef RelPathPrefix;
73 };
74 
75 // Returns an absolute (fake) test directory for this OS.
76 const char *testRoot();
77 
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);
81 
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;
86 
87 } // namespace clangd
88 } // namespace clang
89 #endif
clang::clangd::testPath
std::string testPath(PathRef File, llvm::sys::path::Style Style)
Definition: TestFS.cpp:94
Path.h
clang::clangd::MockFS::viewImpl
IntrusiveRefCntPtr< llvm::vfs::FileSystem > viewImpl() const override
Overridden by implementations to provide a vfs::FileSystem.
Definition: TestFS.h:34
clang::clangd::GlobalCompilationDatabase
Provides compilation arguments used for parsing C and C++ files.
Definition: GlobalCompilationDatabase.h:34
clang::clangd::UnittestSchemeAnchorSource
volatile int UnittestSchemeAnchorSource
Definition: TestFS.cpp:138
clang::clangd::MockCompilationDatabase::getCompileCommand
llvm::Optional< tooling::CompileCommand > getCompileCommand(PathRef File) const override
If there are any known-good commands for building this file, returns one.
Definition: TestFS.cpp:61
ThreadsafeFS.h
clang::clangd::MockCompilationDatabase::MockCompilationDatabase
MockCompilationDatabase(StringRef Directory=StringRef(), StringRef RelPathPrefix=StringRef())
If Directory is not empty, use that as the Directory field of the CompileCommand, and as project Sour...
Definition: TestFS.cpp:48
clang::clangd::testRoot
const char * testRoot()
Definition: TestFS.cpp:86
GlobalCompilationDatabase.h
clang::clangd::MockFS
Definition: TestFS.h:32
clang::clangd::buildTestFS
llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > buildTestFS(llvm::StringMap< std::string > const &Files, llvm::StringMap< time_t > const &Timestamps)
Definition: TestFS.cpp:34
clang::clangd::MockFS::Timestamps
llvm::StringMap< time_t > Timestamps
Definition: TestFS.h:46
clang::clangd::MockCompilationDatabase::getProjectInfo
llvm::Optional< ProjectInfo > getProjectInfo(PathRef File) const override
Finds the closest project to File.
Definition: TestFS.cpp:56
clang::clangd::MockFS::OverlayRealFileSystemForModules
bool OverlayRealFileSystemForModules
Definition: TestFS.h:49
Files
llvm::DenseSet< FileID > Files
Definition: IncludeCleaner.cpp:194
clang::clangd::PathRef
llvm::StringRef PathRef
A typedef to represent a ref to file path.
Definition: Path.h:29
clang::clangd::ThreadsafeFS
Wrapper for vfs::FileSystem for use in multithreaded programs like clangd.
Definition: ThreadsafeFS.h:27
clang
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Definition: ApplyReplacements.h:27
clang::clangd::MockFS::Files
llvm::StringMap< std::string > Files
Definition: TestFS.h:45
clang::clangd::MockCompilationDatabase::ExtraClangFlags
std::vector< std::string > ExtraClangFlags
Definition: TestFS.h:68
clang::clangd::MockCompilationDatabase
Definition: TestFS.h:53