From b21cc36ee92a2cf3c387b47e40faa2aa4d39fd1a Mon Sep 17 00:00:00 2001 From: chansuke Date: Sat, 17 Dec 2022 21:13:02 +0900 Subject: [PATCH] hotfix: add help dialog for `PermissionExt` --- .../src/permissions_set_readonly_false.rs | 33 ++++++++++--------- .../ui/permissions_set_readonly_false.stderr | 2 ++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/clippy_lints/src/permissions_set_readonly_false.rs b/clippy_lints/src/permissions_set_readonly_false.rs index 6c463bd8f..e7095ec19 100644 --- a/clippy_lints/src/permissions_set_readonly_false.rs +++ b/clippy_lints/src/permissions_set_readonly_false.rs @@ -1,4 +1,4 @@ -use clippy_utils::diagnostics::span_lint_and_note; +use clippy_utils::diagnostics::span_lint_and_then; use clippy_utils::paths; use clippy_utils::ty::match_type; use rustc_ast::ast::LitKind; @@ -8,11 +8,11 @@ use rustc_session::{declare_lint_pass, declare_tool_lint}; declare_clippy_lint! { /// ### What it does - /// Checks for calls to `std::fs::Permissions.set_readonly` with argument `false` + /// Checks for calls to `std::fs::Permissions.set_readonly` with argument `false`. /// /// ### Why is this bad? - /// On Unix platforms this results in the file being world writable - /// + /// On Unix platforms this results in the file being world writable, + /// equivalent to `chmod a+w `. /// ### Example /// ```rust /// use std::fs::File; @@ -32,18 +32,21 @@ impl<'tcx> LateLintPass<'tcx> for PermissionsSetReadonlyFalse { fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) { if let ExprKind::MethodCall(path, receiver, [arg], _) = &expr.kind && match_type(cx, cx.typeck_results().expr_ty(receiver), &paths::PERMISSIONS) - && path.ident.name == sym!(set_readonly) - && let ExprKind::Lit(lit) = &arg.kind - && LitKind::Bool(false) == lit.node + && path.ident.name == sym!(set_readonly) + && let ExprKind::Lit(lit) = &arg.kind + && LitKind::Bool(false) == lit.node { - span_lint_and_note( - cx, - PERMISSIONS_SET_READONLY_FALSE, - expr.span, - "call to `set_readonly` with argument `false`", - None, - "on Unix platforms this results in the file being world writable", - ); + span_lint_and_then( + cx, + PERMISSIONS_SET_READONLY_FALSE, + expr.span, + "call to `set_readonly` with argument `false`", + |diag| { + diag.note("on Unix platforms this results in the file being world writable"); + diag.help("you can set the desired permissions using `PermissionsExt`. For more information, see\n\ + https://doc.rust-lang.org/std/os/unix/fs/trait.PermissionsExt.html"); + } + ); } } } diff --git a/tests/ui/permissions_set_readonly_false.stderr b/tests/ui/permissions_set_readonly_false.stderr index 106d2f793..e7a8ee6cb 100644 --- a/tests/ui/permissions_set_readonly_false.stderr +++ b/tests/ui/permissions_set_readonly_false.stderr @@ -5,6 +5,8 @@ LL | permissions.set_readonly(false); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: on Unix platforms this results in the file being world writable + = help: you can set the desired permissions using `PermissionsExt`. For more information, see + https://doc.rust-lang.org/std/os/unix/fs/trait.PermissionsExt.html = note: `-D clippy::permissions-set-readonly-false` implied by `-D warnings` error: aborting due to previous error