diff options
Diffstat (limited to 'src/pin_project/derive.rs')
-rw-r--r-- | src/pin_project/derive.rs | 104 |
1 files changed, 53 insertions, 51 deletions
diff --git a/src/pin_project/derive.rs b/src/pin_project/derive.rs index 47c061f..3e578f7 100644 --- a/src/pin_project/derive.rs +++ b/src/pin_project/derive.rs @@ -38,10 +38,7 @@ pub(super) fn parse_derive(input: TokenStream) -> Result<TokenStream> { parse_enum(&mut cx, data, &mut generate)?; } Data::Union(_) => { - return Err(error!( - input, - "#[pin_project] attribute may only be used on structs or enums" - )); + bail!(input, "#[pin_project] attribute may only be used on structs or enums"); } } @@ -83,14 +80,17 @@ impl GenerateTokens { // but it is now removed. // // Refs: - // * https://github.com/rust-lang/rust/issues/63281 - // * https://github.com/taiki-e/pin-project/pull/53#issuecomment-525906867 - // * https://github.com/taiki-e/pin-project/pull/70 + // - https://github.com/rust-lang/rust/issues/63281 + // - https://github.com/taiki-e/pin-project/pull/53#issuecomment-525906867 + // - https://github.com/taiki-e/pin-project/pull/70 #allowed_lints + #[allow(unused_qualifications)] #[allow(clippy::semicolon_if_nothing_returned)] #[allow(clippy::use_self)] #[allow(clippy::used_underscore_binding)] const _: () = { + #[allow(unused_extern_crates)] + extern crate pin_project as _pin_project; #scoped #unpin_impl #drop_impl @@ -188,7 +188,7 @@ impl<'a> Context<'a> { .filter_map(Option::as_ref) .find(|name| **name == ident) { - return Err(error!(name, "name `{}` is the same as the original type name", name)); + bail!(name, "name `{}` is the same as the original type name", name); } let mut lifetime_name = String::from("'pin"); @@ -293,10 +293,12 @@ struct ProjectedFields { fn validate_struct(ident: &Ident, fields: &Fields) -> Result<()> { if fields.is_empty() { let msg = "#[pin_project] attribute may not be used on structs with zero fields"; - if let Fields::Unit = fields { Err(error!(ident, msg)) } else { Err(error!(fields, msg)) } - } else { - Ok(()) + if let Fields::Unit = fields { + bail!(ident, msg) + } + bail!(fields, msg) } + Ok(()) } fn validate_enum(brace_token: token::Brace, variants: &Variants) -> Result<()> { @@ -308,9 +310,9 @@ fn validate_enum(brace_token: token::Brace, variants: &Variants) -> Result<()> { } let has_field = variants.iter().try_fold(false, |has_field, v| { if let Some((_, e)) = &v.discriminant { - Err(error!(e, "#[pin_project] attribute may not be used on enums with discriminants")) + bail!(e, "#[pin_project] attribute may not be used on enums with discriminants"); } else if let Some(attr) = v.attrs.find(PIN) { - Err(error!(attr, "#[pin] attribute may only be used on fields of structs or variants")) + bail!(attr, "#[pin] attribute may only be used on fields of structs or variants"); } else if v.fields.is_empty() { Ok(has_field) } else { @@ -320,7 +322,7 @@ fn validate_enum(brace_token: token::Brace, variants: &Variants) -> Result<()> { if has_field { Ok(()) } else { - Err(error!(variants, "#[pin_project] attribute may not be used on enums with zero fields")) + bail!(variants, "#[pin_project] attribute may not be used on enums with zero fields"); } } @@ -581,10 +583,10 @@ fn visit_fields<'a>( #vis #ident #colon_token ::pin_project::__private::PhantomData<#ty>, }); proj_body.extend(quote! { - #ident #colon_token ::pin_project::__private::Pin::new_unchecked(#binding), + #ident #colon_token _pin_project::__private::Pin::new_unchecked(#binding), }); proj_move.extend(quote! { - #ident #colon_token ::pin_project::__private::PhantomData, + #ident #colon_token _pin_project::__private::PhantomData, }); cx.pinned_fields.push(ty); @@ -603,7 +605,7 @@ fn visit_fields<'a>( #binding, }); proj_move.extend(quote! { - #ident #colon_token ::pin_project::__private::ptr::read(#binding), + #ident #colon_token _pin_project::__private::ptr::read(#binding), }); } } @@ -658,7 +660,7 @@ fn proj_own_body( // if any of the destructors panic. { #( - let __guard = ::pin_project::__private::UnsafeDropInPlaceGuard(#pinned_fields); + let __guard = _pin_project::__private::UnsafeDropInPlaceGuard::new(#pinned_fields); )* } @@ -670,9 +672,9 @@ fn proj_own_body( /// Creates `Unpin` implementation for the original type. /// /// The kind of `Unpin` impl generated depends on `unpin_impl` field: -/// * `UnpinImpl::Unsafe` - Implements `Unpin` via `UnsafeUnpin` impl. -/// * `UnpinImpl::Negative` - Generates `Unpin` impl with bounds that will never be true. -/// * `UnpinImpl::Default` - Generates `Unpin` impl that requires `Unpin` for all pinned fields. +/// - `UnpinImpl::Unsafe` - Implements `Unpin` via `UnsafeUnpin` impl. +/// - `UnpinImpl::Negative` - Generates `Unpin` impl with bounds that will never be true. +/// - `UnpinImpl::Default` - Generates `Unpin` impl that requires `Unpin` for all pinned fields. fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { match cx.unpin_impl { UnpinImpl::Unsafe(span) => { @@ -682,14 +684,14 @@ fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { // Make the error message highlight `UnsafeUnpin` argument. proj_generics.make_where_clause().predicates.push(parse_quote_spanned! { span => - ::pin_project::__private::Wrapper<#lifetime, Self>: ::pin_project::UnsafeUnpin + _pin_project::__private::Wrapper<#lifetime, Self>: _pin_project::UnsafeUnpin }); let (impl_generics, _, where_clause) = proj_generics.split_for_impl(); let ty_generics = cx.orig.generics.split_for_impl().1; quote_spanned! { span => - impl #impl_generics ::pin_project::__private::Unpin for #orig_ident #ty_generics + impl #impl_generics _pin_project::__private::Unpin for #orig_ident #ty_generics #where_clause { } @@ -701,9 +703,9 @@ fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { let lifetime = &cx.proj.lifetime; proj_generics.make_where_clause().predicates.push(parse_quote! { - ::pin_project::__private::Wrapper< - #lifetime, ::pin_project::__private::PhantomPinned - >: ::pin_project::__private::Unpin + _pin_project::__private::Wrapper< + #lifetime, _pin_project::__private::PhantomPinned + >: _pin_project::__private::Unpin }); let (proj_impl_generics, _, proj_where_clause) = proj_generics.split_for_impl(); @@ -713,7 +715,7 @@ fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { // call-site span. let unsafety = <Token![unsafe]>::default(); quote_spanned! { span => - impl #proj_impl_generics ::pin_project::__private::Unpin + impl #proj_impl_generics _pin_project::__private::Unpin for #orig_ident #ty_generics #proj_where_clause { @@ -726,7 +728,7 @@ fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { // impl, they'll get a "conflicting implementations of trait" error when // coherence checks are run. #[doc(hidden)] - #unsafety impl #proj_impl_generics ::pin_project::UnsafeUnpin + #unsafety impl #proj_impl_generics _pin_project::UnsafeUnpin for #orig_ident #ty_generics #proj_where_clause { @@ -781,7 +783,7 @@ fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { let (_, ty_generics, where_clause) = cx.orig.generics.split_for_impl(); full_where_clause.predicates.push(parse_quote! { - #struct_ident #proj_ty_generics: ::pin_project::__private::Unpin + #struct_ident #proj_ty_generics: _pin_project::__private::Unpin }); quote! { @@ -797,15 +799,15 @@ fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { // this 'public' type by creating this type in the inside of `const`. #[allow(missing_debug_implementations)] #vis struct #struct_ident #proj_generics #where_clause { - __pin_project_use_generics: ::pin_project::__private::AlwaysUnpin< - #lifetime, (#(::pin_project::__private::PhantomData<#type_params>),*) + __pin_project_use_generics: _pin_project::__private::AlwaysUnpin< + #lifetime, (#(_pin_project::__private::PhantomData<#type_params>),*) >, #(#fields,)* #(#lifetime_fields,)* } - impl #proj_impl_generics ::pin_project::__private::Unpin + impl #proj_impl_generics _pin_project::__private::Unpin for #orig_ident #ty_generics #full_where_clause { @@ -818,7 +820,7 @@ fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { // impl, they'll get a "conflicting implementations of trait" error when // coherence checks are run. #[doc(hidden)] - unsafe impl #proj_impl_generics ::pin_project::UnsafeUnpin + unsafe impl #proj_impl_generics _pin_project::UnsafeUnpin for #orig_ident #ty_generics #full_where_clause { @@ -831,8 +833,8 @@ fn make_unpin_impl(cx: &Context<'_>) -> TokenStream { /// Creates `Drop` implementation for the original type. /// /// The kind of `Drop` impl generated depends on `pinned_drop` field: -/// * `Some` - implements `Drop` via `PinnedDrop` impl. -/// * `None` - generates code that ensures that `Drop` trait is not implemented, +/// - `Some` - implements `Drop` via `PinnedDrop` impl. +/// - `None` - generates code that ensures that `Drop` trait is not implemented, /// instead of generating `Drop` impl. fn make_drop_impl(cx: &Context<'_>) -> TokenStream { let ident = cx.orig.ident; @@ -843,18 +845,18 @@ fn make_drop_impl(cx: &Context<'_>) -> TokenStream { // call-site span. let unsafety = <Token![unsafe]>::default(); quote_spanned! { span => - impl #impl_generics ::pin_project::__private::Drop for #ident #ty_generics + impl #impl_generics _pin_project::__private::Drop for #ident #ty_generics #where_clause { fn drop(&mut self) { #unsafety { // Safety - we're in 'drop', so we know that 'self' will // never move again. - let __pinned_self = ::pin_project::__private::Pin::new_unchecked(self); + let __pinned_self = _pin_project::__private::Pin::new_unchecked(self); // We call `pinned_drop` only once. Since `PinnedDrop::drop` // is an unsafe method and a private API, it is never called again in safe // code *unless the user uses a maliciously crafted macro*. - ::pin_project::__private::PinnedDrop::drop(__pinned_self); + _pin_project::__private::PinnedDrop::drop(__pinned_self); } } } @@ -886,7 +888,7 @@ fn make_drop_impl(cx: &Context<'_>) -> TokenStream { // This will result in a compilation error, which is exactly what we want. trait #trait_ident {} #[allow(clippy::drop_bounds, drop_bounds)] - impl<T: ::pin_project::__private::Drop> #trait_ident for T {} + impl<T: _pin_project::__private::Drop> #trait_ident for T {} impl #impl_generics #trait_ident for #ident #ty_generics #where_clause {} // Generate a dummy impl of `PinnedDrop`, to ensure that the user cannot implement it. @@ -900,10 +902,10 @@ fn make_drop_impl(cx: &Context<'_>) -> TokenStream { // they'll get a "conflicting implementations of trait" error when coherence // checks are run. #[doc(hidden)] - impl #impl_generics ::pin_project::__private::PinnedDrop for #ident #ty_generics + impl #impl_generics _pin_project::__private::PinnedDrop for #ident #ty_generics #where_clause { - unsafe fn drop(self: ::pin_project::__private::Pin<&mut Self>) {} + unsafe fn drop(self: _pin_project::__private::Pin<&mut Self>) {} } } } @@ -934,7 +936,7 @@ fn make_proj_impl( let mut project = Some(quote! { #vis fn project<#lifetime>( - self: ::pin_project::__private::Pin<&#lifetime mut Self>, + self: _pin_project::__private::Pin<&#lifetime mut Self>, ) -> #proj_ident #proj_ty_generics { unsafe { #proj_body @@ -944,7 +946,7 @@ fn make_proj_impl( let mut project_ref = Some(quote! { #[allow(clippy::missing_const_for_fn)] #vis fn project_ref<#lifetime>( - self: ::pin_project::__private::Pin<&#lifetime Self>, + self: _pin_project::__private::Pin<&#lifetime Self>, ) -> #proj_ref_ident #proj_ty_generics { unsafe { #proj_ref_body @@ -955,7 +957,7 @@ fn make_proj_impl( // 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>, + self: _pin_project::__private::Pin<&mut Self>, __replacement: Self, ) -> #proj_own_ident #orig_ty_generics }; @@ -966,10 +968,10 @@ fn make_proj_impl( // Destructors will run in reverse order, so next create a guard to overwrite // `self` with the replacement value without calling destructors. - let __guard = ::pin_project::__private::UnsafeOverwriteGuard { - target: __self_ptr, - value: ::pin_project::__private::ManuallyDrop::new(__replacement), - }; + let __guard = _pin_project::__private::UnsafeOverwriteGuard::new( + __self_ptr, + __replacement, + ); #proj_own_body } @@ -1001,8 +1003,8 @@ fn make_proj_impl( /// Checks that the `[repr(packed)]` attribute is not included. /// /// This currently does two checks: -/// * Checks the attributes of structs to ensure there is no `[repr(packed)]`. -/// * Generates a function that borrows fields without an unsafe block and +/// - Checks the attributes of structs to ensure there is no `[repr(packed)]`. +/// - Generates a function that borrows fields without an unsafe block and /// forbidding `unaligned_references` lint. fn ensure_not_packed(orig: &OriginalType<'_>, fields: Option<&Fields>) -> Result<TokenStream> { for meta in orig.attrs.iter().filter_map(|attr| attr.parse_meta().ok()) { @@ -1028,7 +1030,7 @@ fn ensure_not_packed(orig: &OriginalType<'_>, fields: Option<&Fields>) -> Result } else { "#[pin_project] attribute may not be used on #[repr(packed)] types" }; - return Err(error!(repr, msg)); + bail!(repr, msg); } } NestedMeta::Lit(..) => {} |