X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=compiler%2Frustc_resolve%2Fsrc%2Fdiagnostics.rs;h=5d80f49626a0476ad92a4daa2bb8b8aeec32fea1;hb=4934a9e6430b3fcb98f77205f8a625c7ffebd628;hp=e0a83ba8c0d4ac95ce65bcd3983dbdb3ca1314c3;hpb=9a98c63b30bd8419be662b8fb3f3b22ba33d72c5;p=rust.git diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index e0a83ba8c0d..5d80f49626a 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -117,7 +117,7 @@ impl<'a> Resolver<'a> { } fn report_with_use_injections(&mut self, krate: &Crate) { - for UseError { mut err, candidates, def_id, instead, suggestion } in + for UseError { mut err, candidates, def_id, instead, suggestion, path } in self.use_injections.drain(..) { let (span, found_use) = if let Some(def_id) = def_id.as_local() { @@ -135,6 +135,7 @@ fn report_with_use_injections(&mut self, krate: &Crate) { if instead { Instead::Yes } else { Instead::No }, found_use, IsPattern::No, + path, ); } else if let Some((span, msg, sugg, appl)) = suggestion { err.span_suggestion(span, msg, sugg, appl); @@ -417,15 +418,12 @@ fn add_suggestion_for_duplicate_nested_use( crate fn lint_if_path_starts_with_module( &mut self, - finalize: Finalize, + finalize: Option, path: &[Segment], second_binding: Option<&NameBinding<'_>>, ) { - let (diag_id, diag_span) = match finalize { - Finalize::No => return, - Finalize::SimplePath(id, path_span) => (id, path_span), - Finalize::UsePath { root_id, root_span, .. } => (root_id, root_span), - Finalize::QPathTrait { qpath_id, qpath_span, .. } => (qpath_id, qpath_span), + let Some(Finalize { node_id, root_span, .. }) = finalize else { + return; }; let first_name = match path.get(0) { @@ -463,11 +461,11 @@ fn add_suggestion_for_duplicate_nested_use( } } - let diag = BuiltinLintDiagnostics::AbsPathWithModule(diag_span); + let diag = BuiltinLintDiagnostics::AbsPathWithModule(root_span); self.lint_buffer.buffer_lint_with_diagnostic( ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE, - diag_id, - diag_span, + node_id, + root_span, "absolute paths must start with `self`, `super`, \ `crate`, or an external crate name in the 2018 edition", diag, @@ -705,6 +703,7 @@ fn add_suggestion_for_duplicate_nested_use( Instead::No, FoundUse::Yes, IsPattern::Yes, + vec![], ); } err @@ -1324,7 +1323,7 @@ fn lookup_import_candidates_from_module( segms.push(ast::PathSegment::from_ident(ident)); let path = Path { span: name_binding.span, segments: segms, tokens: None }; let did = match res { - Res::Def(DefKind::Ctor(..), did) => this.parent(did), + Res::Def(DefKind::Ctor(..), did) => this.opt_parent(did), _ => res.opt_def_id(), }; @@ -1485,6 +1484,7 @@ fn lookup_import_candidates_from_module( Instead::No, FoundUse::Yes, IsPattern::No, + vec![], ); if macro_kind == MacroKind::Derive && (ident.name == sym::Send || ident.name == sym::Sync) { @@ -1503,7 +1503,6 @@ fn lookup_import_candidates_from_module( &parent_scope, None, false, - false, None, ) { let desc = match binding.res() { @@ -1711,7 +1710,7 @@ fn ctor_fields_span(&self, binding: &NameBinding<'_>) -> Option { _, ) = binding.kind { - let def_id = self.parent(ctor_def_id).expect("no parent for a constructor"); + let def_id = self.parent(ctor_def_id); let fields = self.field_names.get(&def_id)?; return fields.iter().map(|name| name.span).reduce(Span::to); // None for `struct Foo()` } @@ -1811,7 +1810,7 @@ fn report_privacy_error(&self, privacy_error: &PrivacyError<'_>) { opt_ns: Option, // `None` indicates a module path in import parent_scope: &ParentScope<'a>, ribs: Option<&PerNS>>>, - unusable_binding: Option<&'a NameBinding<'a>>, + ignore_binding: Option<&'a NameBinding<'a>>, module: Option>, i: usize, ident: Ident, @@ -1863,8 +1862,7 @@ fn report_privacy_error(&self, privacy_error: &PrivacyError<'_>) { ns_to_try, parent_scope, None, - false, - unusable_binding, + ignore_binding, ).ok() } else if let Some(ribs) = ribs && let Some(TypeNS | ValueNS) = opt_ns @@ -1873,9 +1871,9 @@ fn report_privacy_error(&self, privacy_error: &PrivacyError<'_>) { ident, ns_to_try, parent_scope, - Finalize::No, + None, &ribs[ns_to_try], - unusable_binding, + ignore_binding, ) { // we found a locally-imported or available item/module Some(LexicalScopeBinding::Item(binding)) => Some(binding), @@ -1889,8 +1887,7 @@ fn report_privacy_error(&self, privacy_error: &PrivacyError<'_>) { parent_scope, None, false, - false, - unusable_binding, + ignore_binding, ).ok() }; if let Some(binding) = binding { @@ -1921,9 +1918,9 @@ fn report_privacy_error(&self, privacy_error: &PrivacyError<'_>) { ident, ValueNS, parent_scope, - Finalize::No, + None, &ribs[ValueNS], - unusable_binding, + ignore_binding, ) } else { None @@ -2454,6 +2451,7 @@ fn show_candidates( instead: Instead, found_use: FoundUse, is_pattern: IsPattern, + path: Vec, ) { if candidates.is_empty() { return; @@ -2521,6 +2519,14 @@ fn show_candidates( accessible_path_strings.into_iter().map(|a| a.0), Applicability::MaybeIncorrect, ); + if let [first, .., last] = &path[..] { + err.span_suggestion_verbose( + first.ident.span.until(last.ident.span), + &format!("if you import `{}`, refer to it directly", last.ident), + String::new(), + Applicability::Unspecified, + ); + } } else { msg.push(':');