diff options
-rw-r--r-- | clang-tools-extra/clangd/ClangdLSPServer.cpp | 25 | ||||
-rw-r--r-- | clang-tools-extra/clangd/ClangdLSPServer.h | 6 |
2 files changed, 22 insertions, 9 deletions
diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp index 4dc3412538a..3f825a6febd 100644 --- a/clang-tools-extra/clangd/ClangdLSPServer.cpp +++ b/clang-tools-extra/clangd/ClangdLSPServer.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "ClangdLSPServer.h" +#include "Context.h" #include "Diagnostics.h" #include "DraftStore.h" #include "FormattedString.h" @@ -465,10 +466,6 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params, break; } } - llvm::Optional<WithContextValue> WithOffsetEncoding; - if (NegotiatedOffsetEncoding) - WithOffsetEncoding.emplace(kCurrentOffsetEncoding, - *NegotiatedOffsetEncoding); ClangdServerOpts.SemanticHighlighting = Params.capabilities.SemanticHighlighting; @@ -490,8 +487,18 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params, } CDB.emplace(BaseCDB.get(), Params.initializationOptions.fallbackFlags, ClangdServerOpts.ResourceDir); - Server.emplace(*CDB, FSProvider, static_cast<DiagnosticsConsumer &>(*this), - ClangdServerOpts); + { + // Switch caller's context with LSPServer's background context. Since we + // rather want to propagate information from LSPServer's context into the + // Server, CDB, etc. + WithContext MainContext(BackgroundContext.clone()); + llvm::Optional<WithContextValue> WithOffsetEncoding; + if (NegotiatedOffsetEncoding) + WithOffsetEncoding.emplace(kCurrentOffsetEncoding, + *NegotiatedOffsetEncoding); + Server.emplace(*CDB, FSProvider, static_cast<DiagnosticsConsumer &>(*this), + ClangdServerOpts); + } applyConfiguration(Params.initializationOptions.ConfigSettings); CCOpts.EnableSnippets = Params.capabilities.CompletionSnippets; @@ -1184,9 +1191,9 @@ ClangdLSPServer::ClangdLSPServer( llvm::Optional<Path> CompileCommandsDir, bool UseDirBasedCDB, llvm::Optional<OffsetEncoding> ForcedOffsetEncoding, const ClangdServer::Options &Opts) - : Transp(Transp), MsgHandler(new MessageHandler(*this)), - FSProvider(FSProvider), CCOpts(CCOpts), - SupportedSymbolKinds(defaultSymbolKinds()), + : BackgroundContext(Context::current().clone()), Transp(Transp), + MsgHandler(new MessageHandler(*this)), FSProvider(FSProvider), + CCOpts(CCOpts), SupportedSymbolKinds(defaultSymbolKinds()), SupportedCompletionItemKinds(defaultCompletionItemKinds()), UseDirBasedCDB(UseDirBasedCDB), CompileCommandsDir(std::move(CompileCommandsDir)), ClangdServerOpts(Opts), diff --git a/clang-tools-extra/clangd/ClangdLSPServer.h b/clang-tools-extra/clangd/ClangdLSPServer.h index 5664efd388f..850da9813fa 100644 --- a/clang-tools-extra/clangd/ClangdLSPServer.h +++ b/clang-tools-extra/clangd/ClangdLSPServer.h @@ -10,6 +10,7 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_CLANGDLSPSERVER_H #include "ClangdServer.h" +#include "Context.h" #include "DraftStore.h" #include "Features.inc" #include "FindSymbols.h" @@ -131,6 +132,11 @@ private: void publishDiagnostics(const URIForFile &File, std::vector<clangd::Diagnostic> Diagnostics); + // Since initialization of CDBs and ClangdServer is done lazily, the following + // context captures the one used while creating ClangdLSPServer and passes it + // to above mentioned object instances to make sure they share the same state. + Context BackgroundContext; + /// Used to indicate that the 'shutdown' request was received from the /// Language Server client. bool ShutdownRequestReceived = false; |