mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-29 06:23:25 +00:00
fix: Fix source root panic in global state when checking out older git revs
This commit is contained in:
parent
58660dee2a
commit
f540d1c2aa
1 changed files with 17 additions and 21 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue