1use std::mem;
4
5use rustc_ast::NodeId;
6use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
7use rustc_data_structures::intern::Interned;
8use rustc_errors::codes::*;
9use rustc_errors::{Applicability, MultiSpan, pluralize, struct_span_code_err};
10use rustc_hir::def::{self, DefKind, PartialRes};
11use rustc_hir::def_id::{DefId, LocalDefIdMap};
12use rustc_middle::metadata::{AmbigModChild, ModChild, Reexport};
13use rustc_middle::span_bug;
14use rustc_middle::ty::Visibility;
15use rustc_session::lint::BuiltinLintDiag;
16use rustc_session::lint::builtin::{
17 AMBIGUOUS_GLOB_REEXPORTS, EXPORTED_PRIVATE_DEPENDENCIES, HIDDEN_GLOB_REEXPORTS,
18 PUB_USE_OF_PRIVATE_EXTERN_CRATE, REDUNDANT_IMPORTS, UNUSED_IMPORTS,
19};
20use rustc_session::parse::feature_err;
21use rustc_span::edit_distance::find_best_match_for_name;
22use rustc_span::hygiene::LocalExpnId;
23use rustc_span::{Ident, Macros20NormalizedIdent, Span, Symbol, kw, sym};
24use tracing::debug;
25
26use crate::Namespace::{self, *};
27use crate::diagnostics::{DiagMode, Suggestion, import_candidates};
28use crate::errors::{
29 CannotBeReexportedCratePublic, CannotBeReexportedCratePublicNS, CannotBeReexportedPrivate,
30 CannotBeReexportedPrivateNS, CannotDetermineImportResolution, CannotGlobImportAllCrates,
31 ConsiderAddingMacroExport, ConsiderMarkingAsPub, ConsiderMarkingAsPubCrate,
32};
33use crate::ref_mut::CmCell;
34use crate::{
35 AmbiguityError, BindingKey, CmResolver, Decl, DeclData, DeclKind, Determinacy, Finalize,
36 ImportSuggestion, Module, ModuleOrUniformRoot, ParentScope, PathResult, PerNS, ResolutionError,
37 Resolver, ScopeSet, Segment, Used, module_to_string, names_to_string,
38};
39
40type Res = def::Res<NodeId>;
41
42#[derive(#[automatically_derived]
impl<'ra> ::core::clone::Clone for PendingDecl<'ra> {
#[inline]
fn clone(&self) -> PendingDecl<'ra> {
let _: ::core::clone::AssertParamIsClone<Option<Decl<'ra>>>;
*self
}
}Clone, #[automatically_derived]
impl<'ra> ::core::marker::Copy for PendingDecl<'ra> { }Copy, #[automatically_derived]
impl<'ra> ::core::default::Default for PendingDecl<'ra> {
#[inline]
fn default() -> PendingDecl<'ra> { Self::Pending }
}Default, #[automatically_derived]
impl<'ra> ::core::cmp::PartialEq for PendingDecl<'ra> {
#[inline]
fn eq(&self, other: &PendingDecl<'ra>) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(PendingDecl::Ready(__self_0), PendingDecl::Ready(__arg1_0))
=> __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq)]
45pub(crate) enum PendingDecl<'ra> {
46 Ready(Option<Decl<'ra>>),
47 #[default]
48 Pending,
49}
50
51impl<'ra> PendingDecl<'ra> {
52 pub(crate) fn decl(self) -> Option<Decl<'ra>> {
53 match self {
54 PendingDecl::Ready(decl) => decl,
55 PendingDecl::Pending => None,
56 }
57 }
58}
59
60#[derive(#[automatically_derived]
impl<'ra> ::core::clone::Clone for ImportKind<'ra> {
#[inline]
fn clone(&self) -> ImportKind<'ra> {
match self {
ImportKind::Single {
source: __self_0,
target: __self_1,
decls: __self_2,
type_ns_only: __self_3,
nested: __self_4,
id: __self_5 } =>
ImportKind::Single {
source: ::core::clone::Clone::clone(__self_0),
target: ::core::clone::Clone::clone(__self_1),
decls: ::core::clone::Clone::clone(__self_2),
type_ns_only: ::core::clone::Clone::clone(__self_3),
nested: ::core::clone::Clone::clone(__self_4),
id: ::core::clone::Clone::clone(__self_5),
},
ImportKind::Glob { max_vis: __self_0, id: __self_1 } =>
ImportKind::Glob {
max_vis: ::core::clone::Clone::clone(__self_0),
id: ::core::clone::Clone::clone(__self_1),
},
ImportKind::ExternCrate {
source: __self_0, target: __self_1, id: __self_2 } =>
ImportKind::ExternCrate {
source: ::core::clone::Clone::clone(__self_0),
target: ::core::clone::Clone::clone(__self_1),
id: ::core::clone::Clone::clone(__self_2),
},
ImportKind::MacroUse { warn_private: __self_0 } =>
ImportKind::MacroUse {
warn_private: ::core::clone::Clone::clone(__self_0),
},
ImportKind::MacroExport => ImportKind::MacroExport,
}
}
}Clone)]
62pub(crate) enum ImportKind<'ra> {
63 Single {
64 source: Ident,
66 target: Ident,
69 decls: PerNS<CmCell<PendingDecl<'ra>>>,
71 type_ns_only: bool,
73 nested: bool,
75 id: NodeId,
87 },
88 Glob {
89 max_vis: CmCell<Option<Visibility>>,
92 id: NodeId,
93 },
94 ExternCrate {
95 source: Option<Symbol>,
96 target: Ident,
97 id: NodeId,
98 },
99 MacroUse {
100 warn_private: bool,
103 },
104 MacroExport,
105}
106
107impl<'ra> std::fmt::Debug for ImportKind<'ra> {
110 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
111 use ImportKind::*;
112 match self {
113 Single { source, target, decls, type_ns_only, nested, id, .. } => f
114 .debug_struct("Single")
115 .field("source", source)
116 .field("target", target)
117 .field(
119 "decls",
120 &decls.clone().map(|b| b.into_inner().decl().map(|_| format_args!("..")format_args!(".."))),
121 )
122 .field("type_ns_only", type_ns_only)
123 .field("nested", nested)
124 .field("id", id)
125 .finish(),
126 Glob { max_vis, id } => {
127 f.debug_struct("Glob").field("max_vis", max_vis).field("id", id).finish()
128 }
129 ExternCrate { source, target, id } => f
130 .debug_struct("ExternCrate")
131 .field("source", source)
132 .field("target", target)
133 .field("id", id)
134 .finish(),
135 MacroUse { warn_private } => {
136 f.debug_struct("MacroUse").field("warn_private", warn_private).finish()
137 }
138 MacroExport => f.debug_struct("MacroExport").finish(),
139 }
140 }
141}
142
143#[derive(#[automatically_derived]
impl<'ra> ::core::fmt::Debug for ImportData<'ra> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["kind", "root_id", "use_span", "use_span_with_attributes",
"has_attributes", "span", "root_span", "parent_scope",
"module_path", "imported_module", "vis", "vis_span"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.kind, &self.root_id, &self.use_span,
&self.use_span_with_attributes, &self.has_attributes,
&self.span, &self.root_span, &self.parent_scope,
&self.module_path, &self.imported_module, &self.vis,
&&self.vis_span];
::core::fmt::Formatter::debug_struct_fields_finish(f, "ImportData",
names, values)
}
}Debug, #[automatically_derived]
impl<'ra> ::core::clone::Clone for ImportData<'ra> {
#[inline]
fn clone(&self) -> ImportData<'ra> {
ImportData {
kind: ::core::clone::Clone::clone(&self.kind),
root_id: ::core::clone::Clone::clone(&self.root_id),
use_span: ::core::clone::Clone::clone(&self.use_span),
use_span_with_attributes: ::core::clone::Clone::clone(&self.use_span_with_attributes),
has_attributes: ::core::clone::Clone::clone(&self.has_attributes),
span: ::core::clone::Clone::clone(&self.span),
root_span: ::core::clone::Clone::clone(&self.root_span),
parent_scope: ::core::clone::Clone::clone(&self.parent_scope),
module_path: ::core::clone::Clone::clone(&self.module_path),
imported_module: ::core::clone::Clone::clone(&self.imported_module),
vis: ::core::clone::Clone::clone(&self.vis),
vis_span: ::core::clone::Clone::clone(&self.vis_span),
}
}
}Clone)]
145pub(crate) struct ImportData<'ra> {
146 pub kind: ImportKind<'ra>,
147
148 pub root_id: NodeId,
158
159 pub use_span: Span,
161
162 pub use_span_with_attributes: Span,
164
165 pub has_attributes: bool,
167
168 pub span: Span,
170
171 pub root_span: Span,
173
174 pub parent_scope: ParentScope<'ra>,
175 pub module_path: Vec<Segment>,
176 pub imported_module: CmCell<Option<ModuleOrUniformRoot<'ra>>>,
185 pub vis: Visibility,
186
187 pub vis_span: Span,
189}
190
191pub(crate) type Import<'ra> = Interned<'ra, ImportData<'ra>>;
194
195impl std::hash::Hash for ImportData<'_> {
200 fn hash<H>(&self, _: &mut H)
201 where
202 H: std::hash::Hasher,
203 {
204 ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
205 }
206}
207
208impl<'ra> ImportData<'ra> {
209 pub(crate) fn is_glob(&self) -> bool {
210 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
ImportKind::Glob { .. } => true,
_ => false,
}matches!(self.kind, ImportKind::Glob { .. })
211 }
212
213 pub(crate) fn is_nested(&self) -> bool {
214 match self.kind {
215 ImportKind::Single { nested, .. } => nested,
216 _ => false,
217 }
218 }
219
220 pub(crate) fn id(&self) -> Option<NodeId> {
221 match self.kind {
222 ImportKind::Single { id, .. }
223 | ImportKind::Glob { id, .. }
224 | ImportKind::ExternCrate { id, .. } => Some(id),
225 ImportKind::MacroUse { .. } | ImportKind::MacroExport => None,
226 }
227 }
228
229 pub(crate) fn simplify(&self, r: &Resolver<'_, '_>) -> Reexport {
230 let to_def_id = |id| r.local_def_id(id).to_def_id();
231 match self.kind {
232 ImportKind::Single { id, .. } => Reexport::Single(to_def_id(id)),
233 ImportKind::Glob { id, .. } => Reexport::Glob(to_def_id(id)),
234 ImportKind::ExternCrate { id, .. } => Reexport::ExternCrate(to_def_id(id)),
235 ImportKind::MacroUse { .. } => Reexport::MacroUse,
236 ImportKind::MacroExport => Reexport::MacroExport,
237 }
238 }
239}
240
241#[derive(#[automatically_derived]
impl<'ra> ::core::clone::Clone for NameResolution<'ra> {
#[inline]
fn clone(&self) -> NameResolution<'ra> {
NameResolution {
single_imports: ::core::clone::Clone::clone(&self.single_imports),
non_glob_decl: ::core::clone::Clone::clone(&self.non_glob_decl),
glob_decl: ::core::clone::Clone::clone(&self.glob_decl),
}
}
}Clone, #[automatically_derived]
impl<'ra> ::core::default::Default for NameResolution<'ra> {
#[inline]
fn default() -> NameResolution<'ra> {
NameResolution {
single_imports: ::core::default::Default::default(),
non_glob_decl: ::core::default::Default::default(),
glob_decl: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl<'ra> ::core::fmt::Debug for NameResolution<'ra> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"NameResolution", "single_imports", &self.single_imports,
"non_glob_decl", &self.non_glob_decl, "glob_decl",
&&self.glob_decl)
}
}Debug)]
243pub(crate) struct NameResolution<'ra> {
244 pub single_imports: FxIndexSet<Import<'ra>>,
247 pub non_glob_decl: Option<Decl<'ra>>,
249 pub glob_decl: Option<Decl<'ra>>,
251}
252
253impl<'ra> NameResolution<'ra> {
254 pub(crate) fn binding(&self) -> Option<Decl<'ra>> {
256 self.best_decl().and_then(|binding| {
257 if !binding.is_glob_import() || self.single_imports.is_empty() {
258 Some(binding)
259 } else {
260 None
261 }
262 })
263 }
264
265 pub(crate) fn best_decl(&self) -> Option<Decl<'ra>> {
266 self.non_glob_decl.or(self.glob_decl)
267 }
268}
269
270#[derive(#[automatically_derived]
impl ::core::fmt::Debug for UnresolvedImportError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["span", "label", "note", "suggestion", "candidates", "segment",
"module"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.span, &self.label, &self.note, &self.suggestion,
&self.candidates, &self.segment, &&self.module];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"UnresolvedImportError", names, values)
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for UnresolvedImportError {
#[inline]
fn clone(&self) -> UnresolvedImportError {
UnresolvedImportError {
span: ::core::clone::Clone::clone(&self.span),
label: ::core::clone::Clone::clone(&self.label),
note: ::core::clone::Clone::clone(&self.note),
suggestion: ::core::clone::Clone::clone(&self.suggestion),
candidates: ::core::clone::Clone::clone(&self.candidates),
segment: ::core::clone::Clone::clone(&self.segment),
module: ::core::clone::Clone::clone(&self.module),
}
}
}Clone)]
273struct UnresolvedImportError {
274 span: Span,
275 label: Option<String>,
276 note: Option<String>,
277 suggestion: Option<Suggestion>,
278 candidates: Option<Vec<ImportSuggestion>>,
279 segment: Option<Symbol>,
280 module: Option<DefId>,
282}
283
284fn pub_use_of_private_extern_crate_hack(import: Import<'_>, decl: Decl<'_>) -> Option<NodeId> {
287 match (&import.kind, &decl.kind) {
288 (ImportKind::Single { .. }, DeclKind::Import { import: decl_import, .. })
289 if let ImportKind::ExternCrate { id, .. } = decl_import.kind
290 && import.vis.is_public() =>
291 {
292 Some(id)
293 }
294 _ => None,
295 }
296}
297
298fn remove_same_import<'ra>(d1: Decl<'ra>, d2: Decl<'ra>) -> (Decl<'ra>, Decl<'ra>) {
300 if let DeclKind::Import { import: import1, source_decl: d1_next } = d1.kind
301 && let DeclKind::Import { import: import2, source_decl: d2_next } = d2.kind
302 && import1 == import2
303 {
304 match (&d1.expansion, &d2.expansion) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(d1.expansion, d2.expansion);
305 match (&d1.span, &d2.span) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(d1.span, d2.span);
306 if d1.ambiguity.get() != d2.ambiguity.get() {
307 if !d1.ambiguity.get().is_some() {
::core::panicking::panic("assertion failed: d1.ambiguity.get().is_some()")
};assert!(d1.ambiguity.get().is_some());
308 if !d2.ambiguity.get().is_none() {
::core::panicking::panic("assertion failed: d2.ambiguity.get().is_none()")
};assert!(d2.ambiguity.get().is_none());
309 }
310 remove_same_import(d1_next, d2_next)
314 } else {
315 (d1, d2)
316 }
317}
318
319impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
320 pub(crate) fn new_import_decl(&self, decl: Decl<'ra>, import: Import<'ra>) -> Decl<'ra> {
323 let import_vis = import.vis.to_def_id();
324 let vis = if decl.vis().is_at_least(import_vis, self.tcx)
325 || pub_use_of_private_extern_crate_hack(import, decl).is_some()
326 {
327 import_vis
328 } else {
329 decl.vis()
330 };
331
332 if let ImportKind::Glob { ref max_vis, .. } = import.kind
333 && (vis == import_vis
334 || max_vis.get().is_none_or(|max_vis| vis.is_at_least(max_vis, self.tcx)))
335 {
336 max_vis.set_unchecked(Some(vis.expect_local()))
337 }
338
339 self.arenas.alloc_decl(DeclData {
340 kind: DeclKind::Import { source_decl: decl, import },
341 ambiguity: CmCell::new(None),
342 warn_ambiguity: CmCell::new(false),
343 span: import.span,
344 vis: CmCell::new(vis),
345 expansion: import.parent_scope.expansion,
346 parent_module: Some(import.parent_scope.module),
347 })
348 }
349
350 fn select_glob_decl(
353 &self,
354 old_glob_decl: Decl<'ra>,
355 glob_decl: Decl<'ra>,
356 warn_ambiguity: bool,
357 ) -> Decl<'ra> {
358 if !glob_decl.is_glob_import() {
::core::panicking::panic("assertion failed: glob_decl.is_glob_import()")
};assert!(glob_decl.is_glob_import());
359 if !old_glob_decl.is_glob_import() {
::core::panicking::panic("assertion failed: old_glob_decl.is_glob_import()")
};assert!(old_glob_decl.is_glob_import());
360 match (&glob_decl, &old_glob_decl) {
(left_val, right_val) => {
if *left_val == *right_val {
let kind = ::core::panicking::AssertKind::Ne;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_ne!(glob_decl, old_glob_decl);
361 let (old_deep_decl, deep_decl) = remove_same_import(old_glob_decl, glob_decl);
378 if deep_decl != glob_decl {
379 match (&old_deep_decl, &old_glob_decl) {
(left_val, right_val) => {
if *left_val == *right_val {
let kind = ::core::panicking::AssertKind::Ne;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_ne!(old_deep_decl, old_glob_decl);
381 if old_glob_decl.ambiguity.get().is_some() && glob_decl.ambiguity.get().is_none() {
387 glob_decl.ambiguity.set_unchecked(old_glob_decl.ambiguity.get());
389 }
390 if glob_decl.is_ambiguity_recursive() {
391 glob_decl.warn_ambiguity.set_unchecked(true);
392 }
393 glob_decl
394 } else if glob_decl.res() != old_glob_decl.res() {
395 old_glob_decl.ambiguity.set_unchecked(Some(glob_decl));
396 old_glob_decl.warn_ambiguity.set_unchecked(warn_ambiguity);
397 if warn_ambiguity {
398 old_glob_decl
399 } else {
400 self.arenas.alloc_decl((*old_glob_decl).clone())
404 }
405 } else if !old_glob_decl.vis().is_at_least(glob_decl.vis(), self.tcx) {
406 glob_decl
410 } else if glob_decl.is_ambiguity_recursive() && !old_glob_decl.is_ambiguity_recursive() {
411 old_glob_decl.ambiguity.set_unchecked(Some(glob_decl));
413 old_glob_decl.warn_ambiguity.set_unchecked(true);
414 old_glob_decl
415 } else {
416 old_glob_decl
417 }
418 }
419
420 pub(crate) fn try_plant_decl_into_local_module(
423 &mut self,
424 ident: Macros20NormalizedIdent,
425 ns: Namespace,
426 decl: Decl<'ra>,
427 warn_ambiguity: bool,
428 ) -> Result<(), Decl<'ra>> {
429 let module = decl.parent_module.unwrap();
430 let res = decl.res();
431 self.check_reserved_macro_name(ident.0, res);
432 let key = BindingKey::new_disambiguated(ident, ns, || {
436 module.underscore_disambiguator.update_unchecked(|d| d + 1);
437 module.underscore_disambiguator.get()
438 });
439 self.update_local_resolution(module, key, warn_ambiguity, |this, resolution| {
440 if let Some(old_decl) = resolution.best_decl() {
441 match (&decl, &old_decl) {
(left_val, right_val) => {
if *left_val == *right_val {
let kind = ::core::panicking::AssertKind::Ne;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_ne!(decl, old_decl);
442 if !!decl.warn_ambiguity.get() {
::core::panicking::panic("assertion failed: !decl.warn_ambiguity.get()")
};assert!(!decl.warn_ambiguity.get());
443 if res == Res::Err && old_decl.res() != Res::Err {
444 return Ok(());
446 }
447 match (old_decl.is_glob_import(), decl.is_glob_import()) {
448 (true, true) => {
449 resolution.glob_decl =
450 Some(this.select_glob_decl(old_decl, decl, warn_ambiguity));
451 }
452 (old_glob @ true, false) | (old_glob @ false, true) => {
453 let (glob_decl, non_glob_decl) =
454 if old_glob { (old_decl, decl) } else { (decl, old_decl) };
455 resolution.non_glob_decl = Some(non_glob_decl);
456 if let Some(old_glob_decl) = resolution.glob_decl
457 && old_glob_decl != glob_decl
458 {
459 resolution.glob_decl =
460 Some(this.select_glob_decl(old_glob_decl, glob_decl, false));
461 } else {
462 resolution.glob_decl = Some(glob_decl);
463 }
464 }
465 (false, false) => {
466 return Err(old_decl);
467 }
468 }
469 } else {
470 if decl.is_glob_import() {
471 resolution.glob_decl = Some(decl);
472 } else {
473 resolution.non_glob_decl = Some(decl);
474 }
475 }
476
477 Ok(())
478 })
479 }
480
481 fn update_local_resolution<T, F>(
484 &mut self,
485 module: Module<'ra>,
486 key: BindingKey,
487 warn_ambiguity: bool,
488 f: F,
489 ) -> T
490 where
491 F: FnOnce(&Resolver<'ra, 'tcx>, &mut NameResolution<'ra>) -> T,
492 {
493 let (binding, t, warn_ambiguity) = {
496 let resolution = &mut *self.resolution_or_default(module, key).borrow_mut_unchecked();
497 let old_decl = resolution.binding();
498
499 let t = f(self, resolution);
500
501 if let Some(binding) = resolution.binding()
502 && old_decl != Some(binding)
503 {
504 (binding, t, warn_ambiguity || old_decl.is_some())
505 } else {
506 return t;
507 }
508 };
509
510 let Ok(glob_importers) = module.glob_importers.try_borrow_mut_unchecked() else {
511 return t;
512 };
513
514 for import in glob_importers.iter() {
516 let mut ident = key.ident;
517 let scope = match ident.0.span.reverse_glob_adjust(module.expansion, import.span) {
518 Some(Some(def)) => self.expn_def_scope(def),
519 Some(None) => import.parent_scope.module,
520 None => continue,
521 };
522 if self.is_accessible_from(binding.vis(), scope) {
523 let import_decl = self.new_import_decl(binding, *import);
524 let _ = self.try_plant_decl_into_local_module(
525 ident,
526 key.ns,
527 import_decl,
528 warn_ambiguity,
529 );
530 }
531 }
532
533 t
534 }
535
536 fn import_dummy_binding(&mut self, import: Import<'ra>, is_indeterminate: bool) {
539 if let ImportKind::Single { target, ref decls, .. } = import.kind {
540 if !(is_indeterminate || decls.iter().all(|d| d.get().decl().is_none())) {
541 return; }
543 let dummy_decl = self.dummy_decl;
544 let dummy_decl = self.new_import_decl(dummy_decl, import);
545 self.per_ns(|this, ns| {
546 let module = import.parent_scope.module;
547 let ident = Macros20NormalizedIdent::new(target);
548 let _ = this.try_plant_decl_into_local_module(ident, ns, dummy_decl, false);
549 if target.name != kw::Underscore {
551 let key = BindingKey::new(ident, ns);
552 this.update_local_resolution(module, key, false, |_, resolution| {
553 resolution.single_imports.swap_remove(&import);
554 })
555 }
556 });
557 self.record_use(target, dummy_decl, Used::Other);
558 } else if import.imported_module.get().is_none() {
559 self.import_use_map.insert(import, Used::Other);
560 if let Some(id) = import.id() {
561 self.used_imports.insert(id);
562 }
563 }
564 }
565
566 pub(crate) fn resolve_imports(&mut self) {
577 let mut prev_indeterminate_count = usize::MAX;
578 let mut indeterminate_count = self.indeterminate_imports.len() * 3;
579 while indeterminate_count < prev_indeterminate_count {
580 prev_indeterminate_count = indeterminate_count;
581 indeterminate_count = 0;
582 self.assert_speculative = true;
583 for import in mem::take(&mut self.indeterminate_imports) {
584 let import_indeterminate_count = self.cm().resolve_import(import);
585 indeterminate_count += import_indeterminate_count;
586 match import_indeterminate_count {
587 0 => self.determined_imports.push(import),
588 _ => self.indeterminate_imports.push(import),
589 }
590 }
591 self.assert_speculative = false;
592 }
593 }
594
595 pub(crate) fn finalize_imports(&mut self) {
596 let mut module_children = Default::default();
597 let mut ambig_module_children = Default::default();
598 for module in &self.local_modules {
599 self.finalize_resolutions_in(*module, &mut module_children, &mut ambig_module_children);
600 }
601 self.module_children = module_children;
602 self.ambig_module_children = ambig_module_children;
603
604 let mut seen_spans = FxHashSet::default();
605 let mut errors = ::alloc::vec::Vec::new()vec![];
606 let mut prev_root_id: NodeId = NodeId::ZERO;
607 let determined_imports = mem::take(&mut self.determined_imports);
608 let indeterminate_imports = mem::take(&mut self.indeterminate_imports);
609
610 let mut glob_error = false;
611 for (is_indeterminate, import) in determined_imports
612 .iter()
613 .map(|i| (false, i))
614 .chain(indeterminate_imports.iter().map(|i| (true, i)))
615 {
616 let unresolved_import_error = self.finalize_import(*import);
617 self.import_dummy_binding(*import, is_indeterminate);
620
621 let Some(err) = unresolved_import_error else { continue };
622
623 glob_error |= import.is_glob();
624
625 if let ImportKind::Single { source, ref decls, .. } = import.kind
626 && source.name == kw::SelfLower
627 && let PendingDecl::Ready(None) = decls.value_ns.get()
629 {
630 continue;
631 }
632
633 if prev_root_id != NodeId::ZERO && prev_root_id != import.root_id && !errors.is_empty()
634 {
635 self.throw_unresolved_import_error(errors, glob_error);
638 errors = ::alloc::vec::Vec::new()vec![];
639 }
640 if seen_spans.insert(err.span) {
641 errors.push((*import, err));
642 prev_root_id = import.root_id;
643 }
644 }
645
646 if !errors.is_empty() {
647 self.throw_unresolved_import_error(errors, glob_error);
648 return;
649 }
650
651 for import in &indeterminate_imports {
652 let path = import_path_to_string(
653 &import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
654 &import.kind,
655 import.span,
656 );
657 if path.contains("::") {
660 let err = UnresolvedImportError {
661 span: import.span,
662 label: None,
663 note: None,
664 suggestion: None,
665 candidates: None,
666 segment: None,
667 module: None,
668 };
669 errors.push((*import, err))
670 }
671 }
672
673 if !errors.is_empty() {
674 self.throw_unresolved_import_error(errors, glob_error);
675 }
676 }
677
678 pub(crate) fn lint_reexports(&mut self, exported_ambiguities: FxHashSet<Decl<'ra>>) {
679 for module in &self.local_modules {
680 for (key, resolution) in self.resolutions(*module).borrow().iter() {
681 let resolution = resolution.borrow();
682 let Some(binding) = resolution.best_decl() else { continue };
683
684 if let DeclKind::Import { import, .. } = binding.kind
685 && let Some(amb_binding) = binding.ambiguity.get()
686 && binding.res() != Res::Err
687 && exported_ambiguities.contains(&binding)
688 {
689 self.lint_buffer.buffer_lint(
690 AMBIGUOUS_GLOB_REEXPORTS,
691 import.root_id,
692 import.root_span,
693 BuiltinLintDiag::AmbiguousGlobReexports {
694 name: key.ident.to_string(),
695 namespace: key.ns.descr().to_string(),
696 first_reexport_span: import.root_span,
697 duplicate_reexport_span: amb_binding.span,
698 },
699 );
700 }
701
702 if let Some(glob_decl) = resolution.glob_decl
703 && resolution.non_glob_decl.is_some()
704 {
705 if binding.res() != Res::Err
706 && glob_decl.res() != Res::Err
707 && let DeclKind::Import { import: glob_import, .. } = glob_decl.kind
708 && let Some(glob_import_id) = glob_import.id()
709 && let glob_import_def_id = self.local_def_id(glob_import_id)
710 && self.effective_visibilities.is_exported(glob_import_def_id)
711 && glob_decl.vis().is_public()
712 && !binding.vis().is_public()
713 {
714 let binding_id = match binding.kind {
715 DeclKind::Def(res) => {
716 Some(self.def_id_to_node_id(res.def_id().expect_local()))
717 }
718 DeclKind::Import { import, .. } => import.id(),
719 };
720 if let Some(binding_id) = binding_id {
721 self.lint_buffer.buffer_lint(
722 HIDDEN_GLOB_REEXPORTS,
723 binding_id,
724 binding.span,
725 BuiltinLintDiag::HiddenGlobReexports {
726 name: key.ident.name.to_string(),
727 namespace: key.ns.descr().to_owned(),
728 glob_reexport_span: glob_decl.span,
729 private_item_span: binding.span,
730 },
731 );
732 }
733 }
734 }
735
736 if let DeclKind::Import { import, .. } = binding.kind
737 && let Some(binding_id) = import.id()
738 && let import_def_id = self.local_def_id(binding_id)
739 && self.effective_visibilities.is_exported(import_def_id)
740 && let Res::Def(reexported_kind, reexported_def_id) = binding.res()
741 && !#[allow(non_exhaustive_omitted_patterns)] match reexported_kind {
DefKind::Ctor(..) => true,
_ => false,
}matches!(reexported_kind, DefKind::Ctor(..))
742 && !reexported_def_id.is_local()
743 && self.tcx.is_private_dep(reexported_def_id.krate)
744 {
745 self.lint_buffer.buffer_lint(
746 EXPORTED_PRIVATE_DEPENDENCIES,
747 binding_id,
748 binding.span,
749 crate::errors::ReexportPrivateDependency {
750 name: key.ident.name,
751 kind: binding.res().descr(),
752 krate: self.tcx.crate_name(reexported_def_id.krate),
753 },
754 );
755 }
756 }
757 }
758 }
759
760 fn throw_unresolved_import_error(
761 &mut self,
762 mut errors: Vec<(Import<'_>, UnresolvedImportError)>,
763 glob_error: bool,
764 ) {
765 errors.retain(|(_import, err)| match err.module {
766 Some(def_id) if self.mods_with_parse_errors.contains(&def_id) => false,
768 _ => err.segment != Some(kw::Underscore),
771 });
772 if errors.is_empty() {
773 self.tcx.dcx().delayed_bug("expected a parse or \"`_` can't be an identifier\" error");
774 return;
775 }
776
777 let span = MultiSpan::from_spans(errors.iter().map(|(_, err)| err.span).collect());
778
779 let paths = errors
780 .iter()
781 .map(|(import, err)| {
782 let path = import_path_to_string(
783 &import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
784 &import.kind,
785 err.span,
786 );
787 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", path))
})format!("`{path}`")
788 })
789 .collect::<Vec<_>>();
790 let msg = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unresolved import{0} {1}",
if paths.len() == 1 { "" } else { "s" }, paths.join(", ")))
})format!("unresolved import{} {}", pluralize!(paths.len()), paths.join(", "),);
791
792 let mut diag = {
self.dcx().struct_span_err(span,
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", msg))
})).with_code(E0432)
}struct_span_code_err!(self.dcx(), span, E0432, "{msg}");
793
794 if let Some((_, UnresolvedImportError { note: Some(note), .. })) = errors.iter().last() {
795 diag.note(note.clone());
796 }
797
798 const MAX_LABEL_COUNT: usize = 10;
800
801 for (import, err) in errors.into_iter().take(MAX_LABEL_COUNT) {
802 if let Some(label) = err.label {
803 diag.span_label(err.span, label);
804 }
805
806 if let Some((suggestions, msg, applicability)) = err.suggestion {
807 if suggestions.is_empty() {
808 diag.help(msg);
809 continue;
810 }
811 diag.multipart_suggestion(msg, suggestions, applicability);
812 }
813
814 if let Some(candidates) = &err.candidates {
815 match &import.kind {
816 ImportKind::Single { nested: false, source, target, .. } => import_candidates(
817 self.tcx,
818 &mut diag,
819 Some(err.span),
820 candidates,
821 DiagMode::Import { append: false, unresolved_import: true },
822 (source != target)
823 .then(|| ::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" as {0}", target))
})format!(" as {target}"))
824 .as_deref()
825 .unwrap_or(""),
826 ),
827 ImportKind::Single { nested: true, source, target, .. } => {
828 import_candidates(
829 self.tcx,
830 &mut diag,
831 None,
832 candidates,
833 DiagMode::Normal,
834 (source != target)
835 .then(|| ::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" as {0}", target))
})format!(" as {target}"))
836 .as_deref()
837 .unwrap_or(""),
838 );
839 }
840 _ => {}
841 }
842 }
843
844 if #[allow(non_exhaustive_omitted_patterns)] match import.kind {
ImportKind::Single { .. } => true,
_ => false,
}matches!(import.kind, ImportKind::Single { .. })
845 && let Some(segment) = err.segment
846 && let Some(module) = err.module
847 {
848 self.find_cfg_stripped(&mut diag, &segment, module)
849 }
850 }
851
852 let guar = diag.emit();
853 if glob_error {
854 self.glob_error = Some(guar);
855 }
856 }
857
858 fn resolve_import<'r>(mut self: CmResolver<'r, 'ra, 'tcx>, import: Import<'ra>) -> usize {
865 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_resolve/src/imports.rs:865",
"rustc_resolve::imports", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_resolve/src/imports.rs"),
::tracing_core::__macro_support::Option::Some(865u32),
::tracing_core::__macro_support::Option::Some("rustc_resolve::imports"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("(resolving import for module) resolving import `{0}::...` in `{1}`",
Segment::names_to_string(&import.module_path),
module_to_string(import.parent_scope.module).unwrap_or_else(||
"???".to_string())) as &dyn Value))])
});
} else { ; }
};debug!(
866 "(resolving import for module) resolving import `{}::...` in `{}`",
867 Segment::names_to_string(&import.module_path),
868 module_to_string(import.parent_scope.module).unwrap_or_else(|| "???".to_string()),
869 );
870 let module = if let Some(module) = import.imported_module.get() {
871 module
872 } else {
873 let path_res = self.reborrow().maybe_resolve_path(
874 &import.module_path,
875 None,
876 &import.parent_scope,
877 Some(import),
878 );
879
880 match path_res {
881 PathResult::Module(module) => module,
882 PathResult::Indeterminate => return 3,
883 PathResult::NonModule(..) | PathResult::Failed { .. } => return 0,
884 }
885 };
886
887 import.imported_module.set_unchecked(Some(module));
888 let (source, target, bindings, type_ns_only) = match import.kind {
889 ImportKind::Single { source, target, ref decls, type_ns_only, .. } => {
890 (source, target, decls, type_ns_only)
891 }
892 ImportKind::Glob { .. } => {
893 self.get_mut_unchecked().resolve_glob_import(import);
894 return 0;
895 }
896 _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
897 };
898
899 let mut indeterminate_count = 0;
900 self.per_ns_cm(|this, ns| {
901 if !type_ns_only || ns == TypeNS {
902 if bindings[ns].get() != PendingDecl::Pending {
903 return;
904 };
905 let binding_result = this.reborrow().maybe_resolve_ident_in_module(
906 module,
907 source,
908 ns,
909 &import.parent_scope,
910 Some(import),
911 );
912 let parent = import.parent_scope.module;
913 let binding = match binding_result {
914 Ok(binding) => {
915 if binding.is_assoc_item()
916 && !this.tcx.features().import_trait_associated_functions()
917 {
918 feature_err(
919 this.tcx.sess,
920 sym::import_trait_associated_functions,
921 import.span,
922 "`use` associated items of traits is unstable",
923 )
924 .emit();
925 }
926 let import_decl = this.new_import_decl(binding, import);
928 this.get_mut_unchecked().plant_decl_into_local_module(
929 Macros20NormalizedIdent::new(target),
930 ns,
931 import_decl,
932 );
933 PendingDecl::Ready(Some(import_decl))
934 }
935 Err(Determinacy::Determined) => {
936 if target.name != kw::Underscore {
938 let key = BindingKey::new(Macros20NormalizedIdent::new(target), ns);
939 this.get_mut_unchecked().update_local_resolution(
940 parent,
941 key,
942 false,
943 |_, resolution| {
944 resolution.single_imports.swap_remove(&import);
945 },
946 );
947 }
948 PendingDecl::Ready(None)
949 }
950 Err(Determinacy::Undetermined) => {
951 indeterminate_count += 1;
952 PendingDecl::Pending
953 }
954 };
955 bindings[ns].set_unchecked(binding);
956 }
957 });
958
959 indeterminate_count
960 }
961
962 fn finalize_import(&mut self, import: Import<'ra>) -> Option<UnresolvedImportError> {
967 let ignore_decl = match &import.kind {
968 ImportKind::Single { decls, .. } => decls[TypeNS].get().decl(),
969 _ => None,
970 };
971 let ambiguity_errors_len = |errors: &Vec<AmbiguityError<'_>>| {
972 errors.iter().filter(|error| error.warning.is_none()).count()
973 };
974 let prev_ambiguity_errors_len = ambiguity_errors_len(&self.ambiguity_errors);
975 let finalize = Finalize::with_root_span(import.root_id, import.span, import.root_span);
976
977 let privacy_errors_len = self.privacy_errors.len();
979
980 let path_res = self.cm().resolve_path(
981 &import.module_path,
982 None,
983 &import.parent_scope,
984 Some(finalize),
985 ignore_decl,
986 Some(import),
987 );
988
989 let no_ambiguity =
990 ambiguity_errors_len(&self.ambiguity_errors) == prev_ambiguity_errors_len;
991
992 let module = match path_res {
993 PathResult::Module(module) => {
994 if let Some(initial_module) = import.imported_module.get() {
996 if module != initial_module && no_ambiguity {
997 ::rustc_middle::util::bug::span_bug_fmt(import.span,
format_args!("inconsistent resolution for an import"));span_bug!(import.span, "inconsistent resolution for an import");
998 }
999 } else if self.privacy_errors.is_empty() {
1000 self.dcx()
1001 .create_err(CannotDetermineImportResolution { span: import.span })
1002 .emit();
1003 }
1004
1005 module
1006 }
1007 PathResult::Failed {
1008 is_error_from_last_segment: false,
1009 span,
1010 segment_name,
1011 label,
1012 suggestion,
1013 module,
1014 error_implied_by_parse_error: _,
1015 } => {
1016 if no_ambiguity {
1017 if !import.imported_module.get().is_none() {
::core::panicking::panic("assertion failed: import.imported_module.get().is_none()")
};assert!(import.imported_module.get().is_none());
1018 self.report_error(
1019 span,
1020 ResolutionError::FailedToResolve {
1021 segment: Some(segment_name),
1022 label,
1023 suggestion,
1024 module,
1025 },
1026 );
1027 }
1028 return None;
1029 }
1030 PathResult::Failed {
1031 is_error_from_last_segment: true,
1032 span,
1033 label,
1034 suggestion,
1035 module,
1036 segment_name,
1037 ..
1038 } => {
1039 if no_ambiguity {
1040 if !import.imported_module.get().is_none() {
::core::panicking::panic("assertion failed: import.imported_module.get().is_none()")
};assert!(import.imported_module.get().is_none());
1041 let module = if let Some(ModuleOrUniformRoot::Module(m)) = module {
1042 m.opt_def_id()
1043 } else {
1044 None
1045 };
1046 let err = match self
1047 .make_path_suggestion(import.module_path.clone(), &import.parent_scope)
1048 {
1049 Some((suggestion, note)) => UnresolvedImportError {
1050 span,
1051 label: None,
1052 note,
1053 suggestion: Some((
1054 <[_]>::into_vec(::alloc::boxed::box_new([(span,
Segment::names_to_string(&suggestion))]))vec![(span, Segment::names_to_string(&suggestion))],
1055 String::from("a similar path exists"),
1056 Applicability::MaybeIncorrect,
1057 )),
1058 candidates: None,
1059 segment: Some(segment_name),
1060 module,
1061 },
1062 None => UnresolvedImportError {
1063 span,
1064 label: Some(label),
1065 note: None,
1066 suggestion,
1067 candidates: None,
1068 segment: Some(segment_name),
1069 module,
1070 },
1071 };
1072 return Some(err);
1073 }
1074 return None;
1075 }
1076 PathResult::NonModule(partial_res) => {
1077 if no_ambiguity && partial_res.full_res() != Some(Res::Err) {
1078 if !import.imported_module.get().is_none() {
::core::panicking::panic("assertion failed: import.imported_module.get().is_none()")
};assert!(import.imported_module.get().is_none());
1080 }
1081 return None;
1083 }
1084 PathResult::Indeterminate => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1085 };
1086
1087 let (ident, target, bindings, type_ns_only, import_id) = match import.kind {
1088 ImportKind::Single { source, target, ref decls, type_ns_only, id, .. } => {
1089 (source, target, decls, type_ns_only, id)
1090 }
1091 ImportKind::Glob { ref max_vis, id } => {
1092 if import.module_path.len() <= 1 {
1093 let mut full_path = import.module_path.clone();
1096 full_path.push(Segment::from_ident(Ident::dummy()));
1097 self.lint_if_path_starts_with_module(finalize, &full_path, None);
1098 }
1099
1100 if let ModuleOrUniformRoot::Module(module) = module
1101 && module == import.parent_scope.module
1102 {
1103 return Some(UnresolvedImportError {
1105 span: import.span,
1106 label: Some(String::from("cannot glob-import a module into itself")),
1107 note: None,
1108 suggestion: None,
1109 candidates: None,
1110 segment: None,
1111 module: None,
1112 });
1113 }
1114 if let Some(max_vis) = max_vis.get()
1115 && !max_vis.is_at_least(import.vis, self.tcx)
1116 {
1117 let def_id = self.local_def_id(id);
1118 self.lint_buffer.buffer_lint(
1119 UNUSED_IMPORTS,
1120 id,
1121 import.span,
1122 crate::errors::RedundantImportVisibility {
1123 span: import.span,
1124 help: (),
1125 max_vis: max_vis.to_string(def_id, self.tcx),
1126 import_vis: import.vis.to_string(def_id, self.tcx),
1127 },
1128 );
1129 }
1130 return None;
1131 }
1132 _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1133 };
1134
1135 if self.privacy_errors.len() != privacy_errors_len {
1136 let mut path = import.module_path.clone();
1139 path.push(Segment::from_ident(ident));
1140 if let PathResult::Module(ModuleOrUniformRoot::Module(module)) = self.cm().resolve_path(
1141 &path,
1142 None,
1143 &import.parent_scope,
1144 Some(finalize),
1145 ignore_decl,
1146 None,
1147 ) {
1148 let res = module.res().map(|r| (r, ident));
1149 for error in &mut self.privacy_errors[privacy_errors_len..] {
1150 error.outermost_res = res;
1151 }
1152 }
1153 }
1154
1155 let mut all_ns_err = true;
1156 self.per_ns(|this, ns| {
1157 if !type_ns_only || ns == TypeNS {
1158 let binding = this.cm().resolve_ident_in_module(
1159 module,
1160 ident,
1161 ns,
1162 &import.parent_scope,
1163 Some(Finalize { report_private: false, ..finalize }),
1164 bindings[ns].get().decl(),
1165 Some(import),
1166 );
1167
1168 match binding {
1169 Ok(binding) => {
1170 let initial_res = bindings[ns].get().decl().map(|binding| {
1172 let initial_binding = binding.import_source();
1173 all_ns_err = false;
1174 if target.name == kw::Underscore
1175 && initial_binding.is_extern_crate()
1176 && !initial_binding.is_import()
1177 {
1178 let used = if import.module_path.is_empty() {
1179 Used::Scope
1180 } else {
1181 Used::Other
1182 };
1183 this.record_use(ident, binding, used);
1184 }
1185 initial_binding.res()
1186 });
1187 let res = binding.res();
1188 let has_ambiguity_error =
1189 this.ambiguity_errors.iter().any(|error| error.warning.is_none());
1190 if res == Res::Err || has_ambiguity_error {
1191 this.dcx()
1192 .span_delayed_bug(import.span, "some error happened for an import");
1193 return;
1194 }
1195 if let Some(initial_res) = initial_res {
1196 if res != initial_res && !this.issue_145575_hack_applied {
1197 ::rustc_middle::util::bug::span_bug_fmt(import.span,
format_args!("inconsistent resolution for an import"));span_bug!(import.span, "inconsistent resolution for an import");
1198 }
1199 } else if this.privacy_errors.is_empty() {
1200 this.dcx()
1201 .create_err(CannotDetermineImportResolution { span: import.span })
1202 .emit();
1203 }
1204 }
1205 Err(..) => {
1206 }
1213 }
1214 }
1215 });
1216
1217 if all_ns_err {
1218 let mut all_ns_failed = true;
1219 self.per_ns(|this, ns| {
1220 if !type_ns_only || ns == TypeNS {
1221 let binding = this.cm().resolve_ident_in_module(
1222 module,
1223 ident,
1224 ns,
1225 &import.parent_scope,
1226 Some(finalize),
1227 None,
1228 None,
1229 );
1230 if binding.is_ok() {
1231 all_ns_failed = false;
1232 }
1233 }
1234 });
1235
1236 return if all_ns_failed {
1237 let names = match module {
1238 ModuleOrUniformRoot::Module(module) => {
1239 self.resolutions(module)
1240 .borrow()
1241 .iter()
1242 .filter_map(|(BindingKey { ident: i, .. }, resolution)| {
1243 if i.name == ident.name {
1244 return None;
1245 } let resolution = resolution.borrow();
1248 if let Some(name_binding) = resolution.best_decl() {
1249 match name_binding.kind {
1250 DeclKind::Import { source_decl, .. } => {
1251 match source_decl.kind {
1252 DeclKind::Def(Res::Err) => None,
1255 _ => Some(i.name),
1256 }
1257 }
1258 _ => Some(i.name),
1259 }
1260 } else if resolution.single_imports.is_empty() {
1261 None
1262 } else {
1263 Some(i.name)
1264 }
1265 })
1266 .collect()
1267 }
1268 _ => Vec::new(),
1269 };
1270
1271 let lev_suggestion =
1272 find_best_match_for_name(&names, ident.name, None).map(|suggestion| {
1273 (
1274 <[_]>::into_vec(::alloc::boxed::box_new([(ident.span,
suggestion.to_string())]))vec![(ident.span, suggestion.to_string())],
1275 String::from("a similar name exists in the module"),
1276 Applicability::MaybeIncorrect,
1277 )
1278 });
1279
1280 let (suggestion, note) =
1281 match self.check_for_module_export_macro(import, module, ident) {
1282 Some((suggestion, note)) => (suggestion.or(lev_suggestion), note),
1283 _ => (lev_suggestion, None),
1284 };
1285
1286 let label = match module {
1287 ModuleOrUniformRoot::Module(module) => {
1288 let module_str = module_to_string(module);
1289 if let Some(module_str) = module_str {
1290 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("no `{0}` in `{1}`", ident,
module_str))
})format!("no `{ident}` in `{module_str}`")
1291 } else {
1292 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("no `{0}` in the root", ident))
})format!("no `{ident}` in the root")
1293 }
1294 }
1295 _ => {
1296 if !ident.is_path_segment_keyword() {
1297 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("no external crate `{0}`", ident))
})format!("no external crate `{ident}`")
1298 } else {
1299 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("no `{0}` in the root", ident))
})format!("no `{ident}` in the root")
1302 }
1303 }
1304 };
1305
1306 let parent_suggestion =
1307 self.lookup_import_candidates(ident, TypeNS, &import.parent_scope, |_| true);
1308
1309 Some(UnresolvedImportError {
1310 span: import.span,
1311 label: Some(label),
1312 note,
1313 suggestion,
1314 candidates: if !parent_suggestion.is_empty() {
1315 Some(parent_suggestion)
1316 } else {
1317 None
1318 },
1319 module: import.imported_module.get().and_then(|module| {
1320 if let ModuleOrUniformRoot::Module(m) = module {
1321 m.opt_def_id()
1322 } else {
1323 None
1324 }
1325 }),
1326 segment: Some(ident.name),
1327 })
1328 } else {
1329 None
1331 };
1332 }
1333
1334 let mut reexport_error = None;
1335 let mut any_successful_reexport = false;
1336 let mut crate_private_reexport = false;
1337 self.per_ns(|this, ns| {
1338 let Some(binding) = bindings[ns].get().decl().map(|b| b.import_source()) else {
1339 return;
1340 };
1341
1342 if !binding.vis().is_at_least(import.vis, this.tcx) {
1343 reexport_error = Some((ns, binding));
1344 if let Visibility::Restricted(binding_def_id) = binding.vis()
1345 && binding_def_id.is_top_level_module()
1346 {
1347 crate_private_reexport = true;
1348 }
1349 } else {
1350 any_successful_reexport = true;
1351 }
1352 });
1353
1354 if !any_successful_reexport {
1356 let (ns, binding) = reexport_error.unwrap();
1357 if let Some(extern_crate_id) = pub_use_of_private_extern_crate_hack(import, binding) {
1358 let extern_crate_sp = self.tcx.source_span(self.local_def_id(extern_crate_id));
1359 self.lint_buffer.buffer_lint(
1360 PUB_USE_OF_PRIVATE_EXTERN_CRATE,
1361 import_id,
1362 import.span,
1363 crate::errors::PrivateExternCrateReexport {
1364 ident,
1365 sugg: extern_crate_sp.shrink_to_lo(),
1366 },
1367 );
1368 } else if ns == TypeNS {
1369 let err = if crate_private_reexport {
1370 self.dcx()
1371 .create_err(CannotBeReexportedCratePublicNS { span: import.span, ident })
1372 } else {
1373 self.dcx().create_err(CannotBeReexportedPrivateNS { span: import.span, ident })
1374 };
1375 err.emit();
1376 } else {
1377 let mut err = if crate_private_reexport {
1378 self.dcx()
1379 .create_err(CannotBeReexportedCratePublic { span: import.span, ident })
1380 } else {
1381 self.dcx().create_err(CannotBeReexportedPrivate { span: import.span, ident })
1382 };
1383
1384 match binding.kind {
1385 DeclKind::Def(Res::Def(DefKind::Macro(_), def_id))
1386 if self.get_macro_by_def_id(def_id).macro_rules =>
1388 {
1389 err.subdiagnostic( ConsiderAddingMacroExport {
1390 span: binding.span,
1391 });
1392 err.subdiagnostic( ConsiderMarkingAsPubCrate {
1393 vis_span: import.vis_span,
1394 });
1395 }
1396 _ => {
1397 err.subdiagnostic( ConsiderMarkingAsPub {
1398 span: import.span,
1399 ident,
1400 });
1401 }
1402 }
1403 err.emit();
1404 }
1405 }
1406
1407 if import.module_path.len() <= 1 {
1408 let mut full_path = import.module_path.clone();
1411 full_path.push(Segment::from_ident(ident));
1412 self.per_ns(|this, ns| {
1413 if let Some(binding) = bindings[ns].get().decl().map(|b| b.import_source()) {
1414 this.lint_if_path_starts_with_module(finalize, &full_path, Some(binding));
1415 }
1416 });
1417 }
1418
1419 self.per_ns(|this, ns| {
1423 if let Some(binding) = bindings[ns].get().decl().map(|b| b.import_source()) {
1424 this.import_res_map.entry(import_id).or_default()[ns] = Some(binding.res());
1425 }
1426 });
1427
1428 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_resolve/src/imports.rs:1428",
"rustc_resolve::imports", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_resolve/src/imports.rs"),
::tracing_core::__macro_support::Option::Some(1428u32),
::tracing_core::__macro_support::Option::Some("rustc_resolve::imports"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("(resolving single import) successfully resolved import")
as &dyn Value))])
});
} else { ; }
};debug!("(resolving single import) successfully resolved import");
1429 None
1430 }
1431
1432 pub(crate) fn check_for_redundant_imports(&mut self, import: Import<'ra>) -> bool {
1433 let ImportKind::Single { source, target, ref decls, id, .. } = import.kind else {
1435 ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
1436 };
1437
1438 if source != target {
1440 return false;
1441 }
1442
1443 if import.parent_scope.expansion != LocalExpnId::ROOT {
1445 return false;
1446 }
1447
1448 if self.import_use_map.get(&import) == Some(&Used::Other)
1453 || self.effective_visibilities.is_exported(self.local_def_id(id))
1454 {
1455 return false;
1456 }
1457
1458 let mut is_redundant = true;
1459 let mut redundant_span = PerNS { value_ns: None, type_ns: None, macro_ns: None };
1460 self.per_ns(|this, ns| {
1461 let binding = decls[ns].get().decl().map(|b| b.import_source());
1462 if is_redundant && let Some(binding) = binding {
1463 if binding.res() == Res::Err {
1464 return;
1465 }
1466
1467 match this.cm().resolve_ident_in_scope_set(
1468 target,
1469 ScopeSet::All(ns),
1470 &import.parent_scope,
1471 None,
1472 false,
1473 decls[ns].get().decl(),
1474 None,
1475 ) {
1476 Ok(other_binding) => {
1477 is_redundant = binding.res() == other_binding.res()
1478 && !other_binding.is_ambiguity_recursive();
1479 if is_redundant {
1480 redundant_span[ns] =
1481 Some((other_binding.span, other_binding.is_import()));
1482 }
1483 }
1484 Err(_) => is_redundant = false,
1485 }
1486 }
1487 });
1488
1489 if is_redundant && !redundant_span.is_empty() {
1490 let mut redundant_spans: Vec<_> = redundant_span.present_items().collect();
1491 redundant_spans.sort();
1492 redundant_spans.dedup();
1493 self.lint_buffer.buffer_lint(
1494 REDUNDANT_IMPORTS,
1495 id,
1496 import.span,
1497 BuiltinLintDiag::RedundantImport(redundant_spans, source),
1498 );
1499 return true;
1500 }
1501
1502 false
1503 }
1504
1505 fn resolve_glob_import(&mut self, import: Import<'ra>) {
1506 let ImportKind::Glob { id, .. } = import.kind else { ::core::panicking::panic("internal error: entered unreachable code")unreachable!() };
1508
1509 let ModuleOrUniformRoot::Module(module) = import.imported_module.get().unwrap() else {
1510 self.dcx().emit_err(CannotGlobImportAllCrates { span: import.span });
1511 return;
1512 };
1513
1514 if module.is_trait() && !self.tcx.features().import_trait_associated_functions() {
1515 feature_err(
1516 self.tcx.sess,
1517 sym::import_trait_associated_functions,
1518 import.span,
1519 "`use` associated items of traits is unstable",
1520 )
1521 .emit();
1522 }
1523
1524 if module == import.parent_scope.module {
1525 return;
1526 }
1527
1528 module.glob_importers.borrow_mut_unchecked().push(import);
1530
1531 let bindings = self
1534 .resolutions(module)
1535 .borrow()
1536 .iter()
1537 .filter_map(|(key, resolution)| {
1538 resolution.borrow().binding().map(|binding| (*key, binding))
1539 })
1540 .collect::<Vec<_>>();
1541 for (mut key, binding) in bindings {
1542 let scope = match key.ident.0.span.reverse_glob_adjust(module.expansion, import.span) {
1543 Some(Some(def)) => self.expn_def_scope(def),
1544 Some(None) => import.parent_scope.module,
1545 None => continue,
1546 };
1547 if self.is_accessible_from(binding.vis(), scope) {
1548 let import_decl = self.new_import_decl(binding, import);
1549 let warn_ambiguity = self
1550 .resolution(import.parent_scope.module, key)
1551 .and_then(|r| r.binding())
1552 .is_some_and(|binding| binding.warn_ambiguity_recursive());
1553 let _ = self.try_plant_decl_into_local_module(
1554 key.ident,
1555 key.ns,
1556 import_decl,
1557 warn_ambiguity,
1558 );
1559 }
1560 }
1561
1562 self.record_partial_res(id, PartialRes::new(module.res().unwrap()));
1564 }
1565
1566 fn finalize_resolutions_in(
1569 &self,
1570 module: Module<'ra>,
1571 module_children: &mut LocalDefIdMap<Vec<ModChild>>,
1572 ambig_module_children: &mut LocalDefIdMap<Vec<AmbigModChild>>,
1573 ) {
1574 *module.globs.borrow_mut(self) = Vec::new();
1576
1577 let Some(def_id) = module.opt_def_id() else { return };
1578
1579 let mut children = Vec::new();
1580 let mut ambig_children = Vec::new();
1581
1582 module.for_each_child(self, |this, ident, _, binding| {
1583 let res = binding.res().expect_non_local();
1584 if res != def::Res::Err {
1585 let child = |reexport_chain| ModChild {
1586 ident: ident.0,
1587 res,
1588 vis: binding.vis(),
1589 reexport_chain,
1590 };
1591 if let Some((ambig_binding1, ambig_binding2)) = binding.descent_to_ambiguity() {
1592 let main = child(ambig_binding1.reexport_chain(this));
1593 let second = ModChild {
1594 ident: ident.0,
1595 res: ambig_binding2.res().expect_non_local(),
1596 vis: ambig_binding2.vis(),
1597 reexport_chain: ambig_binding2.reexport_chain(this),
1598 };
1599 ambig_children.push(AmbigModChild { main, second })
1600 } else {
1601 children.push(child(binding.reexport_chain(this)));
1602 }
1603 }
1604 });
1605
1606 if !children.is_empty() {
1607 module_children.insert(def_id.expect_local(), children);
1608 }
1609 if !ambig_children.is_empty() {
1610 ambig_module_children.insert(def_id.expect_local(), ambig_children);
1611 }
1612 }
1613}
1614
1615fn import_path_to_string(names: &[Ident], import_kind: &ImportKind<'_>, span: Span) -> String {
1616 let pos = names.iter().position(|p| span == p.span && p.name != kw::PathRoot);
1617 let global = !names.is_empty() && names[0].name == kw::PathRoot;
1618 if let Some(pos) = pos {
1619 let names = if global { &names[1..pos + 1] } else { &names[..pos + 1] };
1620 names_to_string(names.iter().map(|ident| ident.name))
1621 } else {
1622 let names = if global { &names[1..] } else { names };
1623 if names.is_empty() {
1624 import_kind_to_string(import_kind)
1625 } else {
1626 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}::{1}",
names_to_string(names.iter().map(|ident| ident.name)),
import_kind_to_string(import_kind)))
})format!(
1627 "{}::{}",
1628 names_to_string(names.iter().map(|ident| ident.name)),
1629 import_kind_to_string(import_kind),
1630 )
1631 }
1632 }
1633}
1634
1635fn import_kind_to_string(import_kind: &ImportKind<'_>) -> String {
1636 match import_kind {
1637 ImportKind::Single { source, .. } => source.to_string(),
1638 ImportKind::Glob { .. } => "*".to_string(),
1639 ImportKind::ExternCrate { .. } => "<extern crate>".to_string(),
1640 ImportKind::MacroUse { .. } => "#[macro_use]".to_string(),
1641 ImportKind::MacroExport => "#[macro_export]".to_string(),
1642 }
1643}