diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp index a76250fa168e72..0818d08811e0db 100644 --- a/clang-tools-extra/clangd/ClangdServer.cpp +++ b/clang-tools-extra/clangd/ClangdServer.cpp @@ -139,7 +139,8 @@ ClangdServer::Options::operator TUScheduler::Options() const { ClangdServer::ClangdServer(const GlobalCompilationDatabase &CDB, const ThreadsafeFS &TFS, const Options &Opts, Callbacks *Callbacks) - : ConfigProvider(Opts.ConfigProvider), TFS(TFS), ServerCallbacks(Callbacks), + : ConfigProvider(Opts.ConfigProvider), CDB(CDB), TFS(TFS), + ServerCallbacks(Callbacks), DynamicIdx(Opts.BuildDynamicSymbolIndex ? new FileIndex(Opts.HeavyweightDynamicSymbolIndex, Opts.CollectMainFileRefs) @@ -870,6 +871,7 @@ Context ClangdServer::createProcessingContext(PathRef File) const { LLVM_NODISCARD bool ClangdServer::blockUntilIdleForTest(llvm::Optional TimeoutSeconds) { return WorkScheduler.blockUntilIdle(timeoutSeconds(TimeoutSeconds)) && + CDB.blockUntilIdle(timeoutSeconds(TimeoutSeconds)) && (!BackgroundIdx || BackgroundIdx->blockUntilIdleForTest(TimeoutSeconds)); } diff --git a/clang-tools-extra/clangd/ClangdServer.h b/clang-tools-extra/clangd/ClangdServer.h index ff2fc857810385..d10c54f402b428 100644 --- a/clang-tools-extra/clangd/ClangdServer.h +++ b/clang-tools-extra/clangd/ClangdServer.h @@ -362,6 +362,7 @@ class ClangdServer { Context createProcessingContext(PathRef) const; config::Provider *ConfigProvider = nullptr; + const GlobalCompilationDatabase &CDB; const ThreadsafeFS &TFS; Callbacks *ServerCallbacks = nullptr; mutable std::mutex ConfigDiagnosticsMu; diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp index fde4e56ac72d8d..457cdef2bd8b5b 100644 --- a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp +++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp @@ -636,5 +636,11 @@ tooling::CompileCommand DelegatingCDB::getFallbackCommand(PathRef File) const { return Base->getFallbackCommand(File); } +bool DelegatingCDB::blockUntilIdle(Deadline D) const { + if (!Base) + return true; + return Base->blockUntilIdle(D); +} + } // namespace clangd } // namespace clang diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.h b/clang-tools-extra/clangd/GlobalCompilationDatabase.h index 125bd77a52073a..d009905bbecf28 100644 --- a/clang-tools-extra/clangd/GlobalCompilationDatabase.h +++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.h @@ -51,6 +51,10 @@ class GlobalCompilationDatabase { /// Clangd should treat the results as unreliable. virtual tooling::CompileCommand getFallbackCommand(PathRef File) const; + /// If the CDB does any asynchronous work, wait for it to complete. + /// For use in tests. + virtual bool blockUntilIdle(Deadline D) const { return true; } + using CommandChanged = Event>; /// The callback is notified when files may have new compile commands. /// The argument is a list of full file paths. @@ -75,6 +79,8 @@ class DelegatingCDB : public GlobalCompilationDatabase { tooling::CompileCommand getFallbackCommand(PathRef File) const override; + bool blockUntilIdle(Deadline D) const override; + private: const GlobalCompilationDatabase *Base; std::unique_ptr BaseOwner;