Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Clarify update_extern_crate
  • Loading branch information
kornelski committed Jul 28, 2025
commit 671e083391df7d7ea3b70c8030be578d17b5743b
8 changes: 6 additions & 2 deletions compiler/rustc_metadata/src/rmeta/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1937,9 +1937,13 @@ impl CrateMetadata {
self.root.decode_target_modifiers(&self.blob).collect()
}

pub(crate) fn update_extern_crate(&mut self, new_extern_crate: ExternCrate) -> bool {
/// Keep `new_extern_crate` if it looks better in diagnostics
pub(crate) fn update_extern_crate_diagnostics(
&mut self,
new_extern_crate: ExternCrate,
) -> bool {
let update =
Some(new_extern_crate.rank()) > self.extern_crate.as_ref().map(ExternCrate::rank);
self.extern_crate.as_ref().is_none_or(|old| old.rank() < new_extern_crate.rank());
if update {
self.extern_crate = Some(new_extern_crate);
}
Expand Down
24 changes: 21 additions & 3 deletions compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -627,14 +627,32 @@ impl CStore {
}
}

pub(crate) fn update_extern_crate(&mut self, cnum: CrateNum, extern_crate: ExternCrate) {
/// Track how an extern crate has been loaded. Called after resolving an import in the local crate.
pub(crate) fn update_extern_crate(
&mut self,
cnum: CrateNum,
extern_crate: ExternCrate,
) {
debug_assert_eq!(
extern_crate.dependency_of, LOCAL_CRATE,
"this function should not be called on transitive dependencies"
);
self.update_transitive_extern_crate_diagnostics(cnum, extern_crate);
}

/// `CrateMetadata` uses `ExternCrate` only for diagnostics
fn update_transitive_extern_crate_diagnostics(
&mut self,
cnum: CrateNum,
extern_crate: ExternCrate,
) {
let cmeta = self.get_crate_data_mut(cnum);
if cmeta.update_extern_crate(extern_crate) {
if cmeta.update_extern_crate_diagnostics(extern_crate) {
// Propagate the extern crate info to dependencies if it was updated.
let extern_crate = ExternCrate { dependency_of: cnum, ..extern_crate };
let dependencies = mem::take(&mut cmeta.dependencies);
for &dep_cnum in &dependencies {
self.update_extern_crate(dep_cnum, extern_crate);
self.update_transitive_extern_crate_diagnostics(dep_cnum, extern_crate);
}
self.get_crate_data_mut(cnum).dependencies = dependencies;
}
Expand Down