diff options
| -rw-r--r-- | clang-tools-extra/clangd/ClangdServer.cpp | 4 | ||||
| -rw-r--r-- | clang-tools-extra/clangd/ClangdServer.h | 17 | ||||
| -rw-r--r-- | clang-tools-extra/clangd/FSProvider.h | 42 | 
3 files changed, 43 insertions, 20 deletions
diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp index ed8cba5f1dd..01cc823947e 100644 --- a/clang-tools-extra/clangd/ClangdServer.cpp +++ b/clang-tools-extra/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/clang-tools-extra/clangd/ClangdServer.h b/clang-tools-extra/clangd/ClangdServer.h index 36dcd1cc3f9..d5351924e96 100644 --- a/clang-tools-extra/clangd/ClangdServer.h +++ b/clang-tools-extra/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/clang-tools-extra/clangd/FSProvider.h b/clang-tools-extra/clangd/FSProvider.h new file mode 100644 index 00000000000..70dfb441a00 --- /dev/null +++ b/clang-tools-extra/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  | 

