usecrate::utils::{
add_extra_generic_param, add_extra_ty_param_bound_ref, SingleFieldData, State,
}; use proc_macro2::TokenStream; use quote::{quote, ToTokens}; use syn::{parse::Result, DeriveInput};
/// Provides the hook to expand `#[derive(IntoIterator)]` into an implementation of `IntoIterator` pubfn expand(input: &DeriveInput, trait_name: &'static str) -> Result<TokenStream> { let state =
State::with_field_ignore_and_refs(input, trait_name, "into_iterator".into())?; let SingleFieldData {
input_type,
info,
field_type,
member,
trait_path,
..
} = state.assert_single_enabled_field();
letmut tokens = TokenStream::new();
for ref_type in info.ref_types() { let reference = ref_type.reference(); let lifetime = ref_type.lifetime(); let reference_with_lifetime = ref_type.reference_with_lifetime();
let generics_impl; let generics =
add_extra_ty_param_bound_ref(&input.generics, trait_path, ref_type); let (_, ty_generics, where_clause) = generics.split_for_impl(); let (impl_generics, _, _) = if ref_type.is_ref() {
generics_impl = add_extra_generic_param(&generics, lifetime.clone());
generics_impl.split_for_impl()
} else {
generics.split_for_impl()
}; // let generics = add_extra_ty_param_bound(&input.generics, trait_path); let casted_trait = "e! {
<#reference_with_lifetime#field_typeas#trait_path>
}; let into_iterator = quote! { #[automatically_derived] impl#impl_generics#trait_pathfor#reference_with_lifetime#input_type#ty_generics #where_clause
{ type Item = #casted_trait::Item; type IntoIter = #casted_trait::IntoIter;
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.