mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-24 13:43:17 +00:00
return_self_not_must_use document #[must_use]
on the type
Inspired by a discussion in rust-lang/rust-clippy#8197 --- r? `@llogiq` changelog: none The lint is this on nightly, therefore no changelog entry for you xD
This commit is contained in:
parent
c736a63123
commit
262b148d88
2 changed files with 35 additions and 6 deletions
|
@ -1,5 +1,6 @@
|
||||||
|
use clippy_utils::diagnostics::span_lint_and_help;
|
||||||
use clippy_utils::ty::is_must_use_ty;
|
use clippy_utils::ty::is_must_use_ty;
|
||||||
use clippy_utils::{diagnostics::span_lint, nth_arg, return_ty};
|
use clippy_utils::{nth_arg, return_ty};
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
use rustc_hir::intravisit::FnKind;
|
use rustc_hir::intravisit::FnKind;
|
||||||
use rustc_hir::{Body, FnDecl, HirId, TraitItem, TraitItemKind};
|
use rustc_hir::{Body, FnDecl, HirId, TraitItem, TraitItemKind};
|
||||||
|
@ -13,25 +14,46 @@ declare_clippy_lint! {
|
||||||
/// This lint warns when a method returning `Self` doesn't have the `#[must_use]` attribute.
|
/// This lint warns when a method returning `Self` doesn't have the `#[must_use]` attribute.
|
||||||
///
|
///
|
||||||
/// ### Why is this bad?
|
/// ### Why is this bad?
|
||||||
/// It prevents to "forget" to use the newly created value.
|
/// Methods returning `Self` often create new values, having the `#[must_use]` attribute
|
||||||
|
/// prevents users from "forgetting" to use the newly created value.
|
||||||
|
///
|
||||||
|
/// The `#[must_use]` attribute can be added to the type itself to ensure that instances
|
||||||
|
/// are never forgotten. Functions returning a type marked with `#[must_use]` will not be
|
||||||
|
/// linted, as the usage is already enforced by the type attribute.
|
||||||
///
|
///
|
||||||
/// ### Limitations
|
/// ### Limitations
|
||||||
/// This lint is only applied on methods taking a `self` argument. It would be mostly noise
|
/// This lint is only applied on methods taking a `self` argument. It would be mostly noise
|
||||||
/// if it was added on constructors for example.
|
/// if it was added on constructors for example.
|
||||||
///
|
///
|
||||||
/// ### Example
|
/// ### Example
|
||||||
|
/// Missing attribute
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// pub struct Bar;
|
/// pub struct Bar;
|
||||||
///
|
|
||||||
/// impl Bar {
|
/// impl Bar {
|
||||||
/// // Bad
|
/// // Bad
|
||||||
/// pub fn bar(&self) -> Self {
|
/// pub fn bar(&self) -> Self {
|
||||||
/// Self
|
/// Self
|
||||||
/// }
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
///
|
///
|
||||||
/// // Good
|
/// It's better to have the `#[must_use]` attribute on the method like this:
|
||||||
|
/// ```rust
|
||||||
|
/// pub struct Bar;
|
||||||
|
/// impl Bar {
|
||||||
/// #[must_use]
|
/// #[must_use]
|
||||||
/// pub fn foo(&self) -> Self {
|
/// pub fn bar(&self) -> Self {
|
||||||
|
/// Self
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Or on the type definition like this:
|
||||||
|
/// ```rust
|
||||||
|
/// #[must_use]
|
||||||
|
/// pub struct Bar;
|
||||||
|
/// impl Bar {
|
||||||
|
/// pub fn bar(&self) -> Self {
|
||||||
/// Self
|
/// Self
|
||||||
/// }
|
/// }
|
||||||
/// }
|
/// }
|
||||||
|
@ -65,11 +87,13 @@ fn check_method(cx: &LateContext<'tcx>, decl: &'tcx FnDecl<'tcx>, fn_def: LocalD
|
||||||
if !is_must_use_ty(cx, ret_ty);
|
if !is_must_use_ty(cx, ret_ty);
|
||||||
|
|
||||||
then {
|
then {
|
||||||
span_lint(
|
span_lint_and_help(
|
||||||
cx,
|
cx,
|
||||||
RETURN_SELF_NOT_MUST_USE,
|
RETURN_SELF_NOT_MUST_USE,
|
||||||
span,
|
span,
|
||||||
"missing `#[must_use]` attribute on a method returning `Self`",
|
"missing `#[must_use]` attribute on a method returning `Self`",
|
||||||
|
None,
|
||||||
|
"consider adding the `#[must_use]` attribute to the method or directly to the `Self` type"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ LL | fn what(&self) -> Self;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: `-D clippy::return-self-not-must-use` implied by `-D warnings`
|
= note: `-D clippy::return-self-not-must-use` implied by `-D warnings`
|
||||||
|
= help: consider adding the `#[must_use]` attribute to the method or directly to the `Self` type
|
||||||
|
|
||||||
error: missing `#[must_use]` attribute on a method returning `Self`
|
error: missing `#[must_use]` attribute on a method returning `Self`
|
||||||
--> $DIR/return_self_not_must_use.rs:17:5
|
--> $DIR/return_self_not_must_use.rs:17:5
|
||||||
|
@ -13,6 +14,8 @@ LL | / pub fn foo(&self) -> Self {
|
||||||
LL | | Self
|
LL | | Self
|
||||||
LL | | }
|
LL | | }
|
||||||
| |_____^
|
| |_____^
|
||||||
|
|
|
||||||
|
= help: consider adding the `#[must_use]` attribute to the method or directly to the `Self` type
|
||||||
|
|
||||||
error: missing `#[must_use]` attribute on a method returning `Self`
|
error: missing `#[must_use]` attribute on a method returning `Self`
|
||||||
--> $DIR/return_self_not_must_use.rs:20:5
|
--> $DIR/return_self_not_must_use.rs:20:5
|
||||||
|
@ -21,6 +24,8 @@ LL | / pub fn bar(self) -> Self {
|
||||||
LL | | self
|
LL | | self
|
||||||
LL | | }
|
LL | | }
|
||||||
| |_____^
|
| |_____^
|
||||||
|
|
|
||||||
|
= help: consider adding the `#[must_use]` attribute to the method or directly to the `Self` type
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue