Make "consider importing" consistent for macros

This commit is contained in:
Mu001999 2023-06-10 00:06:34 +08:00
parent 8b35c0bb0f
commit 5bd8ba8493
10 changed files with 53 additions and 27 deletions

View File

@ -1352,6 +1352,7 @@ pub(crate) fn unresolved_macro_suggestions(
macro_kind: MacroKind, macro_kind: MacroKind,
parent_scope: &ParentScope<'a>, parent_scope: &ParentScope<'a>,
ident: Ident, ident: Ident,
krate: &Crate,
) { ) {
let is_expected = &|res: Res| res.macro_kind() == Some(macro_kind); let is_expected = &|res: Res| res.macro_kind() == Some(macro_kind);
let suggestion = self.early_lookup_typo_candidate( let suggestion = self.early_lookup_typo_candidate(
@ -1364,13 +1365,17 @@ pub(crate) fn unresolved_macro_suggestions(
let import_suggestions = let import_suggestions =
self.lookup_import_candidates(ident, Namespace::MacroNS, parent_scope, is_expected); self.lookup_import_candidates(ident, Namespace::MacroNS, parent_scope, is_expected);
let (span, found_use) = match parent_scope.module.nearest_parent_mod().as_local() {
Some(def_id) => UsePlacementFinder::check(krate, self.def_id_to_node_id[def_id]),
None => (None, FoundUse::No),
};
show_candidates( show_candidates(
self.tcx, self.tcx,
err, err,
None, span,
&import_suggestions, &import_suggestions,
Instead::No, Instead::No,
FoundUse::Yes, found_use,
DiagnosticMode::Normal, DiagnosticMode::Normal,
vec![], vec![],
"", "",

View File

@ -1522,7 +1522,9 @@ pub fn resolve_crate(&mut self, krate: &Crate) {
self.tcx.sess.time("check_hidden_glob_reexports", || { self.tcx.sess.time("check_hidden_glob_reexports", || {
self.check_hidden_glob_reexports(exported_ambiguities) self.check_hidden_glob_reexports(exported_ambiguities)
}); });
self.tcx.sess.time("finalize_macro_resolutions", || self.finalize_macro_resolutions()); self.tcx
.sess
.time("finalize_macro_resolutions", || self.finalize_macro_resolutions(krate));
self.tcx.sess.time("late_resolve_crate", || self.late_resolve_crate(krate)); self.tcx.sess.time("late_resolve_crate", || self.late_resolve_crate(krate));
self.tcx.sess.time("resolve_main", || self.resolve_main()); self.tcx.sess.time("resolve_main", || self.resolve_main());
self.tcx.sess.time("resolve_check_unused", || self.check_unused(krate)); self.tcx.sess.time("resolve_check_unused", || self.check_unused(krate));

View File

@ -7,7 +7,7 @@
use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet}; use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet};
use crate::{ModuleKind, ModuleOrUniformRoot, NameBinding, PathResult, Segment}; use crate::{ModuleKind, ModuleOrUniformRoot, NameBinding, PathResult, Segment};
use rustc_ast::expand::StrippedCfgItem; use rustc_ast::expand::StrippedCfgItem;
use rustc_ast::{self as ast, attr, Inline, ItemKind, ModKind, NodeId}; use rustc_ast::{self as ast, attr, Crate, Inline, ItemKind, ModKind, NodeId};
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_attr::StabilityLevel; use rustc_attr::StabilityLevel;
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
@ -674,7 +674,7 @@ pub(crate) fn resolve_macro_path(
res.map(|res| (self.get_macro(res).map(|macro_data| macro_data.ext), res)) res.map(|res| (self.get_macro(res).map(|macro_data| macro_data.ext), res))
} }
pub(crate) fn finalize_macro_resolutions(&mut self) { pub(crate) fn finalize_macro_resolutions(&mut self, krate: &Crate) {
let check_consistency = |this: &mut Self, let check_consistency = |this: &mut Self,
path: &[Segment], path: &[Segment],
span, span,
@ -795,7 +795,7 @@ pub(crate) fn finalize_macro_resolutions(&mut self) {
let expected = kind.descr_expected(); let expected = kind.descr_expected();
let msg = format!("cannot find {} `{}` in this scope", expected, ident); let msg = format!("cannot find {} `{}` in this scope", expected, ident);
let mut err = self.tcx.sess.struct_span_err(ident.span, msg); let mut err = self.tcx.sess.struct_span_err(ident.span, msg);
self.unresolved_macro_suggestions(&mut err, kind, &parent_scope, ident); self.unresolved_macro_suggestions(&mut err, kind, &parent_scope, ident, krate);
err.emit(); err.emit();
} }
} }

View File

@ -4,8 +4,10 @@ error: cannot find macro `macro_two` in this scope
LL | macro_two!(); LL | macro_two!();
| ^^^^^^^^^ | ^^^^^^^^^
| |
= help: consider importing this macro: help: consider importing this macro
two_macros::macro_two |
LL + use two_macros::macro_two;
|
error: aborting due to previous error error: aborting due to previous error

View File

@ -4,8 +4,10 @@ error: cannot find macro `print` in this scope
LL | print!(); LL | print!();
| ^^^^^ | ^^^^^
| |
= help: consider importing this macro: help: consider importing this macro
std::print |
LL + use std::print;
|
error: aborting due to previous error error: aborting due to previous error

View File

@ -1,14 +1,14 @@
// compile-flags: -Z deduplicate-diagnostics=yes // compile-flags: -Z deduplicate-diagnostics=yes
// edition:2018 // edition:2018
mod hey { mod hey { //~ HELP consider importing this derive macro
//~^ HELP consider importing this macro
pub use Copy as Bla; pub use Copy as Bla;
pub use std::println as bla; pub use std::println as bla;
} }
#[derive(Bla)] #[derive(Bla)]
//~^ ERROR cannot find derive macro `Bla` //~^ ERROR cannot find derive macro `Bla`
//~| HELP consider importing this derive macro
struct A; struct A;
#[derive(println)] #[derive(println)]
@ -19,5 +19,4 @@ mod hey {
fn main() { fn main() {
bla!(); bla!();
//~^ ERROR cannot find macro `bla` //~^ ERROR cannot find macro `bla`
//~| HELP consider importing this macro
} }

View File

@ -4,8 +4,10 @@ error: cannot find macro `bla` in this scope
LL | bla!(); LL | bla!();
| ^^^ | ^^^
| |
= help: consider importing this macro: help: consider importing this macro
crate::hey::bla |
LL + use crate::hey::bla;
|
error: cannot find derive macro `println` in this scope error: cannot find derive macro `println` in this scope
--> $DIR/issue-88228.rs:14:10 --> $DIR/issue-88228.rs:14:10
@ -16,13 +18,15 @@ LL | #[derive(println)]
= note: `println` is in scope, but it is a function-like macro = note: `println` is in scope, but it is a function-like macro
error: cannot find derive macro `Bla` in this scope error: cannot find derive macro `Bla` in this scope
--> $DIR/issue-88228.rs:9:10 --> $DIR/issue-88228.rs:10:10
| |
LL | #[derive(Bla)] LL | #[derive(Bla)]
| ^^^ | ^^^
| |
= help: consider importing this derive macro: help: consider importing this derive macro
crate::hey::Bla |
LL + use crate::hey::Bla;
|
error: aborting due to 3 previous errors error: aborting due to 3 previous errors

View File

@ -2,15 +2,21 @@ error: cannot find macro `macro_two` in this scope
--> $DIR/macro-use-wrong-name.rs:7:5 --> $DIR/macro-use-wrong-name.rs:7:5
| |
LL | macro_two!(); LL | macro_two!();
| ^^^^^^^^^ help: a macro with a similar name exists: `macro_one` | ^^^^^^^^^
| |
::: $DIR/auxiliary/two_macros.rs:2:1 ::: $DIR/auxiliary/two_macros.rs:2:1
| |
LL | macro_rules! macro_one { () => ("one") } LL | macro_rules! macro_one { () => ("one") }
| ---------------------- similarly named macro `macro_one` defined here | ---------------------- similarly named macro `macro_one` defined here
| |
= help: consider importing this macro: help: a macro with a similar name exists
two_macros::macro_two |
LL | macro_one!();
| ~~~~~~~~~
help: consider importing this macro
|
LL + use two_macros::macro_two;
|
error: aborting due to previous error error: aborting due to previous error

View File

@ -4,8 +4,10 @@ error: cannot find macro `macro_two` in this scope
LL | macro_two!(); LL | macro_two!();
| ^^^^^^^^^ | ^^^^^^^^^
| |
= help: consider importing this macro: help: consider importing this macro
two_macros::macro_two |
LL + use two_macros::macro_two;
|
error: aborting due to previous error error: aborting due to previous error

View File

@ -16,9 +16,11 @@ error: cannot find attribute `empty_helper` in this scope
LL | #[derive(GenHelperUse)] LL | #[derive(GenHelperUse)]
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
| |
= help: consider importing this attribute macro:
empty_helper
= note: this error originates in the derive macro `GenHelperUse` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the derive macro `GenHelperUse` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider importing this attribute macro
|
LL + use empty_helper;
|
error: cannot find attribute `empty_helper` in this scope error: cannot find attribute `empty_helper` in this scope
--> $DIR/derive-helper-shadowing.rs:14:11 --> $DIR/derive-helper-shadowing.rs:14:11
@ -29,9 +31,11 @@ LL | #[empty_helper]
LL | gen_helper_use!(); LL | gen_helper_use!();
| ----------------- in this macro invocation | ----------------- in this macro invocation
| |
= help: consider importing this attribute macro:
crate::empty_helper
= note: this error originates in the macro `gen_helper_use` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `gen_helper_use` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider importing this attribute macro
|
LL + use crate::empty_helper;
|
error[E0659]: `empty_helper` is ambiguous error[E0659]: `empty_helper` is ambiguous
--> $DIR/derive-helper-shadowing.rs:26:13 --> $DIR/derive-helper-shadowing.rs:26:13