Handle renamed imports.
This commit extends the suggestion to handle imports that are aliased to another name.
This commit is contained in:
parent
d84907bbcc
commit
d589cf9111
@ -11,7 +11,7 @@
|
||||
use syntax_pos::Span;
|
||||
|
||||
use crate::macros::ParentScope;
|
||||
use crate::resolve_imports::{ImportDirective, ImportResolver};
|
||||
use crate::resolve_imports::{ImportDirective, ImportDirectiveSubclass, ImportResolver};
|
||||
use crate::{import_candidate_to_enum_paths, is_self_type, is_self_value, path_names_to_string};
|
||||
use crate::{AssocSuggestion, CrateLint, ImportSuggestion, ModuleOrUniformRoot, PathResult,
|
||||
PathSource, Resolver, Segment, Suggestion};
|
||||
@ -610,11 +610,16 @@ pub(crate) fn check_for_module_export_macro(
|
||||
let resolution = resolutions.get(&(ident, MacroNS))?;
|
||||
let binding = resolution.borrow().binding()?;
|
||||
if let Def::Macro(_, MacroKind::Bang) = binding.def() {
|
||||
let name = crate_module.kind.name().unwrap();
|
||||
let module_name = crate_module.kind.name().unwrap();
|
||||
let import = match directive.subclass {
|
||||
ImportDirectiveSubclass::SingleImport { source, target, .. } if source != target =>
|
||||
format!("{} as {}", source, target),
|
||||
_ => format!("{}", ident),
|
||||
};
|
||||
let suggestion = Some((
|
||||
directive.span,
|
||||
String::from("a macro with this name exists at the root of the crate"),
|
||||
format!("{}::{}", name, ident),
|
||||
format!("{}::{}", module_name, import),
|
||||
Applicability::MaybeIncorrect,
|
||||
));
|
||||
let note = vec![
|
||||
|
@ -1111,21 +1111,17 @@ fn finalize_import(
|
||||
}
|
||||
});
|
||||
|
||||
let (suggestion, note) = if let Some((suggestion, note)) =
|
||||
self.check_for_module_export_macro(directive, module, ident)
|
||||
{
|
||||
let lev_suggestion = find_best_match_for_name(names, &ident.as_str(), None)
|
||||
.map(|suggestion|
|
||||
(ident.span, String::from("a similar name exists in the module"),
|
||||
suggestion.to_string(), Applicability::MaybeIncorrect)
|
||||
);
|
||||
|
||||
(
|
||||
suggestion.or_else(||
|
||||
find_best_match_for_name(names, &ident.as_str(), None)
|
||||
.map(|suggestion|
|
||||
(ident.span, String::from("a similar name exists in the module"),
|
||||
suggestion.to_string(), Applicability::MaybeIncorrect)
|
||||
)),
|
||||
note,
|
||||
)
|
||||
} else {
|
||||
(None, Vec::new())
|
||||
let (suggestion, note) = match self.check_for_module_export_macro(
|
||||
directive, module, ident,
|
||||
) {
|
||||
Some((suggestion, note)) => (suggestion.or(lev_suggestion), note),
|
||||
_ => (lev_suggestion, Vec::new()),
|
||||
};
|
||||
|
||||
let label = match module {
|
||||
|
@ -3,6 +3,21 @@
|
||||
// edition:2018
|
||||
// run-rustfix
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
// This tests the suggestion to import macros from the root of a crate. This aims to capture
|
||||
// the case where a user attempts to import a macro from the definition location instead of the
|
||||
// root of the crate and the macro is annotated with `#![macro_export]`.
|
||||
|
||||
// Edge cases..
|
||||
|
||||
mod renamed_import {
|
||||
use issue_59764::makro as baz;
|
||||
//~^ ERROR unresolved import `issue_59764::foo::makro` [E0432]
|
||||
}
|
||||
|
||||
// Simple case..
|
||||
|
||||
use issue_59764::makro;
|
||||
//~^ ERROR unresolved import `issue_59764::foo::makro` [E0432]
|
||||
|
||||
|
@ -3,6 +3,21 @@
|
||||
// edition:2018
|
||||
// run-rustfix
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
// This tests the suggestion to import macros from the root of a crate. This aims to capture
|
||||
// the case where a user attempts to import a macro from the definition location instead of the
|
||||
// root of the crate and the macro is annotated with `#![macro_export]`.
|
||||
|
||||
// Edge cases..
|
||||
|
||||
mod renamed_import {
|
||||
use issue_59764::foo::makro as baz;
|
||||
//~^ ERROR unresolved import `issue_59764::foo::makro` [E0432]
|
||||
}
|
||||
|
||||
// Simple case..
|
||||
|
||||
use issue_59764::foo::makro;
|
||||
//~^ ERROR unresolved import `issue_59764::foo::makro` [E0432]
|
||||
|
||||
|
@ -1,5 +1,17 @@
|
||||
error[E0432]: unresolved import `issue_59764::foo::makro`
|
||||
--> $DIR/issue-59764.rs:6:5
|
||||
--> $DIR/issue-59764.rs:15:9
|
||||
|
|
||||
LL | use issue_59764::foo::makro as baz;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `makro` in `foo`
|
||||
|
|
||||
= note: this could be because a macro annotated with `#[macro_export]` will be exported at the root of the crate instead of the module where it is defined
|
||||
help: a macro with this name exists at the root of the crate
|
||||
|
|
||||
LL | use issue_59764::makro as baz;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0432]: unresolved import `issue_59764::foo::makro`
|
||||
--> $DIR/issue-59764.rs:21:5
|
||||
|
|
||||
LL | use issue_59764::foo::makro;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ no `makro` in `foo`
|
||||
@ -11,7 +23,7 @@ LL | use issue_59764::makro;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: cannot determine resolution for the macro `makro`
|
||||
--> $DIR/issue-59764.rs:9:1
|
||||
--> $DIR/issue-59764.rs:24:1
|
||||
|
|
||||
LL | makro!(bar);
|
||||
| ^^^^^
|
||||
@ -19,12 +31,12 @@ LL | makro!(bar);
|
||||
= note: import resolution is stuck, try simplifying macro imports
|
||||
|
||||
error[E0425]: cannot find function `bar` in this scope
|
||||
--> $DIR/issue-59764.rs:13:5
|
||||
--> $DIR/issue-59764.rs:28:5
|
||||
|
|
||||
LL | bar();
|
||||
| ^^^ not found in this scope
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors occurred: E0425, E0432.
|
||||
For more information about an error, try `rustc --explain E0425`.
|
||||
|
Loading…
Reference in New Issue
Block a user