Index: clang-tools-extra/trunk/clangd/ClangdServer.h =================================================================== --- clang-tools-extra/trunk/clangd/ClangdServer.h +++ clang-tools-extra/trunk/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 @@ std::vector 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 getFileSystem() = 0; -}; - -class RealFileSystemProvider : public FileSystemProvider { -public: - /// Returns getRealFileSystem(). - IntrusiveRefCntPtr 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 Index: clang-tools-extra/trunk/clangd/ClangdServer.cpp =================================================================== --- clang-tools-extra/trunk/clangd/ClangdServer.cpp +++ clang-tools-extra/trunk/clangd/ClangdServer.cpp @@ -68,10 +68,6 @@ } // namespace -IntrusiveRefCntPtr RealFileSystemProvider::getFileSystem() { - return vfs::getRealFileSystem(); -} - ClangdServer::Options ClangdServer::optsForTest() { ClangdServer::Options Opts; Opts.UpdateDebounce = std::chrono::steady_clock::duration::zero(); // Faster! Index: clang-tools-extra/trunk/clangd/FSProvider.h =================================================================== --- clang-tools-extra/trunk/clangd/FSProvider.h +++ clang-tools-extra/trunk/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 getFileSystem() = 0; +}; + +class RealFileSystemProvider : public FileSystemProvider { +public: + // FIXME: returns the single real FS instance, which is not threadsafe. + IntrusiveRefCntPtr getFileSystem() override { + return vfs::getRealFileSystem(); + } +}; + +} // namespace clangd +} // namespace clang + +#endif