use crate::utils::{in_macro, span_lint_and_sugg}; use if_chain::if_chain; use rustc_errors::Applicability; use rustc_lint::{EarlyContext, EarlyLintPass}; use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_span::edition::Edition; use syntax::ast::{Item, ItemKind, UseTreeKind}; declare_clippy_lint! { /// **What it does:** Checking for imports with single component use path. /// /// **Why is this bad?** Import with single component use path such as `use cratename;` /// is not necessary, and thus should be removed. /// /// **Known problems:** None. /// /// **Example:** /// /// ```rust, ignore /// use regex; /// /// fn main() { /// regex::Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap(); /// } /// ``` /// Better as /// ```rust, ignore /// fn main() { /// regex::Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap(); /// } /// ``` pub SINGLE_COMPONENT_PATH_IMPORTS, style, "imports with single component path are redundant" } declare_lint_pass!(SingleComponentPathImports => [SINGLE_COMPONENT_PATH_IMPORTS]); impl EarlyLintPass for SingleComponentPathImports { fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) { if_chain! { if !in_macro(item.span); if cx.sess.opts.edition == Edition::Edition2018; if !item.vis.node.is_pub(); if let ItemKind::Use(use_tree) = &item.kind; if let segments = &use_tree.prefix.segments; if segments.len() == 1; if let UseTreeKind::Simple(None, _, _) = use_tree.kind; then { span_lint_and_sugg( cx, SINGLE_COMPONENT_PATH_IMPORTS, item.span, "this import is redundant", "remove it entirely", String::new(), Applicability::MachineApplicable ); } } } }