/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
usecrate::util::{add_predicate, fmap2_match, parse_field_attrs, parse_input_attrs}; use darling::{FromDeriveInput, FromField}; use proc_macro2::TokenStream; use quote::quote; use syn::{self, parse_quote}; use synstructure::{BindStyle, Structure};
pubfn derive(mut input: syn::DeriveInput) -> TokenStream { letmut where_clause = input.generics.where_clause.take(); let attrs = parse_input_attrs::<ShmemInputAttrs>(&input); if !attrs.no_bounds { for param in input.generics.type_params() {
add_predicate(&mut where_clause, parse_quote!(#param: ::to_shmem::ToShmem));
}
} for variant in Structure::new(&input).variants() { for binding in variant.bindings() { let attrs = parse_field_attrs::<ShmemFieldAttrs>(&binding.ast()); if attrs.field_bound { let ty = &binding.ast().ty;
add_predicate(&mut where_clause, parse_quote!(#ty: ::to_shmem::ToShmem))
}
}
}
input.generics.where_clause = where_clause;
// Do all of the `to_shmem()?` calls before the `ManuallyDrop::into_inner()` // calls, so that we don't drop a value in the shared memory buffer if one // of the `to_shmem`s fails. let match_body = fmap2_match(
&input,
BindStyle::Ref,
|binding| {
quote! {
::to_shmem::ToShmem::to_shmem(#binding, builder)?
}
},
|binding| {
Some(quote! {
::std::mem::ManuallyDrop::into_inner(#binding)
})
},
);
let name = &input.ident; let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.