Skip to content

Commit 117447f

Browse files
committed
Clarify update_extern_crate
1 parent 94e48f9 commit 117447f

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

compiler/rustc_metadata/src/rmeta/decoder.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,9 +1937,13 @@ impl CrateMetadata {
19371937
self.root.decode_target_modifiers(&self.blob).collect()
19381938
}
19391939

1940-
pub(crate) fn update_extern_crate(&mut self, new_extern_crate: ExternCrate) -> bool {
1940+
/// Keep `new_extern_crate` if it looks better in diagnostics
1941+
pub(crate) fn update_extern_crate_diagnostics(
1942+
&mut self,
1943+
new_extern_crate: ExternCrate,
1944+
) -> bool {
19411945
let update =
1942-
Some(new_extern_crate.rank()) > self.extern_crate.as_ref().map(ExternCrate::rank);
1946+
self.extern_crate.as_ref().is_none_or(|old| old.rank() < new_extern_crate.rank());
19431947
if update {
19441948
self.extern_crate = Some(new_extern_crate);
19451949
}

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -627,14 +627,32 @@ impl CStore {
627627
}
628628
}
629629

630-
pub(crate) fn update_extern_crate(&mut self, cnum: CrateNum, extern_crate: ExternCrate) {
630+
/// Track how an extern crate has been loaded. Called after resolving an import in the local crate.
631+
pub(crate) fn update_extern_crate(
632+
&mut self,
633+
cnum: CrateNum,
634+
extern_crate: ExternCrate,
635+
) {
636+
debug_assert_eq!(
637+
extern_crate.dependency_of, LOCAL_CRATE,
638+
"this function should not be called on transitive dependencies"
639+
);
640+
self.update_transitive_extern_crate_diagnostics(cnum, extern_crate);
641+
}
642+
643+
/// `CrateMetadata` uses `ExternCrate` only for diagnostics
644+
fn update_transitive_extern_crate_diagnostics(
645+
&mut self,
646+
cnum: CrateNum,
647+
extern_crate: ExternCrate,
648+
) {
631649
let cmeta = self.get_crate_data_mut(cnum);
632-
if cmeta.update_extern_crate(extern_crate) {
650+
if cmeta.update_extern_crate_diagnostics(extern_crate) {
633651
// Propagate the extern crate info to dependencies if it was updated.
634652
let extern_crate = ExternCrate { dependency_of: cnum, ..extern_crate };
635653
let dependencies = mem::take(&mut cmeta.dependencies);
636654
for &dep_cnum in &dependencies {
637-
self.update_extern_crate(dep_cnum, extern_crate);
655+
self.update_transitive_extern_crate_diagnostics(dep_cnum, extern_crate);
638656
}
639657
self.get_crate_data_mut(cnum).dependencies = dependencies;
640658
}

0 commit comments

Comments
 (0)