summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2018-07-12 14:49:52 +0000
committerSam McCall <sam.mccall@gmail.com>2018-07-12 14:49:52 +0000
commit2308d70895cc463ab5ce601f8d46af942efb8604 (patch)
treed287b1776ed78f30a41ff6e2850de55bc8314be7
parentcda210582c595a306495c923a3f6452aa0d93fb0 (diff)
[clangd] Extract FileSystemProvider into a separate header. NFC
Reviewers: sammccall Reviewed By: sammccall Subscribers: mgorny, ioeric, MaskRay, jkorous, cfe-commits Differential Revision: https://reviews.llvm.org/D49142 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@336909 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--clangd/ClangdServer.cpp4
-rw-r--r--clangd/ClangdServer.h17
-rw-r--r--clangd/FSProvider.h42
3 files changed, 43 insertions, 20 deletions
diff --git a/clangd/ClangdServer.cpp b/clangd/ClangdServer.cpp
index ed8cba5f..01cc8239 100644
--- a/clangd/ClangdServer.cpp
+++ b/clangd/ClangdServer.cpp
@@ -68,10 +68,6 @@ public:
} // namespace
-IntrusiveRefCntPtr<vfs::FileSystem> RealFileSystemProvider::getFileSystem() {
- return vfs::getRealFileSystem();
-}
-
ClangdServer::Options ClangdServer::optsForTest() {
ClangdServer::Options Opts;
Opts.UpdateDebounce = std::chrono::steady_clock::duration::zero(); // Faster!
diff --git a/clangd/ClangdServer.h b/clangd/ClangdServer.h
index 36dcd1cc..d5351924 100644
--- a/clangd/ClangdServer.h
+++ b/clangd/ClangdServer.h
@@ -12,6 +12,7 @@
#include "ClangdUnit.h"
#include "CodeComplete.h"
+#include "FSProvider.h"
#include "Function.h"
#include "GlobalCompilationDatabase.h"
#include "Protocol.h"
@@ -42,22 +43,6 @@ public:
std::vector<Diag> Diagnostics) = 0;
};
-class FileSystemProvider {
-public:
- virtual ~FileSystemProvider() = default;
- /// Called by ClangdServer to obtain a vfs::FileSystem to be used for parsing.
- /// Context::current() will be the context passed to the clang entrypoint,
- /// such as addDocument(), and will also be propagated to result callbacks.
- /// Embedders may use this to isolate filesystem accesses.
- virtual IntrusiveRefCntPtr<vfs::FileSystem> getFileSystem() = 0;
-};
-
-class RealFileSystemProvider : public FileSystemProvider {
-public:
- /// Returns getRealFileSystem().
- IntrusiveRefCntPtr<vfs::FileSystem> getFileSystem() override;
-};
-
/// Provides API to manage ASTs for a collection of C++ files and request
/// various language features.
/// Currently supports async diagnostics, code completion, formatting and goto
diff --git a/clangd/FSProvider.h b/clangd/FSProvider.h
new file mode 100644
index 00000000..70dfb441
--- /dev/null
+++ b/clangd/FSProvider.h
@@ -0,0 +1,42 @@
+//===--- FSProvider.h - VFS provider for ClangdServer ------------*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_FSPROVIDER_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_FSPROVIDER_H
+
+#include "clang/Basic/VirtualFileSystem.h"
+#include "llvm/ADT/IntrusiveRefCntPtr.h"
+
+namespace clang {
+namespace clangd {
+
+// Wrapper for vfs::FileSystem for use in multithreaded programs like clangd.
+// As FileSystem is not threadsafe, concurrent threads must each obtain one.
+class FileSystemProvider {
+public:
+ virtual ~FileSystemProvider() = default;
+ /// Called by ClangdServer to obtain a vfs::FileSystem to be used for parsing.
+ /// Context::current() will be the context passed to the clang entrypoint,
+ /// such as addDocument(), and will also be propagated to result callbacks.
+ /// Embedders may use this to isolate filesystem accesses.
+ virtual IntrusiveRefCntPtr<vfs::FileSystem> getFileSystem() = 0;
+};
+
+class RealFileSystemProvider : public FileSystemProvider {
+public:
+ // FIXME: returns the single real FS instance, which is not threadsafe.
+ IntrusiveRefCntPtr<vfs::FileSystem> getFileSystem() override {
+ return vfs::getRealFileSystem();
+ }
+};
+
+} // namespace clangd
+} // namespace clang
+
+#endif