Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
13 changes: 10 additions & 3 deletions compiler/rustc_resolve/src/build_reduced_graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -720,13 +720,15 @@ impl<'a, 'ra, 'tcx> DefCollector<'a, 'ra, 'tcx> {
decls: Default::default(),
nested,
id,
def_id: feed.def_id(),
};

self.add_import(module_path, kind, use_tree.span(), item, root_span, item.id, vis);
}
ast::UseTreeKind::Glob(_) => {
if !ast::attr::contains_name(&item.attrs, sym::prelude_import) {
let kind = ImportKind::Glob { max_vis: CmCell::new(None), id };
let kind =
ImportKind::Glob { max_vis: CmCell::new(None), id, def_id: feed.def_id() };
self.add_import(prefix, kind, use_tree.span(), item, root_span, item.id, vis);
} else {
// Resolve the prelude import early.
Expand Down Expand Up @@ -1018,7 +1020,12 @@ impl<'a, 'ra, 'tcx> DefCollector<'a, 'ra, 'tcx> {
})
.unwrap_or((true, None, self.r.dummy_decl));
let import = self.r.arenas.alloc_import(ImportData {
kind: ImportKind::ExternCrate { source: orig_name, target: orig_ident, id: item.id },
kind: ImportKind::ExternCrate {
source: orig_name,
target: orig_ident,
id: item.id,
def_id: local_def_id,
},
root_id: item.id,
parent_scope,
imported_module: CmCell::new(module),
Expand Down Expand Up @@ -1270,7 +1277,7 @@ impl<'a, 'ra, 'tcx> DefCollector<'a, 'ra, 'tcx> {
if !ident.as_str().starts_with('_') {
self.r.unused_macros.insert(def_id, (node_id, ident));
let nrules = self.r.local_macro_map[&def_id].nrules;
self.r.unused_macro_rules.insert(node_id, DenseBitSet::new_filled(nrules));
self.r.unused_macro_rules.insert(node_id, (def_id, DenseBitSet::new_filled(nrules)));
}
}

Expand Down
3 changes: 1 addition & 2 deletions compiler/rustc_resolve/src/check_unused.rs
Original file line number Diff line number Diff line change
Expand Up @@ -431,8 +431,7 @@ impl Resolver<'_, '_> {
}
}
}
ImportKind::ExternCrate { id, .. } => {
let def_id = self.local_def_id(id);
ImportKind::ExternCrate { id, def_id, .. } => {
if self.extern_crate_map.get(&def_id).is_none_or(|&cnum| {
!tcx.is_compiler_builtins(cnum)
&& !tcx.is_panic_runtime(cnum)
Expand Down
9 changes: 3 additions & 6 deletions compiler/rustc_resolve/src/effective_visibilities.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,7 @@ impl Resolver<'_, '_> {
fn private_vis_import(&self, decl: Decl<'_>) -> Visibility {
let DeclKind::Import { import, .. } = decl.kind else { unreachable!() };
Visibility::Restricted(
import
.id()
.map(|id| self.nearest_normal_mod(self.local_def_id(id)))
.unwrap_or(CRATE_DEF_ID),
import.def_id().map(|id| self.nearest_normal_mod(id)).unwrap_or(CRATE_DEF_ID),
)
}

Expand Down Expand Up @@ -96,8 +93,8 @@ impl<'a, 'ra, 'tcx> EffectiveVisibilitiesVisitor<'a, 'ra, 'tcx> {
// is the maximum value among visibilities of declarations corresponding to that def id.
for (decl, eff_vis) in visitor.import_effective_visibilities.iter() {
let DeclKind::Import { import, .. } = decl.kind else { unreachable!() };
if let Some(node_id) = import.id() {
r.effective_visibilities.update_eff_vis(r.local_def_id(node_id), eff_vis, r.tcx)
if let Some(def_id) = import.def_id() {
r.effective_visibilities.update_eff_vis(def_id, eff_vis, r.tcx)
}
if decl.ambiguity.get().is_some() && eff_vis.is_public_at_level(Level::Reexported) {
exported_ambiguities.insert(*decl);
Expand Down
69 changes: 43 additions & 26 deletions compiler/rustc_resolve/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use rustc_hir::Attribute;
use rustc_hir::attrs::AttributeKind;
use rustc_hir::attrs::diagnostic::{CustomDiagnostic, Directive, FormatArgs};
use rustc_hir::def::{self, DefKind, PartialRes};
use rustc_hir::def_id::{DefId, LocalDefIdMap};
use rustc_hir::def_id::{DefId, LocalDefId, LocalDefIdMap};
use rustc_middle::metadata::{AmbigModChild, ModChild, Reexport};
use rustc_middle::span_bug;
use rustc_middle::ty::{TyCtxt, Visibility};
Expand Down Expand Up @@ -90,17 +90,20 @@ pub(crate) enum ImportKind<'ra> {
/// If this is the import for `foo::bar::a`, we would have the ID of the `UseTree`
/// for `a` in this field.
id: NodeId,
def_id: LocalDefId,
},
Glob {
// The visibility of the greatest re-export.
// n.b. `max_vis` is only used in `finalize_import` to check for re-export errors.
max_vis: CmCell<Option<Visibility>>,
id: NodeId,
def_id: LocalDefId,
},
ExternCrate {
source: Option<Symbol>,
target: Ident,
id: NodeId,
def_id: LocalDefId,
},
MacroUse {
/// A field has been added indicating whether it should be reported as a lint,
Expand All @@ -116,7 +119,7 @@ impl<'ra> std::fmt::Debug for ImportKind<'ra> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use ImportKind::*;
match self {
Single { source, target, decls, nested, id, .. } => f
Single { source, target, decls, nested, id, def_id } => f
.debug_struct("Single")
.field("source", source)
.field("target", target)
Expand All @@ -127,15 +130,20 @@ impl<'ra> std::fmt::Debug for ImportKind<'ra> {
)
.field("nested", nested)
.field("id", id)
.field("def_id", def_id)
.finish(),
Glob { max_vis, id } => {
f.debug_struct("Glob").field("max_vis", max_vis).field("id", id).finish()
}
ExternCrate { source, target, id } => f
Glob { max_vis, id, def_id } => f
.debug_struct("Glob")
.field("max_vis", max_vis)
.field("id", id)
.field("def_id", def_id)
.finish(),
ExternCrate { source, target, id, def_id } => f
.debug_struct("ExternCrate")
.field("source", source)
.field("target", target)
Comment thread
oli-obk marked this conversation as resolved.
.field("id", id)
.field("def_id", def_id)
.finish(),
MacroUse { warn_private } => {
f.debug_struct("MacroUse").field("warn_private", warn_private).finish()
Expand Down Expand Up @@ -260,12 +268,20 @@ impl<'ra> ImportData<'ra> {
}
}

pub(crate) fn simplify(&self, r: &Resolver<'_, '_>) -> Reexport {
let to_def_id = |id| r.local_def_id(id).to_def_id();
pub(crate) fn def_id(&self) -> Option<LocalDefId> {
match self.kind {
ImportKind::Single { def_id, .. }
| ImportKind::Glob { def_id, .. }
| ImportKind::ExternCrate { def_id, .. } => Some(def_id),
ImportKind::MacroUse { .. } | ImportKind::MacroExport => None,
}
}

pub(crate) fn simplify(&self) -> Reexport {
match self.kind {
ImportKind::Single { id, .. } => Reexport::Single(to_def_id(id)),
ImportKind::Glob { id, .. } => Reexport::Glob(to_def_id(id)),
ImportKind::ExternCrate { id, .. } => Reexport::ExternCrate(to_def_id(id)),
ImportKind::Single { def_id, .. } => Reexport::Single(def_id.to_def_id()),
ImportKind::Glob { def_id, .. } => Reexport::Glob(def_id.to_def_id()),
ImportKind::ExternCrate { def_id, .. } => Reexport::ExternCrate(def_id.to_def_id()),
ImportKind::MacroUse { .. } => Reexport::MacroUse,
ImportKind::MacroExport => Reexport::MacroExport,
}
Expand Down Expand Up @@ -340,13 +356,16 @@ struct UnresolvedImportError {

// Reexports of the form `pub use foo as bar;` where `foo` is `extern crate foo;`
// are permitted for backward-compatibility under a deprecation lint.
fn pub_use_of_private_extern_crate_hack(import: ImportSummary, decl: Decl<'_>) -> Option<NodeId> {
fn pub_use_of_private_extern_crate_hack(
import: ImportSummary,
decl: Decl<'_>,
) -> Option<LocalDefId> {
match (import.is_single, decl.kind) {
(true, DeclKind::Import { import: decl_import, .. })
if let ImportKind::ExternCrate { id, .. } = decl_import.kind
if let ImportKind::ExternCrate { def_id, .. } = decl_import.kind
&& import.vis.is_public() =>
{
Some(id)
Some(def_id)
}
_ => None,
}
Expand Down Expand Up @@ -845,8 +864,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
if binding.res() != Res::Err
&& glob_decl.res() != Res::Err
&& let DeclKind::Import { import: glob_import, .. } = glob_decl.kind
&& let Some(glob_import_id) = glob_import.id()
&& let glob_import_def_id = self.local_def_id(glob_import_id)
&& let Some(glob_import_def_id) = glob_import.def_id()
&& self.effective_visibilities.is_exported(glob_import_def_id)
&& glob_decl.vis().is_public()
&& !binding.vis().is_public()
Expand Down Expand Up @@ -875,7 +893,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {

if let DeclKind::Import { import, .. } = binding.kind
&& let Some(binding_id) = import.id()
&& let import_def_id = self.local_def_id(binding_id)
&& let import_def_id = import.def_id().unwrap()
&& self.effective_visibilities.is_exported(import_def_id)
&& let Res::Def(reexported_kind, reexported_def_id) = binding.res()
&& !matches!(reexported_kind, DefKind::Ctor(..))
Expand Down Expand Up @@ -1267,7 +1285,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {

let (ident, target, bindings, import_id) = match import.kind {
ImportKind::Single { source, target, ref decls, id, .. } => (source, target, decls, id),
ImportKind::Glob { ref max_vis, id } => {
ImportKind::Glob { ref max_vis, id, def_id } => {
if import.module_path.len() <= 1 {
// HACK(eddyb) `lint_if_path_starts_with_module` needs at least
// 2 segments, so the `resolve_path` above won't trigger it.
Expand All @@ -1294,7 +1312,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
if let Some(max_vis) = max_vis.get()
&& import.vis.greater_than(max_vis, self.tcx)
{
let def_id = self.local_def_id(id);
self.lint_buffer.buffer_lint(
UNUSED_IMPORTS,
id,
Expand Down Expand Up @@ -1614,7 +1631,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
if let Some(extern_crate_id) = pub_use_of_private_extern_crate_hack(import.summary(), decl)
{
let ImportKind::Single { id, .. } = import.kind else { unreachable!() };
let sugg = self.tcx.source_span(self.local_def_id(extern_crate_id)).shrink_to_lo();
let sugg = self.tcx.source_span(extern_crate_id).shrink_to_lo();
let diagnostic = crate::errors::PrivateExternCrateReexport { ident, sugg };
return Some(BufferedEarlyLint {
lint_id: LintId::of(PUB_USE_OF_PRIVATE_EXTERN_CRATE),
Expand Down Expand Up @@ -1656,7 +1673,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {

pub(crate) fn check_for_redundant_imports(&mut self, import: Import<'ra>) -> bool {
// This function is only called for single imports.
let ImportKind::Single { source, target, ref decls, id, .. } = import.kind else {
let ImportKind::Single { source, target, ref decls, id, def_id, .. } = import.kind else {
unreachable!()
};

Expand All @@ -1675,7 +1692,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
// Skip if the import is public or was used through non scope-based resolution,
// e.g. through a module-relative path.
if self.import_use_map.get(&import) == Some(&Used::Other)
|| self.effective_visibilities.is_exported(self.local_def_id(id))
|| self.effective_visibilities.is_exported(def_id)
{
return false;
}
Expand Down Expand Up @@ -1829,23 +1846,23 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
let mut children = Vec::new();
let mut ambig_children = Vec::new();

module.to_module().for_each_child(self, |this, ident, orig_ident_span, _, binding| {
module.to_module().for_each_child(self, |_this, ident, orig_ident_span, _, binding| {
let res = binding.res().expect_non_local();
if res != def::Res::Err {
let ident = ident.orig(orig_ident_span);
let child =
|reexport_chain| ModChild { ident, res, vis: binding.vis(), reexport_chain };
if let Some((ambig_binding1, ambig_binding2)) = binding.descent_to_ambiguity() {
let main = child(ambig_binding1.reexport_chain(this));
let main = child(ambig_binding1.reexport_chain());
let second = ModChild {
ident,
res: ambig_binding2.res().expect_non_local(),
vis: ambig_binding2.vis(),
reexport_chain: ambig_binding2.reexport_chain(this),
reexport_chain: ambig_binding2.reexport_chain(),
};
ambig_children.push(AmbigModChild { main, second })
} else {
children.push(child(binding.reexport_chain(this)));
children.push(child(binding.reexport_chain()));
}
}
});
Expand Down
14 changes: 6 additions & 8 deletions compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1171,11 +1171,11 @@ impl<'ra> DeclData<'ra> {
self.res().macro_kinds()
}

fn reexport_chain(self: Decl<'ra>, r: &Resolver<'_, '_>) -> SmallVec<[Reexport; 2]> {
fn reexport_chain(self: Decl<'ra>) -> SmallVec<[Reexport; 2]> {
let mut reexport_chain = SmallVec::new();
let mut next_binding = self;
while let DeclKind::Import { source_decl, import, .. } = next_binding.kind {
reexport_chain.push(import.simplify(r));
reexport_chain.push(import.simplify());
next_binding = source_decl;
}
reexport_chain
Expand Down Expand Up @@ -1405,8 +1405,8 @@ pub struct Resolver<'ra, 'tcx> {
local_macro_def_scopes: FxHashMap<LocalDefId, LocalModule<'ra>> = default::fx_hash_map(),
ast_transform_scopes: FxHashMap<LocalExpnId, LocalModule<'ra>> = default::fx_hash_map(),
unused_macros: FxIndexMap<LocalDefId, (NodeId, Ident)>,
/// A map from the macro to all its potentially unused arms.
unused_macro_rules: FxIndexMap<NodeId, DenseBitSet<usize>>,
/// A map from the macro to all its potentially unused arms and the `LocalDefId` of the macro itself.
unused_macro_rules: FxIndexMap<NodeId, (LocalDefId, DenseBitSet<usize>)>,
Comment thread
oli-obk marked this conversation as resolved.
proc_macro_stubs: FxHashSet<LocalDefId> = default::fx_hash_set(),
/// Traces collected during macro resolution and validated when it's complete.
single_segment_macro_resolutions:
Expand Down Expand Up @@ -2155,8 +2155,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
) -> &'tcx [LocalDefId] {
let mut import_ids: SmallVec<[LocalDefId; 1]> = smallvec![];
while let DeclKind::Import { import, source_decl, .. } = kind {
if let Some(node_id) = import.id() {
let def_id = self.local_def_id(node_id);
if let Some(def_id) = import.def_id() {
self.maybe_unused_trait_imports.insert(def_id);
import_ids.push(def_id);
}
Expand Down Expand Up @@ -2292,8 +2291,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {

#[inline]
fn add_to_glob_map(&mut self, import: Import<'_>, name: Symbol) {
if let ImportKind::Glob { id, .. } = import.kind {
let def_id = self.local_def_id(id);
if let ImportKind::Glob { def_id, .. } = import.kind {
self.glob_map.entry(def_id).or_default().insert(name);
}
}
Expand Down
5 changes: 2 additions & 3 deletions compiler/rustc_resolve/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
}

fn record_macro_rule_usage(&mut self, id: NodeId, rule_i: usize) {
if let Some(rules) = self.unused_macro_rules.get_mut(&id) {
if let Some((_, rules)) = self.unused_macro_rules.get_mut(&id) {
rules.remove(rule_i);
}
}
Expand All @@ -356,11 +356,10 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
self.unused_macro_rules.swap_remove(&node_id);
}

for (&node_id, unused_arms) in self.unused_macro_rules.iter() {
for (&node_id, (def_id, unused_arms)) in self.unused_macro_rules.iter() {
if unused_arms.is_empty() {
continue;
}
let def_id = self.local_def_id(node_id);
let m = &self.local_macro_map[&def_id];
let SyntaxExtensionKind::MacroRules(ref m) = m.ext.kind else {
continue;
Expand Down
Loading