diff options
author | Ilya Biryukov <ibiryukov@google.com> | 2017-05-16 09:38:59 +0000 |
---|---|---|
committer | Ilya Biryukov <ibiryukov@google.com> | 2017-05-16 09:38:59 +0000 |
commit | f392d18b5ced1c3cebc5b333f7567d2a37fd5642 (patch) | |
tree | 31b7d41e6aed5a0f4a6f3fd651416c180a292588 /clangd/GlobalCompilationDatabase.cpp | |
parent | cbee41737867ac9061e45d1110b2730f26b55c48 (diff) |
Restored r303067 and fixed failing test.
Summary:
This commit restores r303067(reverted by r303094) and fixes the 'formatting.test'
failure.
The failure is due to destructors of `ClangdLSPServer`'s fields(`FixItsMap` and
`FixItsMutex`) being called before destructor of `Server`. It led to the worker
thread calling `consumeDiagnostics` after `FixItsMutex` and `FixItsMap`
destructors were called.
Also, clangd is now run with '-run-synchronously' flag in 'formatting.test'.
Reviewers: bkramer, krasimir
Reviewed By: krasimir
Subscribers: mgorny, cfe-commits, klimek
Differential Revision: https://reviews.llvm.org/D33233
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@303151 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clangd/GlobalCompilationDatabase.cpp')
-rw-r--r-- | clangd/GlobalCompilationDatabase.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/clangd/GlobalCompilationDatabase.cpp b/clangd/GlobalCompilationDatabase.cpp new file mode 100644 index 00000000..91d77026 --- /dev/null +++ b/clangd/GlobalCompilationDatabase.cpp @@ -0,0 +1,65 @@ +//===--- GlobalCompilationDatabase.cpp --------------------------*- C++-*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===---------------------------------------------------------------------===// + +#include "GlobalCompilationDatabase.h" +#include "clang/Tooling/CompilationDatabase.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/Path.h" + +using namespace clang::clangd; +using namespace clang; + +std::vector<tooling::CompileCommand> +DirectoryBasedGlobalCompilationDatabase::getCompileCommands(PathRef File) { + std::vector<tooling::CompileCommand> Commands; + + auto CDB = getCompilationDatabase(File); + if (!CDB) + return {}; + return CDB->getCompileCommands(File); +} + +tooling::CompilationDatabase * +DirectoryBasedGlobalCompilationDatabase::getCompilationDatabase(PathRef File) { + std::lock_guard<std::mutex> Lock(Mutex); + + namespace path = llvm::sys::path; + + assert((path::is_absolute(File, path::Style::posix) || + path::is_absolute(File, path::Style::windows)) && + "path must be absolute"); + + for (auto Path = path::parent_path(File); !Path.empty(); + Path = path::parent_path(Path)) { + + auto CachedIt = CompilationDatabases.find(Path); + if (CachedIt != CompilationDatabases.end()) + return CachedIt->second.get(); + std::string Error; + auto CDB = tooling::CompilationDatabase::loadFromDirectory(Path, Error); + if (!CDB) { + if (!Error.empty()) { + // FIXME(ibiryukov): logging + // Output.log("Error when trying to load compilation database from " + + // Twine(Path) + ": " + Twine(Error) + "\n"); + } + continue; + } + + // FIXME(ibiryukov): Invalidate cached compilation databases on changes + auto result = CDB.get(); + CompilationDatabases.insert(std::make_pair(Path, std::move(CDB))); + return result; + } + + // FIXME(ibiryukov): logging + // Output.log("Failed to find compilation database for " + Twine(File) + + // "\n"); + return nullptr; +} |