@@ -64,7 +64,9 @@ GlobalCompilationDatabase::getFallbackCommand(PathRef File) const {
6464 if (FileExtension.empty () || FileExtension == " .h" )
6565 Argv.push_back (" -xobjective-c++-header" );
6666 Argv.push_back (std::string (File));
67- tooling::CompileCommand Cmd (llvm::sys::path::parent_path (File),
67+ tooling::CompileCommand Cmd (FallbackWorkingDirectory
68+ ? *FallbackWorkingDirectory
69+ : llvm::sys::path::parent_path (File),
6870 llvm::sys::path::filename (File), std::move (Argv),
6971 /* Output=*/ " " );
7072 Cmd.Heuristic = " clangd fallback" ;
@@ -349,7 +351,8 @@ bool DirectoryBasedGlobalCompilationDatabase::DirectoryCache::load(
349351
350352DirectoryBasedGlobalCompilationDatabase::
351353 DirectoryBasedGlobalCompilationDatabase (const Options &Opts)
352- : Opts(Opts), Broadcaster(std::make_unique<BroadcastThread>(*this )) {
354+ : GlobalCompilationDatabase(Opts.FallbackWorkingDirectory), Opts(Opts),
355+ Broadcaster(std::make_unique<BroadcastThread>(*this )) {
353356 if (!this ->Opts .ContextProvider )
354357 this ->Opts .ContextProvider = [](llvm::StringRef) {
355358 return Context::current ().clone ();
@@ -460,6 +463,21 @@ DirectoryBasedGlobalCompilationDatabase::lookupCDB(
460463 return Result;
461464}
462465
466+ void DirectoryBasedGlobalCompilationDatabase::Options::
467+ applyFallbackWorkingDirectory (
468+ std::optional<std::string> FallbackWorkingDirectory) {
469+ if (FallbackWorkingDirectory)
470+ this ->FallbackWorkingDirectory = *FallbackWorkingDirectory;
471+ else {
472+ // Clangd is running in strong workspace mode but the client didn't
473+ // specify a workspace path in the `initialize` request.
474+ // Fallback to current working directory.
475+ SmallString<256 > CWD;
476+ llvm::sys::fs::current_path (CWD);
477+ this ->FallbackWorkingDirectory = std::string (CWD);
478+ }
479+ }
480+
463481// The broadcast thread announces files with new compile commands to the world.
464482// Primarily this is used to enqueue them for background indexing.
465483//
@@ -759,9 +777,10 @@ DirectoryBasedGlobalCompilationDatabase::getProjectModules(PathRef File) const {
759777
760778OverlayCDB::OverlayCDB (const GlobalCompilationDatabase *Base,
761779 std::vector<std::string> FallbackFlags,
762- CommandMangler Mangler)
763- : DelegatingCDB(Base), Mangler(std::move(Mangler)),
764- FallbackFlags(std::move(FallbackFlags)) {}
780+ CommandMangler Mangler,
781+ std::optional<std::string> FallbackWorkingDirectory)
782+ : DelegatingCDB(Base, FallbackWorkingDirectory),
783+ Mangler(std::move(Mangler)), FallbackFlags(std::move(FallbackFlags)) {}
765784
766785std::optional<tooling::CompileCommand>
767786OverlayCDB::getCompileCommand (PathRef File) const {
@@ -844,16 +863,20 @@ OverlayCDB::getProjectModules(PathRef File) const {
844863 return MDB;
845864}
846865
847- DelegatingCDB::DelegatingCDB (const GlobalCompilationDatabase *Base)
848- : Base(Base) {
866+ DelegatingCDB::DelegatingCDB (
867+ const GlobalCompilationDatabase *Base,
868+ std::optional<std::string> FallbackWorkingDirectory)
869+ : GlobalCompilationDatabase(FallbackWorkingDirectory), Base(Base) {
849870 if (Base)
850871 BaseChanged = Base->watch ([this ](const std::vector<std::string> Changes) {
851872 OnCommandChanged.broadcast (Changes);
852873 });
853874}
854875
855- DelegatingCDB::DelegatingCDB (std::unique_ptr<GlobalCompilationDatabase> Base)
856- : DelegatingCDB(Base.get()) {
876+ DelegatingCDB::DelegatingCDB (
877+ std::unique_ptr<GlobalCompilationDatabase> Base,
878+ std::optional<std::string> FallbackWorkingDirectory)
879+ : DelegatingCDB(Base.get(), FallbackWorkingDirectory) {
857880 BaseOwner = std::move (Base);
858881}
859882
0 commit comments