]> git.lizzy.rs Git - rust.git/commitdiff
Add seanmonstar's StrToString lint
authorManish Goregaokar <manishsmail@gmail.com>
Mon, 15 Dec 2014 14:53:45 +0000 (20:23 +0530)
committerManish Goregaokar <manishsmail@gmail.com>
Mon, 15 Dec 2014 19:16:39 +0000 (00:46 +0530)
README.md
src/lib.rs
src/misc.rs

index 0e04459bbd12579dcb57c1fdce014c16885f86d6..91caaeba41a9e622620a737ac67648e67f8827b7 100644 (file)
--- a/README.md
+++ b/README.md
@@ -9,6 +9,7 @@ Lints included in this crate:
  - `clippy_single_match`: Warns when a match statement with a single nontrivial arm (i.e, where the other arm is `_ => {}`) is used, and recommends `if let` instead.
  - `clippy_box_vec`: Warns on usage of `Box<Vec<T>>`
  - `clippy_dlist`: Warns on usage of `DList`
+ - `clippy_str_to_string`: Warns on usage of `str::to_string()`
 
 More to come, please [file an issue](https://github.com/Manishearth/rust-clippy/issues) if you have ideas!
 
index 380a530283cb453c73ace259c67460c13066ad80..386e8180c22d232866efb7dd7614c17e82c81c51 100644 (file)
@@ -20,4 +20,5 @@
 pub fn plugin_registrar(reg: &mut Registry) {
     reg.register_lint_pass(box types::TypePass as LintPassObject);
     reg.register_lint_pass(box misc::MiscPass as LintPassObject);
+    reg.register_lint_pass(box misc::StrToStringPass as LintPassObject);
 }
index c70d4b48c1c5445708a6a6147c3209c61c504643..2a77ecc3467bd57ff94875baf3b3dfc7c1415434 100644 (file)
@@ -2,6 +2,7 @@
 use syntax::ast;
 use syntax::ast::*;
 use rustc::lint::{Context, LintPass, LintArray, Lint, Level};
+use rustc::middle::ty::{mod, expr_ty, ty_str, ty_ptr, ty_rptr};
 use syntax::codemap::Span;
 
 use types::span_note_and_lint;
@@ -44,3 +45,39 @@ fn check_expr(&mut self, cx: &Context, expr: &Expr) {
         }
     }
 }
+
+
+declare_lint!(CLIPPY_STR_TO_STRING, Warn, "Warn when a String could use into_string() instead of to_string()")
+
+pub struct StrToStringPass;
+
+impl LintPass for StrToStringPass {
+    fn get_lints(&self) -> LintArray {
+        lint_array!(CLIPPY_STR_TO_STRING)
+    }
+
+    fn check_expr(&mut self, cx: &Context, expr: &ast::Expr) {
+        match expr.node {
+            ast::ExprMethodCall(ref method, _, ref args)
+                if method.node.as_str() == "to_string"
+                && is_str(cx, &*args[0]) => {
+                cx.span_lint(CLIPPY_STR_TO_STRING, expr.span, "str.into_string() is faster");
+            },
+            _ => ()
+        }
+
+        fn is_str(cx: &Context, expr: &ast::Expr) -> bool {
+            fn walk_ty<'t>(ty: ty::Ty<'t>) -> ty::Ty<'t> {
+                //println!("{}: -> {}", depth, ty);
+                match ty.sty {
+                    ty_ptr(ref tm) | ty_rptr(_, ref tm) => walk_ty(tm.ty),
+                    _ => ty
+                }
+            }
+            match walk_ty(expr_ty(cx.tcx, expr)).sty {
+                ty_str => true,
+                _ => false
+            }
+        }
+    }
+}