use indexmap::IndexMap;
use proc_macro2::TokenStream;
use crate::types::{AnonUnionId, NodeModule};
#[derive(Default)]
pub struct GeneratedNodeTokens {
pub toplevel: TokenStream,
pub unnamed: TokenStream,
pub symbols: TokenStream,
pub anon_unions: AnonUnions,
}
pub type AnonUnions = IndexMap<AnonUnionId, TokenStream>;
impl GeneratedNodeTokens {
pub fn new() -> Self {
Self::default()
}
pub fn extend(&mut self, module: NodeModule, tokens: TokenStream) {
match module {
NodeModule::Toplevel => self.toplevel.extend(tokens),
NodeModule::Unnamed => self.unnamed.extend(tokens),
NodeModule::Symbols => self.symbols.extend(tokens),
}
}
}
impl Extend<GeneratedNodeTokens> for GeneratedNodeTokens {
fn extend<T: IntoIterator<Item = GeneratedNodeTokens>>(&mut self, iter: T) {
for x in iter {
self.toplevel.extend(x.toplevel);
self.unnamed.extend(x.unnamed);
self.symbols.extend(x.symbols);
self.anon_unions.extend(x.anon_unions);
}
}
}
impl FromIterator<GeneratedNodeTokens> for GeneratedNodeTokens {
fn from_iter<T: IntoIterator<Item = GeneratedNodeTokens>>(iter: T) -> Self {
let mut this = Self::new();
Extend::<GeneratedNodeTokens>::extend(&mut this, iter);
this
}
}