mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-18 18:04:13 +00:00
Auto merge of #104963 - petrochenkov:noaddids2, r=cjgillot
rustc_ast_lowering: Stop lowering imports into multiple items Lower them into a single item with multiple resolutions instead. This also allows to remove additional `NodId`s and `DefId`s related to those additional items.
This commit is contained in:
commit
a1d22808af
@ -106,7 +106,9 @@ impl<'tcx> LateLintPass<'tcx> for DisallowedTypes {
|
||||
|
||||
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'tcx>) {
|
||||
if let ItemKind::Use(path, UseKind::Single) = &item.kind {
|
||||
self.check_res_emit(cx, &path.res, item.span);
|
||||
for res in &path.res {
|
||||
self.check_res_emit(cx, res, item.span);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -126,7 +126,7 @@ impl<'a, 'tcx> Visitor<'tcx> for SelfFinder<'a, 'tcx> {
|
||||
self.cx.tcx.hir()
|
||||
}
|
||||
|
||||
fn visit_path(&mut self, path: &'tcx Path<'tcx>, _id: HirId) {
|
||||
fn visit_path(&mut self, path: &Path<'tcx>, _id: HirId) {
|
||||
for segment in path.segments {
|
||||
match segment.ident.name {
|
||||
kw::SelfLower => self.lower.push(segment.ident.span),
|
||||
|
@ -94,7 +94,10 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports {
|
||||
let hir_id = item.hir_id();
|
||||
let attrs = cx.tcx.hir().attrs(hir_id);
|
||||
if let Some(mac_attr) = attrs.iter().find(|attr| attr.has_name(sym::macro_use));
|
||||
if let Res::Def(DefKind::Mod, id) = path.res;
|
||||
if let Some(id) = path.res.iter().find_map(|res| match res {
|
||||
Res::Def(DefKind::Mod, id) => Some(id),
|
||||
_ => None,
|
||||
});
|
||||
if !id.is_local();
|
||||
then {
|
||||
for kid in cx.tcx.module_children(id).iter() {
|
||||
|
@ -97,7 +97,7 @@ struct UnwrapVisitor<'a, 'tcx> {
|
||||
impl<'a, 'tcx> Visitor<'tcx> for UnwrapVisitor<'a, 'tcx> {
|
||||
type NestedFilter = nested_filter::All;
|
||||
|
||||
fn visit_path(&mut self, path: &'tcx Path<'_>, _id: HirId) {
|
||||
fn visit_path(&mut self, path: &Path<'tcx>, _id: HirId) {
|
||||
self.identifiers.insert(ident(path));
|
||||
walk_path(self, path);
|
||||
}
|
||||
@ -116,7 +116,7 @@ struct MapExprVisitor<'a, 'tcx> {
|
||||
impl<'a, 'tcx> Visitor<'tcx> for MapExprVisitor<'a, 'tcx> {
|
||||
type NestedFilter = nested_filter::All;
|
||||
|
||||
fn visit_path(&mut self, path: &'tcx Path<'_>, _id: HirId) {
|
||||
fn visit_path(&mut self, path: &Path<'tcx>, _id: HirId) {
|
||||
if self.identifiers.contains(&ident(path)) {
|
||||
self.found_identifier = true;
|
||||
return;
|
||||
|
@ -66,35 +66,38 @@ impl LateLintPass<'_> for ImportRename {
|
||||
}
|
||||
|
||||
fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) {
|
||||
if_chain! {
|
||||
if let ItemKind::Use(path, UseKind::Single) = &item.kind;
|
||||
if let Res::Def(_, id) = path.res;
|
||||
if let Some(name) = self.renames.get(&id);
|
||||
// Remove semicolon since it is not present for nested imports
|
||||
let span_without_semi = cx.sess().source_map().span_until_char(item.span, ';');
|
||||
if let Some(snip) = snippet_opt(cx, span_without_semi);
|
||||
if let Some(import) = match snip.split_once(" as ") {
|
||||
None => Some(snip.as_str()),
|
||||
Some((import, rename)) => {
|
||||
if rename.trim() == name.as_str() {
|
||||
None
|
||||
} else {
|
||||
Some(import.trim())
|
||||
if let ItemKind::Use(path, UseKind::Single) = &item.kind {
|
||||
for &res in &path.res {
|
||||
if_chain! {
|
||||
if let Res::Def(_, id) = res;
|
||||
if let Some(name) = self.renames.get(&id);
|
||||
// Remove semicolon since it is not present for nested imports
|
||||
let span_without_semi = cx.sess().source_map().span_until_char(item.span, ';');
|
||||
if let Some(snip) = snippet_opt(cx, span_without_semi);
|
||||
if let Some(import) = match snip.split_once(" as ") {
|
||||
None => Some(snip.as_str()),
|
||||
Some((import, rename)) => {
|
||||
if rename.trim() == name.as_str() {
|
||||
None
|
||||
} else {
|
||||
Some(import.trim())
|
||||
}
|
||||
},
|
||||
};
|
||||
then {
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
MISSING_ENFORCED_IMPORT_RENAMES,
|
||||
span_without_semi,
|
||||
"this import should be renamed",
|
||||
"try",
|
||||
format!(
|
||||
"{import} as {name}",
|
||||
),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
},
|
||||
};
|
||||
then {
|
||||
span_lint_and_sugg(
|
||||
cx,
|
||||
MISSING_ENFORCED_IMPORT_RENAMES,
|
||||
span_without_semi,
|
||||
"this import should be renamed",
|
||||
"try",
|
||||
format!(
|
||||
"{import} as {name}",
|
||||
),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ impl<'tcx> LateLintPass<'tcx> for RedundantPubCrate {
|
||||
|
||||
fn is_not_macro_export<'tcx>(item: &'tcx Item<'tcx>) -> bool {
|
||||
if let ItemKind::Use(path, _) = item.kind {
|
||||
if let Res::Def(DefKind::Macro(MacroKind::Bang), _) = path.res {
|
||||
if path.res.iter().all(|res| matches!(res, Res::Def(DefKind::Macro(MacroKind::Bang), _))) {
|
||||
return false;
|
||||
}
|
||||
} else if let ItemKind::Macro(..) = item.kind {
|
||||
|
@ -149,7 +149,7 @@ impl SingleComponentPathImports {
|
||||
|
||||
// keep track of `use some_module;` usages
|
||||
if segments.len() == 1 {
|
||||
if let UseTreeKind::Simple(None, _, _) = use_tree.kind {
|
||||
if let UseTreeKind::Simple(None) = use_tree.kind {
|
||||
let name = segments[0].ident.name;
|
||||
if !macros.contains(&name) {
|
||||
single_use_usages.push(SingleUse {
|
||||
@ -169,7 +169,7 @@ impl SingleComponentPathImports {
|
||||
for tree in trees {
|
||||
let segments = &tree.0.prefix.segments;
|
||||
if segments.len() == 1 {
|
||||
if let UseTreeKind::Simple(None, _, _) = tree.0.kind {
|
||||
if let UseTreeKind::Simple(None) = tree.0.kind {
|
||||
let name = segments[0].ident.name;
|
||||
if !macros.contains(&name) {
|
||||
single_use_usages.push(SingleUse {
|
||||
|
@ -57,7 +57,7 @@ impl EarlyLintPass for UnnecessarySelfImports {
|
||||
format!(
|
||||
"{}{};",
|
||||
last_segment.ident,
|
||||
if let UseTreeKind::Simple(Some(alias), ..) = self_tree.kind { format!(" as {alias}") } else { String::new() },
|
||||
if let UseTreeKind::Simple(Some(alias)) = self_tree.kind { format!(" as {alias}") } else { String::new() },
|
||||
),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
|
@ -39,7 +39,7 @@ impl EarlyLintPass for UnsafeNameRemoval {
|
||||
|
||||
fn check_use_tree(use_tree: &UseTree, cx: &EarlyContext<'_>, span: Span) {
|
||||
match use_tree.kind {
|
||||
UseTreeKind::Simple(Some(new_name), ..) => {
|
||||
UseTreeKind::Simple(Some(new_name)) => {
|
||||
let old_name = use_tree
|
||||
.prefix
|
||||
.segments
|
||||
@ -48,7 +48,7 @@ fn check_use_tree(use_tree: &UseTree, cx: &EarlyContext<'_>, span: Span) {
|
||||
.ident;
|
||||
unsafe_to_safe_check(old_name, new_name, cx, span);
|
||||
},
|
||||
UseTreeKind::Simple(None, ..) | UseTreeKind::Glob => {},
|
||||
UseTreeKind::Simple(None) | UseTreeKind::Glob => {},
|
||||
UseTreeKind::Nested(ref nested_use_tree) => {
|
||||
for (use_tree, _) in nested_use_tree {
|
||||
check_use_tree(use_tree, cx, span);
|
||||
|
@ -330,7 +330,7 @@ struct LintCollector<'a, 'tcx> {
|
||||
impl<'a, 'tcx> Visitor<'tcx> for LintCollector<'a, 'tcx> {
|
||||
type NestedFilter = nested_filter::All;
|
||||
|
||||
fn visit_path(&mut self, path: &'tcx Path<'_>, _: HirId) {
|
||||
fn visit_path(&mut self, path: &Path<'_>, _: HirId) {
|
||||
if path.segments.len() == 1 {
|
||||
self.output.insert(path.segments[0].ident.name);
|
||||
}
|
||||
|
@ -1019,7 +1019,7 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for ApplicabilityResolver<'a, 'hir> {
|
||||
self.cx.tcx.hir()
|
||||
}
|
||||
|
||||
fn visit_path(&mut self, path: &'hir hir::Path<'hir>, _id: hir::HirId) {
|
||||
fn visit_path(&mut self, path: &hir::Path<'hir>, _id: hir::HirId) {
|
||||
for (index, enum_value) in paths::APPLICABILITY_VALUES.iter().enumerate() {
|
||||
if match_path(path, enum_value) {
|
||||
self.add_new_index(index);
|
||||
|
@ -176,7 +176,8 @@ impl LateLintPass<'_> for WildcardImports {
|
||||
format!("{import_source_snippet}::{imports_string}")
|
||||
};
|
||||
|
||||
let (lint, message) = if let Res::Def(DefKind::Enum, _) = use_path.res {
|
||||
// Glob imports always have a single resolution.
|
||||
let (lint, message) = if let Res::Def(DefKind::Enum, _) = use_path.res[0] {
|
||||
(ENUM_GLOB_USE, "usage of wildcard import for enum variants")
|
||||
} else {
|
||||
(WILDCARD_IMPORTS, "usage of wildcard import")
|
||||
|
@ -566,7 +566,7 @@ pub fn eq_use_tree_kind(l: &UseTreeKind, r: &UseTreeKind) -> bool {
|
||||
use UseTreeKind::*;
|
||||
match (l, r) {
|
||||
(Glob, Glob) => true,
|
||||
(Simple(l, _, _), Simple(r, _, _)) => both(l, r, |l, r| eq_id(*l, *r)),
|
||||
(Simple(l), Simple(r)) => both(l, r, |l, r| eq_id(*l, *r)),
|
||||
(Nested(l), Nested(r)) => over(l, r, |(l, _), (r, _)| eq_use_tree(l, r)),
|
||||
_ => false,
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for BindingUsageFinder<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_path(&mut self, path: &'tcx hir::Path<'tcx>, _: hir::HirId) {
|
||||
fn visit_path(&mut self, path: &hir::Path<'tcx>, _: hir::HirId) {
|
||||
if let hir::def::Res::Local(id) = path.res {
|
||||
if self.binding_ids.contains(&id) {
|
||||
self.usage_found = true;
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: `macro_use` attributes are no longer needed in the Rust 2018 edition
|
||||
--> $DIR/macro_use_imports.rs:23:5
|
||||
--> $DIR/macro_use_imports.rs:25:5
|
||||
|
|
||||
LL | #[macro_use]
|
||||
| ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{inner::foofoo, inner::try_err};`
|
||||
| ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::nested::string_add;`
|
||||
|
|
||||
= note: `-D clippy::macro-use-imports` implied by `-D warnings`
|
||||
|
||||
@ -13,10 +13,10 @@ LL | #[macro_use]
|
||||
| ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mini_mac::ClippyMiniMacroTest;`
|
||||
|
||||
error: `macro_use` attributes are no longer needed in the Rust 2018 edition
|
||||
--> $DIR/macro_use_imports.rs:25:5
|
||||
--> $DIR/macro_use_imports.rs:23:5
|
||||
|
|
||||
LL | #[macro_use]
|
||||
| ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::inner::nested::string_add;`
|
||||
| ^^^^^^^^^^^^ help: remove the attribute and import the macro directly, try: `use mac::{inner::foofoo, inner::try_err};`
|
||||
|
||||
error: `macro_use` attributes are no longer needed in the Rust 2018 edition
|
||||
--> $DIR/macro_use_imports.rs:19:5
|
||||
|
Loading…
Reference in New Issue
Block a user