mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-23 05:03:21 +00:00
Rollup merge of #123344 - pietroalbini:pa-unused-imports, r=Nilstrieb
Remove braces when fixing a nested use tree into a single item [Back in 2019](https://github.com/rust-lang/rust/pull/56645) I added rustfix support for the `unused_imports` lint, to automatically remove them when running `cargo fix`. For the most part this worked great, but when removing all but one childs of a nested use tree it turned `use foo::{Unused, Used}` into `use foo::{Used}`. This is slightly annoying, because it then requires you to run `rustfmt` to get `use foo::Used`. This PR automatically removes braces and the surrouding whitespace when all but one child of a nested use tree are unused. To get it done I had to add the span of the nested use tree to the AST, and refactor a bit the code I wrote back then. A thing I noticed is, there doesn't seem to be any `//@ run-rustfix` test for fixing the `unused_imports` lint. I created a test in `tests/suggestions` (is that the right directory?) that for now tests just what I added in the PR. I can followup in a separate PR to add more tests for fixing `unused_lints`. This PR is best reviewed commit-by-commit.
This commit is contained in:
commit
eef082899d
4 changed files with 9 additions and 9 deletions
|
@ -201,8 +201,8 @@ impl SingleComponentPathImports {
|
||||||
|
|
||||||
if segments.is_empty() {
|
if segments.is_empty() {
|
||||||
// keep track of `use {some_module, some_other_module};` usages
|
// keep track of `use {some_module, some_other_module};` usages
|
||||||
if let UseTreeKind::Nested(trees) = &use_tree.kind {
|
if let UseTreeKind::Nested { items, .. } = &use_tree.kind {
|
||||||
for tree in trees {
|
for tree in items {
|
||||||
let segments = &tree.0.prefix.segments;
|
let segments = &tree.0.prefix.segments;
|
||||||
if segments.len() == 1 {
|
if segments.len() == 1 {
|
||||||
if let UseTreeKind::Simple(None) = tree.0.kind {
|
if let UseTreeKind::Simple(None) = tree.0.kind {
|
||||||
|
@ -229,8 +229,8 @@ impl SingleComponentPathImports {
|
||||||
}
|
}
|
||||||
|
|
||||||
// nested case such as `use self::{module1::Struct1, module2::Struct2}`
|
// nested case such as `use self::{module1::Struct1, module2::Struct2}`
|
||||||
if let UseTreeKind::Nested(trees) = &use_tree.kind {
|
if let UseTreeKind::Nested { items, .. } = &use_tree.kind {
|
||||||
for tree in trees {
|
for tree in items {
|
||||||
let segments = &tree.0.prefix.segments;
|
let segments = &tree.0.prefix.segments;
|
||||||
if !segments.is_empty() {
|
if !segments.is_empty() {
|
||||||
imports_reused_with_self.push(segments[0].ident.name);
|
imports_reused_with_self.push(segments[0].ident.name);
|
||||||
|
|
|
@ -36,8 +36,8 @@ declare_lint_pass!(UnnecessarySelfImports => [UNNECESSARY_SELF_IMPORTS]);
|
||||||
impl EarlyLintPass for UnnecessarySelfImports {
|
impl EarlyLintPass for UnnecessarySelfImports {
|
||||||
fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) {
|
fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) {
|
||||||
if let ItemKind::Use(use_tree) = &item.kind
|
if let ItemKind::Use(use_tree) = &item.kind
|
||||||
&& let UseTreeKind::Nested(nodes) = &use_tree.kind
|
&& let UseTreeKind::Nested { items, .. } = &use_tree.kind
|
||||||
&& let [(self_tree, _)] = &**nodes
|
&& let [(self_tree, _)] = &**items
|
||||||
&& let [self_seg] = &*self_tree.prefix.segments
|
&& let [self_seg] = &*self_tree.prefix.segments
|
||||||
&& self_seg.ident.name == kw::SelfLower
|
&& self_seg.ident.name == kw::SelfLower
|
||||||
&& let Some(last_segment) = use_tree.prefix.segments.last()
|
&& let Some(last_segment) = use_tree.prefix.segments.last()
|
||||||
|
|
|
@ -49,8 +49,8 @@ fn check_use_tree(use_tree: &UseTree, cx: &EarlyContext<'_>, span: Span) {
|
||||||
unsafe_to_safe_check(old_name, new_name, cx, span);
|
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) => {
|
UseTreeKind::Nested { ref items, .. } => {
|
||||||
for (use_tree, _) in nested_use_tree {
|
for (use_tree, _) in items {
|
||||||
check_use_tree(use_tree, cx, span);
|
check_use_tree(use_tree, cx, span);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -648,7 +648,7 @@ pub fn eq_use_tree_kind(l: &UseTreeKind, r: &UseTreeKind) -> bool {
|
||||||
match (l, r) {
|
match (l, r) {
|
||||||
(Glob, Glob) => true,
|
(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)),
|
(Nested { items: l, .. }, Nested { items: r, .. }) => over(l, r, |(l, _), (r, _)| eq_use_tree(l, r)),
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue