Skip to content

Commit

Permalink
Update derive_utils to 0.12
Browse files Browse the repository at this point in the history
  • Loading branch information
taiki-e committed Dec 10, 2022
1 parent cf9d9fa commit 4781dfe
Show file tree
Hide file tree
Showing 21 changed files with 857 additions and 284 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ trusted_len = []

# Note: futures, tokio, serde, and rayon are public dependencies.
[dependencies]
derive_utils = { version = "0.11" }
derive_utils = { version = "0.12" }
proc-macro2 = "1"
quote = "1"
syn = { version = "1.0.56", features = ["full", "visit-mut"] }
Expand Down
33 changes: 26 additions & 7 deletions src/derive/core/future.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,36 @@
use quote::ToTokens;

use crate::derive::*;

pub(crate) const NAME: &[&str] = &["Future"];

pub(crate) fn derive(cx: &Context, data: &Data) -> Result<TokenStream> {
cx.needs_pin_projection();
Ok(derive_trait(data, parse_quote!(::core::future::Future), None, parse_quote! {

let ident = &data.ident;
let pin = quote!(::core::pin::Pin);
let trait_: syn::Path = parse_quote!(::core::future::Future);
let mut impl_ = EnumImpl::from_trait(data, trait_.clone(), None, parse_quote! {
trait Future {
type Output;
#[inline]
fn poll(
self: ::core::pin::Pin<&mut Self>,
cx: &mut ::core::task::Context<'_>,
) -> ::core::task::Poll<Self::Output>;
}
}))
})
.build_impl();

let poll = data
.variant_idents()
.map(|v| quote!(#ident::#v(x) => #trait_::poll(#pin::new_unchecked(x), cx)));
impl_.items.push(parse_quote! {
#[inline]
fn poll(
self: #pin<&mut Self>,
cx: &mut ::core::task::Context<'_>,
) -> ::core::task::Poll<Self::Output> {
unsafe {
match self.get_unchecked_mut() { #(#poll,)* }
}
}
});

Ok(impl_.into_token_stream())
}
33 changes: 26 additions & 7 deletions src/derive/core/ops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,23 +94,42 @@ pub(crate) mod range_bounds {

#[cfg(feature = "generator_trait")]
pub(crate) mod generator {
use quote::ToTokens;

use crate::derive::*;

pub(crate) const NAME: &[&str] = &["Generator"];

pub(crate) fn derive(cx: &Context, data: &Data) -> Result<TokenStream> {
cx.needs_pin_projection();
Ok(derive_trait(data, parse_quote!(::core::ops::Generator), None, parse_quote! {

let ident = &data.ident;
let pin = quote!(::core::pin::Pin);
let trait_: syn::Path = parse_quote!(::core::ops::Generator);
let mut impl_ = EnumImpl::from_trait(data, trait_.clone(), None, parse_quote! {
trait Generator<R> {
type Yield;
type Return;
#[inline]
fn resume(
self: ::core::pin::Pin<&mut Self>,
arg: R,
) -> ::core::ops::GeneratorState<Self::Yield, Self::Return>;
}
}))
})
.build_impl();

let resume = data
.variant_idents()
.map(|v| quote!(#ident::#v(x) => #trait_::resume(#pin::new_unchecked(x), arg)));
impl_.items.push(parse_quote! {
#[inline]
fn resume(
self: #pin<&mut Self>,
arg: R,
) -> ::core::ops::GeneratorState<Self::Yield, Self::Return> {
unsafe {
match self.get_unchecked_mut() { #(#resume,)* }
}
}
});

Ok(impl_.into_token_stream())
}
}

Expand Down
Loading

0 comments on commit 4781dfe

Please sign in to comment.