diff --git a/clang-tools-extra/clangd/TUScheduler.h b/clang-tools-extra/clangd/TUScheduler.h --- a/clang-tools-extra/clangd/TUScheduler.h +++ b/clang-tools-extra/clangd/TUScheduler.h @@ -313,7 +313,7 @@ private: const GlobalCompilationDatabase &CDB; - const Options Opts; + Options Opts; std::unique_ptr Callbacks; // not nullptr Semaphore Barrier; llvm::StringMap> Files; diff --git a/clang-tools-extra/clangd/TUScheduler.cpp b/clang-tools-extra/clangd/TUScheduler.cpp --- a/clang-tools-extra/clangd/TUScheduler.cpp +++ b/clang-tools-extra/clangd/TUScheduler.cpp @@ -965,6 +965,7 @@ if (RunSync) { assert(!Done && "running a task after stop()"); trace::Span Tracer(Name + ":" + llvm::sys::path::filename(FileName)); + WithContext WithProvidedContext(ContextProvider(FileName)); Task(); return; } @@ -1062,9 +1063,7 @@ Status.ASTActivity.K = ASTAction::RunningAction; Status.ASTActivity.Name = CurrentRequest->Name; }); - llvm::Optional WithProvidedContext; - if (ContextProvider) - WithProvidedContext.emplace(ContextProvider(FileName)); + WithContext WithProvidedContext(ContextProvider(FileName)); CurrentRequest->Action(); } @@ -1238,6 +1237,11 @@ Barrier(Opts.AsyncThreadsCount), IdleASTs( std::make_unique(Opts.RetentionPolicy.MaxRetainedASTs)) { + // Avoid null checks everywhere. + if (!Opts.ContextProvider) + this->Opts.ContextProvider = [](llvm::StringRef) { + return Context::current().clone(); + }; if (0 < Opts.AsyncThreadsCount) { PreambleTasks.emplace(); WorkerThreads.emplace(); @@ -1300,16 +1304,16 @@ void TUScheduler::run(llvm::StringRef Name, llvm::StringRef Path, llvm::unique_function Action) { - if (!PreambleTasks) + if (!PreambleTasks) { + WithContext WithProvidedContext(Opts.ContextProvider(Path)); return Action(); + } PreambleTasks->runAsync(Name, [this, Ctx = Context::current().clone(), Path(Path.str()), Action = std::move(Action)]() mutable { std::lock_guard BarrierLock(Barrier); WithContext WC(std::move(Ctx)); - llvm::Optional WithProvidedContext; - if (Opts.ContextProvider) - WithProvidedContext.emplace(Opts.ContextProvider(Path)); + WithContext WithProvidedContext(Opts.ContextProvider(Path)); Action(); }); } @@ -1344,6 +1348,7 @@ SPAN_ATTACH(Tracer, "file", File); std::shared_ptr Preamble = It->second->Worker->getPossiblyStalePreamble(); + WithContext WithProvidedContext(Opts.ContextProvider(File)); Action(InputsAndPreamble{It->second->Contents, It->second->Worker->getCurrentCompileCommand(), Preamble.get()}); @@ -1370,9 +1375,7 @@ WithContext Guard(std::move(Ctx)); trace::Span Tracer(Name); SPAN_ATTACH(Tracer, "file", File); - llvm::Optional WithProvidedContext; - if (Opts.ContextProvider) - WithProvidedContext.emplace(Opts.ContextProvider(File)); + WithContext WithProvidedContext(Opts.ContextProvider(File)); Action(InputsAndPreamble{Contents, Command, Preamble.get()}); };