fix: Fix source root panic in global state when checking out older git revs

This commit is contained in:
Lukas Wirth 2022-04-15 20:02:15 +02:00
parent 58660dee2a
commit f540d1c2aa

View file

@ -180,7 +180,7 @@ impl GlobalState {
// A file was added or deleted // A file was added or deleted
let mut has_structure_changes = false; let mut has_structure_changes = false;
let change = { let (change, changed_files) = {
let mut change = Change::new(); let mut change = Change::new();
let (vfs, line_endings_map) = &mut *self.vfs.write(); let (vfs, line_endings_map) = &mut *self.vfs.write();
let changed_files = vfs.take_changes(); let changed_files = vfs.take_changes();
@ -188,17 +188,7 @@ impl GlobalState {
return false; return false;
} }
for file in changed_files { for file in &changed_files {
if !file.is_created_or_deleted() {
// FIXME: https://github.com/rust-analyzer/rust-analyzer/issues/11357
let crates = self.analysis_host.raw_database().relevant_crates(file.file_id);
let crate_graph = self.analysis_host.raw_database().crate_graph();
if crates.iter().any(|&krate| !crate_graph[krate].proc_macro.is_empty()) {
self.proc_macro_changed = true;
}
}
if let Some(path) = vfs.file_path(file.file_id).as_path() { if let Some(path) = vfs.file_path(file.file_id).as_path() {
let path = path.to_path_buf(); let path = path.to_path_buf();
if reload::should_refresh_for_change(&path, file.change_kind) { if reload::should_refresh_for_change(&path, file.change_kind) {
@ -212,14 +202,11 @@ impl GlobalState {
let text = if file.exists() { let text = if file.exists() {
let bytes = vfs.file_contents(file.file_id).to_vec(); let bytes = vfs.file_contents(file.file_id).to_vec();
match String::from_utf8(bytes).ok() { String::from_utf8(bytes).ok().and_then(|text| {
Some(text) => { let (text, line_endings) = LineEndings::normalize(text);
let (text, line_endings) = LineEndings::normalize(text); line_endings_map.insert(file.file_id, line_endings);
line_endings_map.insert(file.file_id, line_endings); Some(Arc::new(text))
Some(Arc::new(text)) })
}
None => None,
}
} else { } else {
None None
}; };
@ -229,10 +216,19 @@ impl GlobalState {
let roots = self.source_root_config.partition(vfs); let roots = self.source_root_config.partition(vfs);
change.set_roots(roots); change.set_roots(roots);
} }
change (change, changed_files)
}; };
self.analysis_host.apply_change(change); self.analysis_host.apply_change(change);
let raw_database = &self.analysis_host.raw_database();
self.proc_macro_changed =
changed_files.iter().filter(|file| !file.is_created_or_deleted()).any(|file| {
let crates = raw_database.relevant_crates(file.file_id);
let crate_graph = raw_database.crate_graph();
crates.iter().any(|&krate| !crate_graph[krate].is_proc_macro)
});
true true
} }