-use syntax::ast::{Item, ItemKind, Ty, TyKind};
+use syntax::ast::*;
use rustc::lint::{EarlyContext, EarlyLintPass, LintArray, LintPass};
-use utils::{in_macro, span_lint_and_then};
+use rustc::{declare_lint, lint_array};
+use crate::utils::{in_macro, snippet, span_lint_and_then};
/// **What it does:** Checks for constants with an explicit `'static` lifetime.
///
/// ```rust
/// const FOO: &[(&str, &str, fn(&Bar) -> bool)] = &[...]
/// ```
-
-declare_lint! {
+declare_clippy_lint! {
pub CONST_STATIC_LIFETIME,
- Warn,
+ style,
"Using explicit `'static` lifetime for constants when elision rules would allow omitting them."
}
TyKind::Path(..) | TyKind::Slice(..) | TyKind::Array(..) |
TyKind::Tup(..) => {
if lifetime.ident.name == "'static" {
- let mut sug: String = String::new();
+ let snip = snippet(cx, borrow_type.ty.span, "<type>");
+ let sugg = format!("&{}", snip);
span_lint_and_then(
cx,
CONST_STATIC_LIFETIME,
- lifetime.span,
+ lifetime.ident.span,
"Constants have by default a `'static` lifetime",
|db| {
- db.span_suggestion(lifetime.span, "consider removing `'static`", sug);
+ db.span_suggestion(ty.span, "consider removing `'static`", sugg);
},
);
}
}
}
}
+
+ // Don't check associated consts because `'static` cannot be elided on those (issue #2438)
}