From f99cf504561aff685ca55913572443212068918c Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 28 Dec 2018 12:30:15 -0800 Subject: [PATCH] textDocument/didOpen: index related files when a header is opened Fix #180 index.initialBlacklist: ["."] can inhibit initial indexing (useful for larger code bases). Opened files are still indexed, though. This heuristic allows related files (a/foo.c a/b/foo.cc) to be indexed when a header (foo.h) is opened. --- src/messages/textDocument_did.cc | 6 ++++-- src/project.cc | 18 ++++++++++++++++++ src/project.hh | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/messages/textDocument_did.cc b/src/messages/textDocument_did.cc index d8631b44..1f2a47de 100644 --- a/src/messages/textDocument_did.cc +++ b/src/messages/textDocument_did.cc @@ -41,10 +41,12 @@ void MessageHandler::textDocument_didOpen(DidOpenTextDocumentParam ¶m) { // Submit new index request if it is not a header file or there is no // pending index request. - std::pair lang = lookupExtension(path); - if ((lang.first != LanguageId::Unknown && !lang.second) || + auto [lang, header] = lookupExtension(path); + if ((lang != LanguageId::Unknown && !header) || !pipeline::pending_index_requests) pipeline::Index(path, {}, IndexMode::Normal, false); + if (header) + project->IndexRelated(path); manager->OnView(path); } diff --git a/src/project.cc b/src/project.cc index c96eac1e..e81d7303 100644 --- a/src/project.cc +++ b/src/project.cc @@ -535,4 +535,22 @@ void Project::Index(WorkingFiles *wfiles, RequestId id) { // trigger refreshing semantic highlight for all working files. pipeline::Index("", {}, IndexMode::NonInteractive, false); } + +void Project::IndexRelated(const std::string &path) { + auto &gi = g_config->index; + GroupMatch match(gi.whitelist, gi.blacklist); + std::string stem = sys::path::stem(path); + std::lock_guard lock(mtx); + for (auto &[root, folder] : root2folder) + if (StringRef(path).startswith(root)) { + for (const Project::Entry &entry : folder.entries) { + std::string reason; + if (sys::path::stem(entry.filename) == stem && entry.filename != path && + match.Matches(entry.filename, &reason)) + pipeline::Index(entry.filename, entry.args, IndexMode::NonInteractive, + true); + } + break; + } +} } // namespace ccls diff --git a/src/project.hh b/src/project.hh index 472cb32a..f9fcad20 100644 --- a/src/project.hh +++ b/src/project.hh @@ -65,5 +65,6 @@ struct Project { const std::string &path); void Index(WorkingFiles *wfiles, RequestId id); + void IndexRelated(const std::string &path); }; } // namespace ccls