summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/GlobalCompilationDatabase.cpp')
-rw-r--r--clang-tools-extra/clangd/GlobalCompilationDatabase.cpp41
1 files changed, 37 insertions, 4 deletions
diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp
index 95e7ce7ba69..a9161972893 100644
--- a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp
+++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp
@@ -8,12 +8,36 @@
#include "GlobalCompilationDatabase.h"
#include "Logger.h"
+#include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Tooling/ArgumentsAdjusters.h"
#include "clang/Tooling/CompilationDatabase.h"
+#include "llvm/ADT/Optional.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
namespace clang {
namespace clangd {
+namespace {
+
+void adjustArguments(tooling::CompileCommand &Cmd,
+ llvm::StringRef ResourceDir) {
+ // Strip plugin related command line arguments. Clangd does
+ // not support plugins currently. Therefore it breaks if
+ // compiler tries to load plugins.
+ Cmd.CommandLine =
+ tooling::getStripPluginsAdjuster()(Cmd.CommandLine, Cmd.Filename);
+ // Inject the resource dir.
+ // FIXME: Don't overwrite it if it's already there.
+ if (!ResourceDir.empty())
+ Cmd.CommandLine.push_back(("-resource-dir=" + ResourceDir).str());
+}
+
+std::string getStandardResourceDir() {
+ static int Dummy; // Just an address in this process.
+ return CompilerInvocation::GetResourcesPath("clangd", (void *)&Dummy);
+}
+
+} // namespace
static std::string getFallbackClangPath() {
static int Dummy;
@@ -105,8 +129,11 @@ DirectoryBasedGlobalCompilationDatabase::getCDBForFile(
}
OverlayCDB::OverlayCDB(const GlobalCompilationDatabase *Base,
- std::vector<std::string> FallbackFlags)
- : Base(Base), FallbackFlags(std::move(FallbackFlags)) {
+ std::vector<std::string> FallbackFlags,
+ llvm::Optional<std::string> ResourceDir)
+ : Base(Base), ResourceDir(ResourceDir ? std::move(*ResourceDir)
+ : getStandardResourceDir()),
+ FallbackFlags(std::move(FallbackFlags)) {
if (Base)
BaseChanged = Base->watch([this](const std::vector<std::string> Changes) {
OnCommandChanged.broadcast(Changes);
@@ -115,16 +142,22 @@ OverlayCDB::OverlayCDB(const GlobalCompilationDatabase *Base,
llvm::Optional<tooling::CompileCommand>
OverlayCDB::getCompileCommand(PathRef File, ProjectInfo *Project) const {
+ llvm::Optional<tooling::CompileCommand> Cmd;
{
std::lock_guard<std::mutex> Lock(Mutex);
auto It = Commands.find(File);
if (It != Commands.end()) {
if (Project)
Project->SourceRoot = "";
- return It->second;
+ Cmd = It->second;
}
}
- return Base ? Base->getCompileCommand(File, Project) : None;
+ if (!Cmd && Base)
+ Cmd = Base->getCompileCommand(File, Project);
+ if (!Cmd)
+ return llvm::None;
+ adjustArguments(*Cmd, ResourceDir);
+ return Cmd;
}
tooling::CompileCommand OverlayCDB::getFallbackCommand(PathRef File) const {
OpenPOWER on IntegriCloud