diff options
Diffstat (limited to 'clang-tools-extra/clangd/ClangdLSPServer.cpp')
| -rw-r--r-- | clang-tools-extra/clangd/ClangdLSPServer.cpp | 55 |
1 files changed, 16 insertions, 39 deletions
diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp index 752de60b7ee..2d4a9cf5076 100644 --- a/clang-tools-extra/clangd/ClangdLSPServer.cpp +++ b/clang-tools-extra/clangd/ClangdLSPServer.cpp @@ -305,11 +305,12 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params, ErrorCode::InvalidRequest)); if (const auto &Dir = Params.initializationOptions.compilationDatabasePath) CompileCommandsDir = Dir; - CDB.emplace(UseInMemoryCDB - ? CompilationDB::makeInMemory() - : CompilationDB::makeDirectoryBased(CompileCommandsDir)); - Server.emplace(CDB->getCDB(), FSProvider, - static_cast<DiagnosticsConsumer &>(*this), ClangdServerOpts); + if (UseDirBasedCDB) + BaseCDB = llvm::make_unique<DirectoryBasedGlobalCompilationDatabase>( + CompileCommandsDir); + CDB.emplace(BaseCDB.get()); + Server.emplace(*CDB, FSProvider, static_cast<DiagnosticsConsumer &>(*this), + ClangdServerOpts); applyConfiguration(Params.initializationOptions.ConfigSettings); CCOpts.EnableSnippets = Params.capabilities.CompletionSnippets; @@ -658,12 +659,14 @@ void ClangdLSPServer::applyConfiguration( /// The opened files need to be reparsed only when some existing /// entries are changed. PathRef File = Entry.first; - if (!CDB->setCompilationCommandForFile( - File, tooling::CompileCommand( - std::move(Entry.second.workingDirectory), File, - std::move(Entry.second.compilationCommand), - /*Output=*/""))) - ShouldReparseOpenFiles = true; + auto Old = CDB->getCompileCommand(File); + auto New = + tooling::CompileCommand(std::move(Entry.second.workingDirectory), File, + std::move(Entry.second.compilationCommand), + /*Output=*/""); + if (Old != New) + CDB->setCompileCommand(File, std::move(New)); + ShouldReparseOpenFiles = true; } if (ShouldReparseOpenFiles) reparseOpenedFiles(); @@ -684,12 +687,12 @@ void ClangdLSPServer::onReference(const ReferenceParams &Params, ClangdLSPServer::ClangdLSPServer(class Transport &Transp, const clangd::CodeCompleteOptions &CCOpts, Optional<Path> CompileCommandsDir, - bool ShouldUseInMemoryCDB, + bool UseDirBasedCDB, const ClangdServer::Options &Opts) : Transp(Transp), MsgHandler(new MessageHandler(*this)), CCOpts(CCOpts), SupportedSymbolKinds(defaultSymbolKinds()), SupportedCompletionItemKinds(defaultCompletionItemKinds()), - UseInMemoryCDB(ShouldUseInMemoryCDB), + UseDirBasedCDB(UseDirBasedCDB), CompileCommandsDir(std::move(CompileCommandsDir)), ClangdServerOpts(Opts) { // clang-format off @@ -783,31 +786,5 @@ void ClangdLSPServer::reparseOpenedFiles() { WantDiagnostics::Auto); } -ClangdLSPServer::CompilationDB ClangdLSPServer::CompilationDB::makeInMemory() { - return CompilationDB(llvm::make_unique<InMemoryCompilationDb>(), - /*IsDirectoryBased=*/false); -} - -ClangdLSPServer::CompilationDB -ClangdLSPServer::CompilationDB::makeDirectoryBased( - Optional<Path> CompileCommandsDir) { - auto CDB = llvm::make_unique<DirectoryBasedGlobalCompilationDatabase>( - std::move(CompileCommandsDir)); - return CompilationDB(std::move(CDB), - /*IsDirectoryBased=*/true); -} - -bool ClangdLSPServer::CompilationDB::setCompilationCommandForFile( - PathRef File, tooling::CompileCommand CompilationCommand) { - if (IsDirectoryBased) { - elog("Trying to set compile command for {0} while using directory-based " - "compilation database", - File); - return false; - } - return static_cast<InMemoryCompilationDb *>(CDB.get()) - ->setCompilationCommandForFile(File, std::move(CompilationCommand)); -} - } // namespace clangd } // namespace clang |

