Nebiroth created this revision.

Adds compileCommands command line argument to specify an absolute path directly 
to the requested compile_commands.json for flags.


https://reviews.llvm.org/D37150

Files:
  clangd/GlobalCompilationDatabase.cpp

Index: clangd/GlobalCompilationDatabase.cpp
===================================================================
--- clangd/GlobalCompilationDatabase.cpp
+++ clangd/GlobalCompilationDatabase.cpp
@@ -11,6 +11,24 @@
 #include "clang/Tooling/CompilationDatabase.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Path.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/Format.h"
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/Mutex.h"
+#include "llvm/Support/Timer.h"
+#include "llvm/Support/YAMLTraits.h"
+#include "llvm/Support/raw_ostream.h"
+using namespace llvm;
+
+namespace {
+
+static cl::opt<std::string> CompileCommands("compileCommands",
+                                 cl::desc("Start with absolute path to compile_commands.json"));  
+}
 
 namespace clang {
 namespace clangd {
@@ -36,6 +54,8 @@
                                  /*Output=*/"");
 }
 
+
+
 std::vector<tooling::CompileCommand>
 DirectoryBasedGlobalCompilationDatabase::getCompileCommands(PathRef File) {
   std::vector<tooling::CompileCommand> Commands;
@@ -64,35 +84,62 @@
 tooling::CompilationDatabase *
 DirectoryBasedGlobalCompilationDatabase::getCompilationDatabase(PathRef File) {
   std::lock_guard<std::mutex> Lock(Mutex);
-
   namespace path = llvm::sys::path;
+  // if --compileCommands arg was invoked, check value and override default path
+  std::size_t found = CompileCommands.find_first_of("/");
+  std::string TempString = CompileCommands;
+  if (found != std::string::npos)
+  {
+     File = TempString;
+  }
+
+  std::string Error;
+  bool badPath = false;
+  File = path::parent_path(File);
+  auto CachedIt = CompilationDatabases.find(File);
+  if (CachedIt != CompilationDatabases.end())
+    return CachedIt->second.get();
+  auto CDB = tooling::CompilationDatabase::loadFromDirectory(File, Error);
+  if (!CDB) {
+      if (!Error.empty()) {
+        badPath = true;
+      }      
+  }
 
   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();
+  if (badPath)
+  {
+    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;
+    }
   }
+  else
+  {
+    auto result = CDB.get();
+    CompilationDatabases.insert(std::make_pair(File, std::move(CDB)));
+    return result;
+  }
+
 
   // FIXME(ibiryukov): logging
   // Output.log("Failed to find compilation database for " + Twine(File) +
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to