-use crate::utils::{in_macro_or_desugar, snippet, span_lint_and_then};
+use crate::redundant_static_lifetime::RedundantStaticLifetime;
+use crate::utils::in_macro_or_desugar;
use rustc::lint::{EarlyContext, EarlyLintPass, LintArray, LintPass};
use rustc::{declare_lint_pass, declare_tool_lint};
-use rustc_errors::Applicability;
use syntax::ast::*;
declare_clippy_lint! {
impl StaticConst {
// Recursively visit types
fn visit_type(&mut self, ty: &Ty, cx: &EarlyContext<'_>) {
- match ty.node {
- // Be careful of nested structures (arrays and tuples)
- TyKind::Array(ref ty, _) => {
- self.visit_type(&*ty, cx);
- },
- TyKind::Tup(ref tup) => {
- for tup_ty in tup {
- self.visit_type(&*tup_ty, cx);
- }
- },
- // This is what we are looking for !
- TyKind::Rptr(ref optional_lifetime, ref borrow_type) => {
- // Match the 'static lifetime
- if let Some(lifetime) = *optional_lifetime {
- match borrow_type.ty.node {
- TyKind::Path(..) | TyKind::Slice(..) | TyKind::Array(..) | TyKind::Tup(..) => {
- if lifetime.ident.name == syntax::symbol::kw::StaticLifetime {
- let snip = snippet(cx, borrow_type.ty.span, "<type>");
- let sugg = format!("&{}", snip);
- span_lint_and_then(
- cx,
- CONST_STATIC_LIFETIME,
- lifetime.ident.span,
- "Constants have by default a `'static` lifetime",
- |db| {
- db.span_suggestion(
- ty.span,
- "consider removing `'static`",
- sugg,
- Applicability::MachineApplicable, //snippet
- );
- },
- );
- }
- },
- _ => {},
- }
- }
- self.visit_type(&*borrow_type.ty, cx);
- },
- TyKind::Slice(ref ty) => {
- self.visit_type(ty, cx);
- },
- _ => {},
- }
+ let mut rsl =
+ RedundantStaticLifetime::new(CONST_STATIC_LIFETIME, "Constants have by default a `'static` lifetime");
+ rsl.visit_type(ty, cx)
}
}
mod consts;
#[macro_use]
mod utils;
+mod redundant_static_lifetime;
// begin lints modules, do not remove this comment, it’s used in `update_lints`
pub mod approx_const;
--- /dev/null
+use crate::utils::{snippet, span_lint_and_then};
+use rustc::lint::{EarlyContext, Lint};
+use rustc_errors::Applicability;
+use syntax::ast::*;
+
+pub struct RedundantStaticLifetime {
+ lint: &'static Lint,
+ reason: &'static str,
+}
+
+impl RedundantStaticLifetime {
+ pub fn new(lint: &'static Lint, reason: &'static str) -> Self {
+ Self { lint, reason }
+ }
+ // Recursively visit types
+ pub fn visit_type(&mut self, ty: &Ty, cx: &EarlyContext<'_>) {
+ match ty.node {
+ // Be careful of nested structures (arrays and tuples)
+ TyKind::Array(ref ty, _) => {
+ self.visit_type(&*ty, cx);
+ },
+ TyKind::Tup(ref tup) => {
+ for tup_ty in tup {
+ self.visit_type(&*tup_ty, cx);
+ }
+ },
+ // This is what we are looking for !
+ TyKind::Rptr(ref optional_lifetime, ref borrow_type) => {
+ // Match the 'static lifetime
+ if let Some(lifetime) = *optional_lifetime {
+ match borrow_type.ty.node {
+ TyKind::Path(..) | TyKind::Slice(..) | TyKind::Array(..) | TyKind::Tup(..) => {
+ if lifetime.ident.name == syntax::symbol::kw::StaticLifetime {
+ let snip = snippet(cx, borrow_type.ty.span, "<type>");
+ let sugg = format!("&{}", snip);
+ span_lint_and_then(cx, self.lint, lifetime.ident.span, self.reason, |db| {
+ db.span_suggestion(
+ ty.span,
+ "consider removing `'static`",
+ sugg,
+ Applicability::MachineApplicable, //snippet
+ );
+ });
+ }
+ },
+ _ => {},
+ }
+ }
+ self.visit_type(&*borrow_type.ty, cx);
+ },
+ TyKind::Slice(ref ty) => {
+ self.visit_type(ty, cx);
+ },
+ _ => {},
+ }
+ }
+}