Support indexing non-existent files in index.onChange:true mode

This commit is contained in:
Fangrui Song 2019-07-20 01:16:15 -07:00
parent 86a93b2d71
commit ab6498e2ff
3 changed files with 23 additions and 20 deletions

View File

@ -42,11 +42,11 @@ void MessageHandler::workspace_didChangeWatchedFiles(
if (cur[0] == '.') if (cur[0] == '.')
return; return;
IndexMode mode =
wfiles->GetFile(path) ? IndexMode::Normal : IndexMode::Background;
switch (event.type) { switch (event.type) {
case FileChangeType::Created: case FileChangeType::Created:
case FileChangeType::Changed: { case FileChangeType::Changed: {
IndexMode mode =
wfiles->GetFile(path) ? IndexMode::Normal : IndexMode::Background;
pipeline::Index(path, {}, mode, true); pipeline::Index(path, {}, mode, true);
if (event.type == FileChangeType::Changed) { if (event.type == FileChangeType::Changed) {
if (mode == IndexMode::Normal) if (mode == IndexMode::Normal)
@ -57,7 +57,7 @@ void MessageHandler::workspace_didChangeWatchedFiles(
break; break;
} }
case FileChangeType::Deleted: case FileChangeType::Deleted:
pipeline::Index(path, {}, mode, false); pipeline::Index(path, {}, IndexMode::Delete, false);
manager->OnClose(path); manager->OnClose(path);
break; break;
} }

View File

@ -212,7 +212,6 @@ bool Indexer_Parse(SemaManager *completion, WorkingFiles *wfiles,
return false; return false;
} }
// must_exist is currently unused.
Project::Entry entry = Project::Entry entry =
project->FindEntry(request.path, true, request.must_exist); project->FindEntry(request.path, true, request.must_exist);
if (request.must_exist && entry.filename.empty()) if (request.must_exist && entry.filename.empty())
@ -222,25 +221,28 @@ bool Indexer_Parse(SemaManager *completion, WorkingFiles *wfiles,
std::string path_to_index = entry.filename; std::string path_to_index = entry.filename;
std::unique_ptr<IndexFile> prev; std::unique_ptr<IndexFile> prev;
bool deleted = false, no_linkage = g_config->index.initialNoLinkage || bool deleted = request.mode == IndexMode::Delete,
request.mode != IndexMode::Background; no_linkage = g_config->index.initialNoLinkage ||
request.mode != IndexMode::Background;
int reparse = 0; int reparse = 0;
std::optional<int64_t> write_time = LastWriteTime(path_to_index);
if (!write_time) {
deleted = true;
} else {
if (vfs->Stamp(path_to_index, *write_time, no_linkage ? 2 : 0))
reparse = 1;
if (request.path != path_to_index) {
std::optional<int64_t> mtime1 = LastWriteTime(request.path);
if (!mtime1)
deleted = true;
else if (vfs->Stamp(request.path, *mtime1, no_linkage ? 2 : 0))
reparse = 2;
}
}
if (deleted) if (deleted)
reparse = 2; reparse = 2;
else if (!(g_config->index.onChange && wfiles->GetFile(path_to_index))) {
std::optional<int64_t> write_time = LastWriteTime(path_to_index);
if (!write_time) {
deleted = true;
} else {
if (vfs->Stamp(path_to_index, *write_time, no_linkage ? 2 : 0))
reparse = 1;
if (request.path != path_to_index) {
std::optional<int64_t> mtime1 = LastWriteTime(request.path);
if (!mtime1)
deleted = true;
else if (vfs->Stamp(request.path, *mtime1, no_linkage ? 2 : 0))
reparse = 2;
}
}
}
if (g_config->index.onChange) { if (g_config->index.onChange) {
reparse = 2; reparse = 2;

View File

@ -33,6 +33,7 @@ struct VFS {
}; };
enum class IndexMode { enum class IndexMode {
Delete,
Background, Background,
OnChange, OnChange,
Normal, Normal,