[PATCH] D92663: [clangd] Add hot-reload of compile_commands.json and compile_flags.txt

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 9 07:40:29 PST 2020


kadircet added a comment.

this mostly LGTM. there are some changes to the existing behavior; like discovery order and not looking for other plugins under `build/`, but they seem like non-harmful changes to me.

my biggest question is, have we considered updating `CompilationDatabasePlugin` interface to provide a `loadFromBuffer` and `relativeFileName` virtual methods. I think loading logic could've been a lot simpler and more uniform that way.
i think we discussed this option but i don't remember the outcome, sorry :(.



================
Comment at: clang-tools-extra/clangd/GlobalCompilationDatabase.cpp:185
+    bool MayCache = load(*TFS.view(/*CWD=*/llvm::None));
+    if (MayCache) {
+      // Use new timestamp, as loading may be slow.
----------------
nit: inline `MayCache`


================
Comment at: clang-tools-extra/clangd/GlobalCompilationDatabase.cpp:205
+  auto Stat = FS.status(Path);
+  if (!Stat || !Stat->isRegularFile()) {
+    Size = NoFileCached;
----------------
what about symlinks ? i think users usually have `cc.json -> obscure_build_dir/cc.json` as a symlink.


================
Comment at: clang-tools-extra/clangd/GlobalCompilationDatabase.cpp:224
+  if (HasOldData && NewContentHash == ContentHash)
+    // mtime changed but data is the same: avoid rebuilding the CDB.
+    return {LoadResult::FoundSameData, nullptr};
----------------
also update cached mtime ?


================
Comment at: clang-tools-extra/clangd/GlobalCompilationDatabase.cpp:267
+    // Wrapper for {Fixed,JSON}CompilationDatabase::loadFromBuffer.
+    std::unique_ptr<tooling::CompilationDatabase> (*Parser)(
+        PathRef,
----------------
nit: can we have a functor(probably llvm::function_ref) rather than a function pointer?


================
Comment at: clang-tools-extra/clangd/GlobalCompilationDatabase.cpp:322
+    auto Plugin = Entry.instantiate();
+    if (auto CDB = Plugin->loadFromDirectory(Path, Error)) {
+      log("Loaded compilation database from {0} with plugin {1}", Path,
----------------
it is not crucial but we used to try to load these from `Path + "/build"` as well


================
Comment at: clang-tools-extra/clangd/GlobalCompilationDatabase.cpp:456
     CDBLookupResult Result) const {
+  vlog("Broadcasting compilation database from {0}", Result.PI.SourceRoot);
   assert(Result.CDB && "Trying to broadcast an invalid CDB!");
----------------
why not `log` instead of `vlog`? this shouldn't be too noisy anyway.


================
Comment at: clang-tools-extra/clangd/GlobalCompilationDatabase.h:133
+
+  std::chrono::steady_clock::duration RevalidateAfter;
+  std::chrono::steady_clock::duration RevalidateMissingAfter;
----------------
why not directly store `Options` ?


================
Comment at: clang-tools-extra/clangd/unittests/GlobalCompilationDatabaseTests.cpp:393
+
+auto HasFlag(llvm::StringRef Flag) { return HasFlag(Flag, "dummy.cc"); }
+
----------------
nit: maybe a `MATCHER_P` instead ?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D92663/new/

https://reviews.llvm.org/D92663



More information about the cfe-commits mailing list