use proc_macro2::{Ident, TokenStream};
use quote::quote;
use syn::ItemTrait;
use crate::codegen::generate_impl;
use crate::parse::parse_item;
use crate::scan::Cursor;
use crate::types::Op;
pub(crate) fn parse_batch_trait_entry(
cursor: &mut Cursor, top_level: Op, trait_full_path: &TokenStream,
trait_last_ident: &Ident, is_unsafe_trait: bool, start_trait: Option<ItemTrait>,
) -> TokenStream {
let mut tys = vec![];
while let Some(ty) = parse_item(cursor, top_level, Some(trait_last_ident)) {
let mut queue = vec![ty];
while let Some(item) = queue.pop() {
match item.expand() {
Ok(expanded) => {
for e in expanded.into_iter().rev() {
queue.push(e);
}
}
Err(leaf) => tys.push(leaf),
}
}
}
let mut impls = start_trait.map_or(quote![], |t| quote![#t]);
for t in tys {
impls.extend(generate_impl(t, trait_full_path, is_unsafe_trait));
}
impls
}