mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-04 06:15:20 +00:00 
			
		
		
		
	Support indexing non-existent files in index.onChange:true mode
This commit is contained in:
		
							parent
							
								
									86a93b2d71
								
							
						
					
					
						commit
						ab6498e2ff
					
				@ -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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
 | 
				
			|||||||
@ -33,6 +33,7 @@ struct VFS {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum class IndexMode {
 | 
					enum class IndexMode {
 | 
				
			||||||
 | 
					  Delete,
 | 
				
			||||||
  Background,
 | 
					  Background,
 | 
				
			||||||
  OnChange,
 | 
					  OnChange,
 | 
				
			||||||
  Normal,
 | 
					  Normal,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user