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.
This commit is contained in:
Fangrui Song 2018-12-28 12:30:15 -08:00
parent 8835a555f8
commit f99cf50456
3 changed files with 23 additions and 2 deletions

View File

@ -41,10 +41,12 @@ void MessageHandler::textDocument_didOpen(DidOpenTextDocumentParam &param) {
// Submit new index request if it is not a header file or there is no
// pending index request.
std::pair<LanguageId, bool> 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);
}

View File

@ -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

View File

@ -65,5 +65,6 @@ struct Project {
const std::string &path);
void Index(WorkingFiles *wfiles, RequestId id);
void IndexRelated(const std::string &path);
};
} // namespace ccls