Skip to content

Commit 4820c40

Browse files
committed
Clarify update_extern_crate
1 parent 96ca9b6 commit 4820c40

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
@@ -630,14 +630,32 @@ impl CStore {
630630
}
631631
}
632632

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

0 commit comments

Comments
 (0)