]> git.lizzy.rs Git - rust.git/blobdiff - clippy_lints/src/verbose_file_reads.rs
Merge commit '4911ab124c481430672a3833b37075e6435ec34d' into clippyup
[rust.git] / clippy_lints / src / verbose_file_reads.rs
index 93256790211a44823b105b956b27f9af50a1e4f6..32574d9d6c9a821fcf0f5db89339ba81e4829908 100644 (file)
@@ -8,57 +8,61 @@
     /// **What it does:** Checks for use of File::read_to_end and File::read_to_string.
     ///
     /// **Why is this bad?** `fs::{read, read_to_string}` provide the same functionality when `buf` is empty with fewer imports and no intermediate values.
+    /// See also: [fs::read docs](https://doc.rust-lang.org/std/fs/fn.read.html), [fs::read_to_string docs](https://doc.rust-lang.org/std/fs/fn.read_to_string.html)
     ///
     /// **Known problems:** None.
     ///
     /// **Example:**
     ///
-    /// ```rust, ignore
-    /// let mut f = File::open("foo.txt")?;
+    /// ```rust,no_run
+    /// # use std::io::Read;
+    /// # use std::fs::File;
+    /// let mut f = File::open("foo.txt").unwrap();
     /// let mut bytes = Vec::new();
-    /// f.read_to_end(&mut bytes)?;
+    /// f.read_to_end(&mut bytes).unwrap();
     /// ```
     /// Can be written more concisely as
-    /// ```rust, ignore
-    /// let mut bytes = fs::read("foo.txt")?;
+    /// ```rust,no_run
+    /// # use std::fs;
+    /// let mut bytes = fs::read("foo.txt").unwrap();
     /// ```
     pub VERBOSE_FILE_READS,
-    complexity,
+    restriction,
     "use of `File::read_to_end` or `File::read_to_string`"
 }
 
 declare_lint_pass!(VerboseFileReads => [VERBOSE_FILE_READS]);
 
-impl<'a, 'tcx> LateLintPass<'a, 'tcx> for VerboseFileReads {
-    fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) {
+impl<'tcx> LateLintPass<'tcx> for VerboseFileReads {
+    fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
         if is_file_read_to_end(cx, expr) {
             span_lint_and_help(
                 cx,
                 VERBOSE_FILE_READS,
                 expr.span,
-                "use of File::read_to_end",
-                "consider using fs::read instead",
+                "use of `File::read_to_end`",
+                None,
+                "consider using `fs::read` instead",
             );
         } else if is_file_read_to_string(cx, expr) {
             span_lint_and_help(
                 cx,
                 VERBOSE_FILE_READS,
                 expr.span,
-                "use of File::read_to_string",
-                "consider using fs::read_to_string instead",
+                "use of `File::read_to_string`",
+                None,
+                "consider using `fs::read_to_string` instead",
             )
-        } else {
-            // Don't care
         }
     }
 }
 
-fn is_file_read_to_end<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) -> bool {
+fn is_file_read_to_end<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> bool {
     if_chain! {
-        if let ExprKind::MethodCall(method_name, _, exprs) = expr.kind;
+        if let ExprKind::MethodCall(method_name, _, exprs, _) = expr.kind;
         if method_name.ident.as_str() == "read_to_end";
         if let ExprKind::Path(QPath::Resolved(None, _)) = &exprs[0].kind;
-        let ty = cx.tables.expr_ty(&exprs[0]);
+        let ty = cx.typeck_results().expr_ty(&exprs[0]);
         if match_type(cx, ty, &paths::FILE);
         then {
             return true
@@ -67,12 +71,12 @@ fn is_file_read_to_end<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'t
     false
 }
 
-fn is_file_read_to_string<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) -> bool {
+fn is_file_read_to_string<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> bool {
     if_chain! {
-        if let ExprKind::MethodCall(method_name, _, exprs) = expr.kind;
+        if let ExprKind::MethodCall(method_name, _, exprs, _) = expr.kind;
         if method_name.ident.as_str() == "read_to_string";
         if let ExprKind::Path(QPath::Resolved(None, _)) = &exprs[0].kind;
-        let ty = cx.tables.expr_ty(&exprs[0]);
+        let ty = cx.typeck_results().expr_ty(&exprs[0]);
         if match_type(cx, ty, &paths::FILE);
         then {
             return true