Make "consider importing" consistent for macros
This commit is contained in:
parent
8b35c0bb0f
commit
5bd8ba8493
@ -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![],
|
||||||
"",
|
"",
|
||||||
|
@ -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));
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user