diff --git a/clang-tools-extra/clangd/ClangdServer.h b/clang-tools-extra/clangd/ClangdServer.h --- a/clang-tools-extra/clangd/ClangdServer.h +++ b/clang-tools-extra/clangd/ClangdServer.h @@ -362,6 +362,7 @@ 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/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp --- a/clang-tools-extra/clangd/ClangdServer.cpp +++ b/clang-tools-extra/clangd/ClangdServer.cpp @@ -139,7 +139,8 @@ 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) @@ -873,6 +874,7 @@ 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/GlobalCompilationDatabase.h b/clang-tools-extra/clangd/GlobalCompilationDatabase.h --- a/clang-tools-extra/clangd/GlobalCompilationDatabase.h +++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.h @@ -51,6 +51,10 @@ /// 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 @@ tooling::CompileCommand getFallbackCommand(PathRef File) const override; + bool blockUntilIdle(Deadline D) const override; + private: const GlobalCompilationDatabase *Base; std::unique_ptr BaseOwner; diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp --- a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp +++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp @@ -635,5 +635,11 @@ return Base->getFallbackCommand(File); } +bool DelegatingCDB::blockUntilIdle(Deadline D) const { + if (!Base) + return true; + return Base->blockUntilIdle(D); +} + } // namespace clangd } // namespace clang