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 @@ -165,6 +165,8 @@ bool FoldingRanges = false; FeatureModuleSet *FeatureModules = nullptr; + /// If true, use the dirty buffer contents when building Preambles. + bool UseDirtyPreambles = false; explicit operator TUScheduler::Options() const; }; @@ -390,6 +392,9 @@ private: FeatureModuleSet *FeatureModules; const GlobalCompilationDatabase &CDB; + const ThreadsafeFS &getPreambleFS() const { + return UseDirtyPreambles ? *DirtyFS : TFS; + } const ThreadsafeFS &TFS; Path ResourceDir; @@ -409,6 +414,8 @@ // When set, provides clang-tidy options for a specific file. TidyProviderRef ClangTidyProvider; + bool UseDirtyPreambles = false; + // GUARDED_BY(CachedCompletionFuzzyFindRequestMutex) llvm::StringMap> CachedCompletionFuzzyFindRequestByFile; 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 @@ -156,6 +156,7 @@ : FeatureModules(Opts.FeatureModules), CDB(CDB), TFS(TFS), DynamicIdx(Opts.BuildDynamicSymbolIndex ? new FileIndex() : nullptr), ClangTidyProvider(Opts.ClangTidyProvider), + UseDirtyPreambles(Opts.UseDirtyPreambles), WorkspaceRoot(Opts.WorkspaceRoot), Transient(Opts.ImplicitCancellation ? TUScheduler::InvalidateOnUpdate : TUScheduler::NoInvalidation), @@ -228,7 +229,7 @@ // Compile command is set asynchronously during update, as it can be slow. ParseInputs Inputs; - Inputs.TFS = &TFS; + Inputs.TFS = &getPreambleFS(); Inputs.Contents = std::string(Contents); Inputs.Version = std::move(ActualVersion); Inputs.ForceRebuild = ForceRebuild; @@ -368,7 +369,7 @@ SpecFuzzyFind->CachedReq = CachedCompletionFuzzyFindRequestByFile[File]; } } - ParseInputs ParseInput{IP->Command, &TFS, IP->Contents.str()}; + ParseInputs ParseInput{IP->Command, &getPreambleFS(), IP->Contents.str()}; ParseInput.Index = Index; CodeCompleteOpts.MainFileSignals = IP->Signals; @@ -416,7 +417,7 @@ if (!PreambleData) return CB(error("Failed to parse includes")); - ParseInputs ParseInput{IP->Command, &TFS, IP->Contents.str()}; + ParseInputs ParseInput{IP->Command, &getPreambleFS(), IP->Contents.str()}; ParseInput.Index = Index; CB(clangd::signatureHelp(File, Pos, *PreambleData, ParseInput, DocumentationFormat)); diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp --- a/clang-tools-extra/clangd/tool/ClangdMain.cpp +++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -501,6 +501,12 @@ init(true), }; +opt UseDirtyPreambles{"use-dirty-preambles", cat(Misc), + desc("Use files open in the editor when building " + "pre-ambles instead of reading from the disk"), + Hidden, + init(ClangdServer::Options().UseDirtyPreambles)}; + #if defined(__GLIBC__) && CLANGD_MALLOC_TRIM opt EnableMallocTrim{ "malloc-trim", @@ -938,6 +944,7 @@ ClangTidyOptProvider = combine(std::move(Providers)); Opts.ClangTidyProvider = ClangTidyOptProvider; } + Opts.UseDirtyPreambles = UseDirtyPreambles; Opts.QueryDriverGlobs = std::move(QueryDriverGlobs); Opts.TweakFilter = [&](const Tweak &T) { if (T.hidden() && !HiddenFeatures)