Skip to content

Commit

Permalink
Suppress more lints Suppress more lints in generated code
Browse files Browse the repository at this point in the history
  • Loading branch information
taiki-e committed Sep 21, 2020
1 parent e75b983 commit a958bae
Show file tree
Hide file tree
Showing 36 changed files with 472 additions and 200 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ This project adheres to [Semantic Versioning](https://semver.org).

* [Optimize code generation when used on enums.](https://github.com/taiki-e/pin-project/pull/270)

* [Suppress `explicit_outlives_requirements` lint in generated code.](https://github.com/taiki-e/pin-project/pull/276)
* Suppress `explicit_outlives_requirements`, `box_pointers`, `clippy::large_enum_variant`, `clippy::pattern_type_mismatch`, and `clippy::implicit_return` lints in generated code.([#276](https://github.com/taiki-e/pin-project/pull/276), [#277](https://github.com/taiki-e/pin-project/pull/277))

* Diagnostic improvements.

Expand Down
75 changes: 45 additions & 30 deletions pin-project-internal/src/pin_project/derive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ impl GenerateTokens {
} else {
format_ident!("__SCOPE_{}", cx.orig.ident)
};
let allowed_lints = global_allowed_lints();

tokens.extend(quote! {
// All items except projected types are generated inside a `const` scope.
Expand All @@ -129,9 +130,8 @@ impl GenerateTokens {
// * https://github.com/taiki-e/pin-project/pull/70
#[doc(hidden)] // for Rust 1.34 - 1.41
#[allow(non_upper_case_globals)] // for Rust 1.34 - 1.36
#[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
#[allow(clippy::used_underscore_binding)]
#allowed_lints
const #dummy_const: () = {
#scoped
#unpin_impl
Expand All @@ -143,6 +143,41 @@ impl GenerateTokens {
}
}

/// Returns attributes that should be applied to all generated code.
fn global_allowed_lints() -> TokenStream {
quote! {
#[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
#[allow(box_pointers)] // This lint warns use of the `Box` type.
#[allow(clippy::pattern_type_mismatch)]
}
}

/// Returns attributes used on projected types.
fn proj_allowed_lints(is_enum: bool) -> (TokenStream, TokenStream, TokenStream) {
let large_enum_variant =
if is_enum { Some(quote!(#[allow(clippy::large_enum_variant)])) } else { None };
let global_allowed_lints = global_allowed_lints();
let proj_mut = quote! {
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(clippy::mut_mut)] // This lint warns `&mut &mut <ty>`.
#[allow(clippy::type_repetition_in_bounds)] // https://github.com/rust-lang/rust-clippy/issues/4326}
#global_allowed_lints
};
let proj_ref = quote! {
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(clippy::type_repetition_in_bounds)] // https://github.com/rust-lang/rust-clippy/issues/4326
#global_allowed_lints
};
let proj_own = quote! {
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(unreachable_pub)] // This lint warns `pub` field in private struct.
#large_enum_variant
#global_allowed_lints
};
(proj_mut, proj_ref, proj_own)
}

struct Args {
/// `PinnedDrop` argument.
pinned_drop: Option<Span>,
Expand Down Expand Up @@ -564,7 +599,7 @@ impl<'a> Context<'a> {
Fields::Unit => unreachable!(),
};

let (proj_attrs, proj_ref_attrs, proj_own_attrs) = self.proj_attrs();
let (proj_attrs, proj_ref_attrs, proj_own_attrs) = proj_allowed_lints(false);
generate.extend(self.project, quote! {
#proj_attrs
#vis struct #proj_ident #proj_generics #where_clause_fields
Expand Down Expand Up @@ -633,7 +668,7 @@ impl<'a> Context<'a> {
let proj_generics = &self.proj.generics;
let proj_where_clause = &self.proj.where_clause;

let (proj_attrs, proj_ref_attrs, proj_own_attrs) = self.proj_attrs();
let (proj_attrs, proj_ref_attrs, proj_own_attrs) = proj_allowed_lints(true);
if self.project {
generate.extend(true, quote! {
#proj_attrs
Expand Down Expand Up @@ -829,30 +864,6 @@ impl<'a> Context<'a> {
})
}

/// Returns attributes used on projected types.
fn proj_attrs(&self) -> (TokenStream, TokenStream, TokenStream) {
let proj_mut = quote! {
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
#[allow(clippy::mut_mut)] // This lint warns `&mut &mut <ty>`.
#[allow(clippy::type_repetition_in_bounds)] // https://github.com/rust-lang/rust-clippy/issues/4326}
};
let proj_ref = quote! {
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
#[allow(clippy::type_repetition_in_bounds)] // https://github.com/rust-lang/rust-clippy/issues/4326
};
let proj_own = quote! {
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
#[allow(unreachable_pub)] // This lint warns `pub` field in private struct.
};
(proj_mut, proj_ref, proj_own)
}

/// Generates the processing that `project_replace` does for the struct or each variant.
fn proj_own_body(
&self,
Expand Down Expand Up @@ -1181,11 +1192,15 @@ impl<'a> Context<'a> {
// For interoperability with `forbid(unsafe_code)`, `unsafe` token should be
// call-site span.
let unsafety = <Token![unsafe]>::default();
quote_spanned! { span =>
// It is enough to only set the span of the signature.
let sig = quote_spanned! { span =>
#vis fn project_replace(
self: ::pin_project::__private::Pin<&mut Self>,
__replacement: Self,
) -> #proj_own_ident #orig_ty_generics {
) -> #proj_own_ident #orig_ty_generics
};
quote! {
#sig {
#unsafety {
#proj_own_body
}
Expand Down
14 changes: 10 additions & 4 deletions tests/expand/tests/expand/default-enum.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ enum Enum<T, U> {
Unit,
}
#[allow(dead_code)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
enum EnumProj<'pin, T, U>
where
Enum<T, U>: 'pin,
Expand All @@ -26,9 +28,11 @@ where
Unit,
}
#[allow(dead_code)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
enum EnumProjRef<'pin, T, U>
where
Enum<T, U>: 'pin,
Expand All @@ -42,9 +46,11 @@ where
}
#[doc(hidden)]
#[allow(non_upper_case_globals)]
#[allow(clippy::used_underscore_binding)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::used_underscore_binding)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
const _: () = {
impl<T, U> Enum<T, U> {
fn project<'pin>(
Expand Down
14 changes: 10 additions & 4 deletions tests/expand/tests/expand/default-struct.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,19 @@ struct Struct<T, U> {
}
#[doc(hidden)]
#[allow(non_upper_case_globals)]
#[allow(clippy::used_underscore_binding)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::used_underscore_binding)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
const _: () = {
#[allow(dead_code)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
struct __StructProjection<'pin, T, U>
where
Struct<T, U>: 'pin,
Expand All @@ -24,9 +28,11 @@ const _: () = {
unpinned: &'pin mut (U),
}
#[allow(dead_code)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
struct __StructProjectionRef<'pin, T, U>
where
Struct<T, U>: 'pin,
Expand Down
14 changes: 10 additions & 4 deletions tests/expand/tests/expand/default-tuple_struct.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,31 @@ use pin_project::pin_project;
struct TupleStruct<T, U>(#[pin] T, U);
#[doc(hidden)]
#[allow(non_upper_case_globals)]
#[allow(clippy::used_underscore_binding)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::used_underscore_binding)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
const _: () = {
#[allow(dead_code)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
struct __TupleStructProjection<'pin, T, U>(
::pin_project::__private::Pin<&'pin mut (T)>,
&'pin mut (U),
)
where
TupleStruct<T, U>: 'pin;
#[allow(dead_code)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
struct __TupleStructProjectionRef<'pin, T, U>(
::pin_project::__private::Pin<&'pin (T)>,
&'pin (U),
Expand Down
19 changes: 14 additions & 5 deletions tests/expand/tests/expand/naming-enum-all.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ enum Enum<T, U> {
Unit,
}
#[allow(dead_code)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
enum Proj<'pin, T, U>
where
Enum<T, U>: 'pin,
Expand All @@ -26,9 +28,11 @@ where
Unit,
}
#[allow(dead_code)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
enum ProjRef<'pin, T, U>
where
Enum<T, U>: 'pin,
Expand All @@ -41,9 +45,12 @@ where
Unit,
}
#[allow(dead_code)]
#[allow(unreachable_pub)]
#[allow(clippy::large_enum_variant)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(unreachable_pub)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
enum ProjOwn<T, U> {
Struct {
pinned: ::pin_project::__private::PhantomData<T>,
Expand All @@ -54,9 +61,11 @@ enum ProjOwn<T, U> {
}
#[doc(hidden)]
#[allow(non_upper_case_globals)]
#[allow(clippy::used_underscore_binding)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::used_underscore_binding)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
const _: () = {
impl<T, U> Enum<T, U> {
fn project<'pin>(self: ::pin_project::__private::Pin<&'pin mut Self>) -> Proj<'pin, T, U> {
Expand Down
10 changes: 7 additions & 3 deletions tests/expand/tests/expand/naming-enum-mut.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ enum Enum<T, U> {
Unit,
}
#[allow(dead_code)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::mut_mut)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
enum Proj<'pin, T, U>
where
Enum<T, U>: 'pin,
Expand All @@ -27,9 +29,11 @@ where
}
#[doc(hidden)]
#[allow(non_upper_case_globals)]
#[allow(clippy::used_underscore_binding)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::used_underscore_binding)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
const _: () = {
impl<T, U> Enum<T, U> {
fn project<'pin>(self: ::pin_project::__private::Pin<&'pin mut Self>) -> Proj<'pin, T, U> {
Expand Down
4 changes: 3 additions & 1 deletion tests/expand/tests/expand/naming-enum-none.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ enum Enum<T, U> {
}
#[doc(hidden)]
#[allow(non_upper_case_globals)]
#[allow(clippy::used_underscore_binding)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::used_underscore_binding)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
const _: () = {
impl<T, U> Enum<T, U> {}
struct __Enum<'pin, T, U> {
Expand Down
9 changes: 7 additions & 2 deletions tests/expand/tests/expand/naming-enum-own.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ enum Enum<T, U> {
Unit,
}
#[allow(dead_code)]
#[allow(unreachable_pub)]
#[allow(clippy::large_enum_variant)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(unreachable_pub)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
enum ProjOwn<T, U> {
Struct {
pinned: ::pin_project::__private::PhantomData<T>,
Expand All @@ -23,9 +26,11 @@ enum ProjOwn<T, U> {
}
#[doc(hidden)]
#[allow(non_upper_case_globals)]
#[allow(clippy::used_underscore_binding)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::used_underscore_binding)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
const _: () = {
impl<T, U> Enum<T, U> {
fn project_replace(
Expand Down
8 changes: 6 additions & 2 deletions tests/expand/tests/expand/naming-enum-ref.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ enum Enum<T, U> {
Unit,
}
#[allow(dead_code)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::type_repetition_in_bounds)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
enum ProjRef<'pin, T, U>
where
Enum<T, U>: 'pin,
Expand All @@ -26,9 +28,11 @@ where
}
#[doc(hidden)]
#[allow(non_upper_case_globals)]
#[allow(clippy::used_underscore_binding)]
#[allow(explicit_outlives_requirements)]
#[allow(single_use_lifetimes)]
#[allow(clippy::used_underscore_binding)]
#[allow(box_pointers)]
#[allow(clippy::pattern_type_mismatch)]
const _: () = {
impl<T, U> Enum<T, U> {
fn project_ref<'pin>(
Expand Down
Loading

0 comments on commit a958bae

Please sign in to comment.