From 80639164770bd5755443b52073d358c7496a030a Mon Sep 17 00:00:00 2001 From: Florian Gilcher Date: Sat, 17 Oct 2015 20:16:54 +0200 Subject: [PATCH] Cleanup as discussed in PR --- src/lib.rs | 4 ++-- src/needless_features.rs | 22 +++++++++++++--------- src/utils.rs | 13 +++++++++++++ tests/compile-fail/needless_features.rs | 12 ++++++++++++ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3175b92be4e..a3657460fe9 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -152,8 +152,8 @@ pub fn plugin_registrar(reg: &mut Registry) { mut_reference::UNNECESSARY_MUT_PASSED, mutex_atomic::MUTEX_ATOMIC, needless_bool::NEEDLESS_BOOL, - needless_features::AS_MUT_SLICE, - needless_features::AS_SLICE, + needless_features::UNSTABLE_AS_MUT_SLICE, + needless_features::UNSTABLE_AS_SLICE, open_options::NONSENSICAL_OPEN_OPTIONS, precedence::PRECEDENCE, ptr_arg::PTR_ARG, diff --git a/src/needless_features.rs b/src/needless_features.rs index 950057da26c..b1d38df7311 100644 --- a/src/needless_features.rs +++ b/src/needless_features.rs @@ -6,44 +6,48 @@ use rustc::lint::*; use rustc_front::hir::*; use utils::{span_lint}; +use utils; declare_lint! { - pub AS_SLICE, + pub UNSTABLE_AS_SLICE, Warn, "as_slice is not stable and can be replaced by & v[..]\ see https://github.com/rust-lang/rust/issues/27729" } declare_lint! { - pub AS_MUT_SLICE, + pub UNSTABLE_AS_MUT_SLICE, Warn, "as_mut_slice is not stable and can be replaced by &mut v[..]\ see https://github.com/rust-lang/rust/issues/27729" } - #[derive(Copy,Clone)] pub struct NeedlessFeaturesPass; impl LintPass for NeedlessFeaturesPass { fn get_lints(&self) -> LintArray { - lint_array!(AS_SLICE,AS_MUT_SLICE) + lint_array!(UNSTABLE_AS_SLICE,UNSTABLE_AS_MUT_SLICE) } } impl LateLintPass for NeedlessFeaturesPass { fn check_expr(&mut self, cx: &LateContext, expr: &Expr) { if let ExprMethodCall(ref name, _, _) = expr.node { - if name.node.as_str() == "as_slice" { - span_lint(cx, AS_SLICE, expr.span, + if name.node.as_str() == "as_slice" && check_paths(cx, expr) { + span_lint(cx, UNSTABLE_AS_SLICE, expr.span, "used as_slice() from the 'convert' nightly feature. Use &[..] \ instead"); } - if name.node.as_str() == "as_mut_slice" { - span_lint(cx, AS_MUT_SLICE, expr.span, + if name.node.as_str() == "as_mut_slice" && check_paths(cx, expr) { + span_lint(cx, UNSTABLE_AS_MUT_SLICE, expr.span, "used as_mut_slice() from the 'convert' nightly feature. Use &mut [..] \ instead"); } } } -} \ No newline at end of file +} + +fn check_paths(cx: &LateContext, expr: &Expr) -> bool { + utils::match_impl_method(cx, expr, &["collections", "vec", "Vec"]) +} diff --git a/src/utils.rs b/src/utils.rs index 1ba6029ebe6..c3ebfd8147d 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -118,6 +118,19 @@ pub fn match_type(cx: &LateContext, ty: ty::Ty, path: &[&str]) -> bool { } } +/// check if method call given in "expr" belongs to given trait +pub fn match_impl_method(cx: &LateContext, expr: &Expr, path: &[&str]) -> bool { + let method_call = ty::MethodCall::expr(expr.id); + + let trt_id = cx.tcx.tables + .borrow().method_map.get(&method_call) + .and_then(|callee| cx.tcx.impl_of_method(callee.def_id)); + if let Some(trt_id) = trt_id { + match_def_path(cx, trt_id, path) + } else { + false + } +} /// check if method call given in "expr" belongs to given trait pub fn match_trait_method(cx: &LateContext, expr: &Expr, path: &[&str]) -> bool { let method_call = ty::MethodCall::expr(expr.id); diff --git a/tests/compile-fail/needless_features.rs b/tests/compile-fail/needless_features.rs index 02639aea66f..dee2a19d5d0 100644 --- a/tests/compile-fail/needless_features.rs +++ b/tests/compile-fail/needless_features.rs @@ -12,6 +12,18 @@ fn test_as_slice() { v2.as_mut_slice(); //~ERROR used as_mut_slice() from the 'convert' nightly feature. Use &mut [..] } +struct ShouldWork; + +impl ShouldWork { + fn as_slice(&self) -> &ShouldWork { self } +} + +fn test_should_work() { + let sw = ShouldWork; + sw.as_slice(); +} + fn main() { test_as_slice(); + test_should_work(); }