1 use clippy_utils
::diagnostics
::span_lint_and_then
;
2 use rustc_ast
::{Item, ItemKind, UseTreeKind}
;
3 use rustc_errors
::Applicability
;
4 use rustc_lint
::{EarlyContext, EarlyLintPass}
;
5 use rustc_session
::declare_lint_pass
;
6 use rustc_span
::symbol
::kw
;
10 /// Checks for imports ending in `::{self}`.
12 /// ### Why is this bad?
13 /// In most cases, this can be written much more cleanly by omitting `::{self}`.
15 /// ### Known problems
16 /// Removing `::{self}` will cause any non-module items at the same path to also be imported.
17 /// This might cause a naming conflict (https://github.com/rust-lang/rustfmt/issues/3568). This lint makes no attempt
18 /// to detect this scenario and that is why it is a restriction lint.
22 /// use std::io::{self};
28 #[clippy::version = "1.53.0"]
29 pub UNNECESSARY_SELF_IMPORTS
,
31 "imports ending in `::{self}`, which can be omitted"
34 declare_lint_pass
!(UnnecessarySelfImports
=> [UNNECESSARY_SELF_IMPORTS
]);
36 impl EarlyLintPass
for UnnecessarySelfImports
{
37 fn check_item(&mut self, cx
: &EarlyContext
<'_
>, item
: &Item
) {
38 if let ItemKind
::Use(use_tree
) = &item
.kind
39 && let UseTreeKind
::Nested(nodes
) = &use_tree
.kind
40 && let [(self_tree
, _
)] = &**nodes
41 && let [self_seg
] = &*self_tree
.prefix
.segments
42 && self_seg
.ident
.name
== kw
::SelfLower
43 && let Some(last_segment
) = use_tree
.prefix
.segments
.last()
47 UNNECESSARY_SELF_IMPORTS
,
49 "import ending with `::{self}`",
52 last_segment
.span().with_hi(item
.span
.hi()),
53 "consider omitting `::{self}`",
57 if let UseTreeKind
::Simple(Some(alias
)) = self_tree
.kind
{
58 format
!(" as {alias}")
63 Applicability
::MaybeIncorrect
,
65 diag
.note("this will slightly change semantics; any non-module items at the same path will also be imported");