Use break api config for wrong_pub_self_convention

This commit is contained in:
Cameron Steffen 2021-05-26 16:39:39 -05:00
parent 2e2021bbda
commit d7f47f280e
10 changed files with 55 additions and 80 deletions

View File

@ -141,3 +141,12 @@ declare_deprecated_lint! {
pub FILTER_MAP, pub FILTER_MAP,
"this lint has been replaced by `manual_filter_map`, a more specific lint" "this lint has been replaced by `manual_filter_map`, a more specific lint"
} }
declare_deprecated_lint! {
/// **What it does:** Nothing. This lint has been deprecated.
///
/// **Deprecation reason:** The `avoid_breaking_exported_api` config option was added, which
/// enables the `wrong_self_conversion` lint for public items.
pub WRONG_PUB_SELF_CONVENTION,
"set the `avoid_breaking_exported_api` config option to `false` to enable the `wrong_self_convention` lint for public items"
}

View File

@ -505,6 +505,10 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
"clippy::filter_map", "clippy::filter_map",
"this lint has been replaced by `manual_filter_map`, a more specific lint", "this lint has been replaced by `manual_filter_map`, a more specific lint",
); );
store.register_removed(
"clippy::wrong_pub_self_convention",
"set the `avoid_breaking_exported_api` config option to `false` to enable the `wrong_self_convention` lint for public items",
);
// end deprecated lints, do not remove this comment, its used in `update_lints` // end deprecated lints, do not remove this comment, its used in `update_lints`
// begin register lints, do not remove this comment, its used in `update_lints` // begin register lints, do not remove this comment, its used in `update_lints`
@ -802,7 +806,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
methods::UNNECESSARY_LAZY_EVALUATIONS, methods::UNNECESSARY_LAZY_EVALUATIONS,
methods::UNWRAP_USED, methods::UNWRAP_USED,
methods::USELESS_ASREF, methods::USELESS_ASREF,
methods::WRONG_PUB_SELF_CONVENTION,
methods::WRONG_SELF_CONVENTION, methods::WRONG_SELF_CONVENTION,
methods::ZST_OFFSET, methods::ZST_OFFSET,
minmax::MIN_MAX, minmax::MIN_MAX,
@ -1026,7 +1029,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
LintId::of(methods::FILETYPE_IS_FILE), LintId::of(methods::FILETYPE_IS_FILE),
LintId::of(methods::GET_UNWRAP), LintId::of(methods::GET_UNWRAP),
LintId::of(methods::UNWRAP_USED), LintId::of(methods::UNWRAP_USED),
LintId::of(methods::WRONG_PUB_SELF_CONVENTION),
LintId::of(misc::FLOAT_CMP_CONST), LintId::of(misc::FLOAT_CMP_CONST),
LintId::of(misc_early::UNNEEDED_FIELD_PATTERN), LintId::of(misc_early::UNNEEDED_FIELD_PATTERN),
LintId::of(missing_doc::MISSING_DOCS_IN_PRIVATE_ITEMS), LintId::of(missing_doc::MISSING_DOCS_IN_PRIVATE_ITEMS),
@ -1862,7 +1864,8 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
}) })
}); });
store.register_late_pass(move || box methods::Methods::new(msrv)); let avoid_breaking_exported_api = conf.avoid_breaking_exported_api;
store.register_late_pass(move || box methods::Methods::new(avoid_breaking_exported_api, msrv));
store.register_late_pass(move || box matches::Matches::new(msrv)); store.register_late_pass(move || box matches::Matches::new(msrv));
store.register_early_pass(move || box manual_non_exhaustive::ManualNonExhaustive::new(msrv)); store.register_early_pass(move || box manual_non_exhaustive::ManualNonExhaustive::new(msrv));
store.register_late_pass(move || box manual_strip::ManualStrip::new(msrv)); store.register_late_pass(move || box manual_strip::ManualStrip::new(msrv));

View File

@ -282,30 +282,6 @@ declare_clippy_lint! {
"defining a method named with an established prefix (like \"into_\") that takes `self` with the wrong convention" "defining a method named with an established prefix (like \"into_\") that takes `self` with the wrong convention"
} }
declare_clippy_lint! {
/// **What it does:** This is the same as
/// [`wrong_self_convention`](#wrong_self_convention), but for public items.
///
/// **Why is this bad?** See [`wrong_self_convention`](#wrong_self_convention).
///
/// **Known problems:** Actually *renaming* the function may break clients if
/// the function is part of the public interface. In that case, be mindful of
/// the stability guarantees you've given your users.
///
/// **Example:**
/// ```rust
/// # struct X;
/// impl<'a> X {
/// pub fn as_str(self) -> &'a str {
/// "foo"
/// }
/// }
/// ```
pub WRONG_PUB_SELF_CONVENTION,
restriction,
"defining a public method named with an established prefix (like \"into_\") that takes `self` with the wrong convention"
}
declare_clippy_lint! { declare_clippy_lint! {
/// **What it does:** Checks for usage of `ok().expect(..)`. /// **What it does:** Checks for usage of `ok().expect(..)`.
/// ///
@ -1658,13 +1634,17 @@ declare_clippy_lint! {
} }
pub struct Methods { pub struct Methods {
avoid_breaking_exported_api: bool,
msrv: Option<RustcVersion>, msrv: Option<RustcVersion>,
} }
impl Methods { impl Methods {
#[must_use] #[must_use]
pub fn new(msrv: Option<RustcVersion>) -> Self { pub fn new(avoid_breaking_exported_api: bool, msrv: Option<RustcVersion>) -> Self {
Self { msrv } Self {
avoid_breaking_exported_api,
msrv,
}
} }
} }
@ -1673,7 +1653,6 @@ impl_lint_pass!(Methods => [
EXPECT_USED, EXPECT_USED,
SHOULD_IMPLEMENT_TRAIT, SHOULD_IMPLEMENT_TRAIT,
WRONG_SELF_CONVENTION, WRONG_SELF_CONVENTION,
WRONG_PUB_SELF_CONVENTION,
OK_EXPECT, OK_EXPECT,
MAP_UNWRAP_OR, MAP_UNWRAP_OR,
RESULT_MAP_OR_INTO_OPTION, RESULT_MAP_OR_INTO_OPTION,
@ -1838,11 +1817,13 @@ impl<'tcx> LateLintPass<'tcx> for Methods {
} }
} }
if sig.decl.implicit_self.has_implicit_self() { if sig.decl.implicit_self.has_implicit_self()
&& !(self.avoid_breaking_exported_api
&& cx.access_levels.is_exported(impl_item.hir_id()))
{
wrong_self_convention::check( wrong_self_convention::check(
cx, cx,
&name, &name,
item.vis.node.is_pub(),
self_ty, self_ty,
first_arg_ty, first_arg_ty,
first_arg.pat.span, first_arg.pat.span,
@ -1915,7 +1896,6 @@ impl<'tcx> LateLintPass<'tcx> for Methods {
wrong_self_convention::check( wrong_self_convention::check(
cx, cx,
&item.ident.name.as_str(), &item.ident.name.as_str(),
false,
self_ty, self_ty,
first_arg_ty, first_arg_ty,
first_arg_span, first_arg_span,

View File

@ -6,7 +6,6 @@ use rustc_middle::ty::TyS;
use rustc_span::source_map::Span; use rustc_span::source_map::Span;
use std::fmt; use std::fmt;
use super::WRONG_PUB_SELF_CONVENTION;
use super::WRONG_SELF_CONVENTION; use super::WRONG_SELF_CONVENTION;
#[rustfmt::skip] #[rustfmt::skip]
@ -21,9 +20,9 @@ const CONVENTIONS: [(&[Convention], &[SelfKind]); 9] = [
// Conversion using `to_` can use borrowed (non-Copy types) or owned (Copy types). // Conversion using `to_` can use borrowed (non-Copy types) or owned (Copy types).
// Source: https://rust-lang.github.io/api-guidelines/naming.html#ad-hoc-conversions-follow-as_-to_-into_-conventions-c-conv // Source: https://rust-lang.github.io/api-guidelines/naming.html#ad-hoc-conversions-follow-as_-to_-into_-conventions-c-conv
(&[Convention::StartsWith("to_"), Convention::NotEndsWith("_mut"), Convention::IsSelfTypeCopy(false), (&[Convention::StartsWith("to_"), Convention::NotEndsWith("_mut"), Convention::IsSelfTypeCopy(false),
Convention::IsTraitItem(false), Convention::ImplementsTrait(false)], &[SelfKind::Ref]), Convention::IsTraitItem(false), Convention::ImplementsTrait(false)], &[SelfKind::Ref]),
(&[Convention::StartsWith("to_"), Convention::NotEndsWith("_mut"), Convention::IsSelfTypeCopy(true), (&[Convention::StartsWith("to_"), Convention::NotEndsWith("_mut"), Convention::IsSelfTypeCopy(true),
Convention::IsTraitItem(false), Convention::ImplementsTrait(false)], &[SelfKind::Value]), Convention::IsTraitItem(false), Convention::ImplementsTrait(false)], &[SelfKind::Value]),
]; ];
@ -85,18 +84,12 @@ impl fmt::Display for Convention {
pub(super) fn check<'tcx>( pub(super) fn check<'tcx>(
cx: &LateContext<'tcx>, cx: &LateContext<'tcx>,
item_name: &str, item_name: &str,
is_pub: bool,
self_ty: &'tcx TyS<'tcx>, self_ty: &'tcx TyS<'tcx>,
first_arg_ty: &'tcx TyS<'tcx>, first_arg_ty: &'tcx TyS<'tcx>,
first_arg_span: Span, first_arg_span: Span,
implements_trait: bool, implements_trait: bool,
is_trait_item: bool, is_trait_item: bool,
) { ) {
let lint = if is_pub {
WRONG_PUB_SELF_CONVENTION
} else {
WRONG_SELF_CONVENTION
};
if let Some((conventions, self_kinds)) = &CONVENTIONS.iter().find(|(convs, _)| { if let Some((conventions, self_kinds)) = &CONVENTIONS.iter().find(|(convs, _)| {
convs convs
.iter() .iter()
@ -142,7 +135,7 @@ pub(super) fn check<'tcx>(
span_lint_and_help( span_lint_and_help(
cx, cx,
lint, WRONG_SELF_CONVENTION,
first_arg_span, first_arg_span,
&format!( &format!(
"{} usually take {}", "{} usually take {}",

View File

@ -20,7 +20,7 @@ fn start(_argc: isize, _argv: *const *const u8) -> isize {
0 0
} }
pub struct A; struct A;
impl A { impl A {
pub fn as_ref(self) -> &'static str { pub fn as_ref(self) -> &'static str {

View File

@ -15,12 +15,4 @@ mod foo {
pub struct Foobar; pub struct Foobar;
} }
#[cfg(test)]
mod test {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}
fn main() {} fn main() {}

View File

@ -1,6 +1,5 @@
// edition:2018 // edition:2018
#![warn(clippy::wrong_self_convention)] #![warn(clippy::wrong_self_convention)]
#![warn(clippy::wrong_pub_self_convention)]
#![allow(dead_code)] #![allow(dead_code)]
fn main() {} fn main() {}

View File

@ -1,5 +1,5 @@
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention.rs:18:17 --> $DIR/wrong_self_convention.rs:17:17
| |
LL | fn from_i32(self) {} LL | fn from_i32(self) {}
| ^^^^ | ^^^^
@ -8,7 +8,7 @@ LL | fn from_i32(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention.rs:24:21 --> $DIR/wrong_self_convention.rs:23:21
| |
LL | pub fn from_i64(self) {} LL | pub fn from_i64(self) {}
| ^^^^ | ^^^^
@ -16,7 +16,7 @@ LL | pub fn from_i64(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `as_*` usually take `self` by reference or `self` by mutable reference error: methods called `as_*` usually take `self` by reference or `self` by mutable reference
--> $DIR/wrong_self_convention.rs:36:15 --> $DIR/wrong_self_convention.rs:35:15
| |
LL | fn as_i32(self) {} LL | fn as_i32(self) {}
| ^^^^ | ^^^^
@ -24,7 +24,7 @@ LL | fn as_i32(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `into_*` usually take `self` by value error: methods called `into_*` usually take `self` by value
--> $DIR/wrong_self_convention.rs:38:17 --> $DIR/wrong_self_convention.rs:37:17
| |
LL | fn into_i32(&self) {} LL | fn into_i32(&self) {}
| ^^^^^ | ^^^^^
@ -32,7 +32,7 @@ LL | fn into_i32(&self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `is_*` usually take `self` by reference or no `self` error: methods called `is_*` usually take `self` by reference or no `self`
--> $DIR/wrong_self_convention.rs:40:15 --> $DIR/wrong_self_convention.rs:39:15
| |
LL | fn is_i32(self) {} LL | fn is_i32(self) {}
| ^^^^ | ^^^^
@ -40,7 +40,7 @@ LL | fn is_i32(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods with the following characteristics: (`to_*` and `self` type is not `Copy`) usually take `self` by reference error: methods with the following characteristics: (`to_*` and `self` type is not `Copy`) usually take `self` by reference
--> $DIR/wrong_self_convention.rs:42:15 --> $DIR/wrong_self_convention.rs:41:15
| |
LL | fn to_i32(self) {} LL | fn to_i32(self) {}
| ^^^^ | ^^^^
@ -48,7 +48,7 @@ LL | fn to_i32(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention.rs:44:17 --> $DIR/wrong_self_convention.rs:43:17
| |
LL | fn from_i32(self) {} LL | fn from_i32(self) {}
| ^^^^ | ^^^^
@ -56,7 +56,7 @@ LL | fn from_i32(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `as_*` usually take `self` by reference or `self` by mutable reference error: methods called `as_*` usually take `self` by reference or `self` by mutable reference
--> $DIR/wrong_self_convention.rs:46:19 --> $DIR/wrong_self_convention.rs:45:19
| |
LL | pub fn as_i64(self) {} LL | pub fn as_i64(self) {}
| ^^^^ | ^^^^
@ -64,7 +64,7 @@ LL | pub fn as_i64(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `into_*` usually take `self` by value error: methods called `into_*` usually take `self` by value
--> $DIR/wrong_self_convention.rs:47:21 --> $DIR/wrong_self_convention.rs:46:21
| |
LL | pub fn into_i64(&self) {} LL | pub fn into_i64(&self) {}
| ^^^^^ | ^^^^^
@ -72,7 +72,7 @@ LL | pub fn into_i64(&self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `is_*` usually take `self` by reference or no `self` error: methods called `is_*` usually take `self` by reference or no `self`
--> $DIR/wrong_self_convention.rs:48:19 --> $DIR/wrong_self_convention.rs:47:19
| |
LL | pub fn is_i64(self) {} LL | pub fn is_i64(self) {}
| ^^^^ | ^^^^
@ -80,7 +80,7 @@ LL | pub fn is_i64(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods with the following characteristics: (`to_*` and `self` type is not `Copy`) usually take `self` by reference error: methods with the following characteristics: (`to_*` and `self` type is not `Copy`) usually take `self` by reference
--> $DIR/wrong_self_convention.rs:49:19 --> $DIR/wrong_self_convention.rs:48:19
| |
LL | pub fn to_i64(self) {} LL | pub fn to_i64(self) {}
| ^^^^ | ^^^^
@ -88,7 +88,7 @@ LL | pub fn to_i64(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention.rs:50:21 --> $DIR/wrong_self_convention.rs:49:21
| |
LL | pub fn from_i64(self) {} LL | pub fn from_i64(self) {}
| ^^^^ | ^^^^
@ -96,7 +96,7 @@ LL | pub fn from_i64(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `as_*` usually take `self` by reference or `self` by mutable reference error: methods called `as_*` usually take `self` by reference or `self` by mutable reference
--> $DIR/wrong_self_convention.rs:95:19 --> $DIR/wrong_self_convention.rs:94:19
| |
LL | fn as_i32(self) {} LL | fn as_i32(self) {}
| ^^^^ | ^^^^
@ -104,7 +104,7 @@ LL | fn as_i32(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `into_*` usually take `self` by value error: methods called `into_*` usually take `self` by value
--> $DIR/wrong_self_convention.rs:98:25 --> $DIR/wrong_self_convention.rs:97:25
| |
LL | fn into_i32_ref(&self) {} LL | fn into_i32_ref(&self) {}
| ^^^^^ | ^^^^^
@ -112,7 +112,7 @@ LL | fn into_i32_ref(&self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `is_*` usually take `self` by reference or no `self` error: methods called `is_*` usually take `self` by reference or no `self`
--> $DIR/wrong_self_convention.rs:100:19 --> $DIR/wrong_self_convention.rs:99:19
| |
LL | fn is_i32(self) {} LL | fn is_i32(self) {}
| ^^^^ | ^^^^
@ -120,7 +120,7 @@ LL | fn is_i32(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention.rs:104:21 --> $DIR/wrong_self_convention.rs:103:21
| |
LL | fn from_i32(self) {} LL | fn from_i32(self) {}
| ^^^^ | ^^^^
@ -128,7 +128,7 @@ LL | fn from_i32(self) {}
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `as_*` usually take `self` by reference or `self` by mutable reference error: methods called `as_*` usually take `self` by reference or `self` by mutable reference
--> $DIR/wrong_self_convention.rs:119:19 --> $DIR/wrong_self_convention.rs:118:19
| |
LL | fn as_i32(self); LL | fn as_i32(self);
| ^^^^ | ^^^^
@ -136,7 +136,7 @@ LL | fn as_i32(self);
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `into_*` usually take `self` by value error: methods called `into_*` usually take `self` by value
--> $DIR/wrong_self_convention.rs:122:25 --> $DIR/wrong_self_convention.rs:121:25
| |
LL | fn into_i32_ref(&self); LL | fn into_i32_ref(&self);
| ^^^^^ | ^^^^^
@ -144,7 +144,7 @@ LL | fn into_i32_ref(&self);
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `is_*` usually take `self` by reference or no `self` error: methods called `is_*` usually take `self` by reference or no `self`
--> $DIR/wrong_self_convention.rs:124:19 --> $DIR/wrong_self_convention.rs:123:19
| |
LL | fn is_i32(self); LL | fn is_i32(self);
| ^^^^ | ^^^^
@ -152,7 +152,7 @@ LL | fn is_i32(self);
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention.rs:128:21 --> $DIR/wrong_self_convention.rs:127:21
| |
LL | fn from_i32(self); LL | fn from_i32(self);
| ^^^^ | ^^^^
@ -160,7 +160,7 @@ LL | fn from_i32(self);
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `into_*` usually take `self` by value error: methods called `into_*` usually take `self` by value
--> $DIR/wrong_self_convention.rs:146:25 --> $DIR/wrong_self_convention.rs:145:25
| |
LL | fn into_i32_ref(&self); LL | fn into_i32_ref(&self);
| ^^^^^ | ^^^^^
@ -168,7 +168,7 @@ LL | fn into_i32_ref(&self);
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention.rs:152:21 --> $DIR/wrong_self_convention.rs:151:21
| |
LL | fn from_i32(self); LL | fn from_i32(self);
| ^^^^ | ^^^^
@ -176,7 +176,7 @@ LL | fn from_i32(self);
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods with the following characteristics: (`to_*` and `self` type is `Copy`) usually take `self` by value error: methods with the following characteristics: (`to_*` and `self` type is `Copy`) usually take `self` by value
--> $DIR/wrong_self_convention.rs:176:22 --> $DIR/wrong_self_convention.rs:175:22
| |
LL | fn to_u64_v2(&self) -> u64 { LL | fn to_u64_v2(&self) -> u64 {
| ^^^^^ | ^^^^^
@ -184,7 +184,7 @@ LL | fn to_u64_v2(&self) -> u64 {
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods with the following characteristics: (`to_*` and `self` type is not `Copy`) usually take `self` by reference error: methods with the following characteristics: (`to_*` and `self` type is not `Copy`) usually take `self` by reference
--> $DIR/wrong_self_convention.rs:185:19 --> $DIR/wrong_self_convention.rs:184:19
| |
LL | fn to_u64(self) -> u64 { LL | fn to_u64(self) -> u64 {
| ^^^^ | ^^^^

View File

@ -1,6 +1,5 @@
// edition:2018 // edition:2018
#![warn(clippy::wrong_self_convention)] #![warn(clippy::wrong_self_convention)]
#![warn(clippy::wrong_pub_self_convention)]
#![allow(dead_code)] #![allow(dead_code)]
fn main() {} fn main() {}

View File

@ -1,5 +1,5 @@
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention2.rs:56:29 --> $DIR/wrong_self_convention2.rs:55:29
| |
LL | pub fn from_be_self(self) -> Self { LL | pub fn from_be_self(self) -> Self {
| ^^^^ | ^^^^
@ -8,7 +8,7 @@ LL | pub fn from_be_self(self) -> Self {
= help: consider choosing a less ambiguous name = help: consider choosing a less ambiguous name
error: methods called `from_*` usually take no `self` error: methods called `from_*` usually take no `self`
--> $DIR/wrong_self_convention2.rs:65:25 --> $DIR/wrong_self_convention2.rs:64:25
| |
LL | fn from_be_self(self) -> Self; LL | fn from_be_self(self) -> Self;
| ^^^^ | ^^^^