1use proc_macro2::{Ident, TokenStream};
2use quote::{format_ident, quote};
3
4use yarte_hir::HIR;
5
6use crate::CodeGen;
7
8pub struct WriteBCodeGen<T: CodeGen> {
9 codegen: T,
10 parent: Ident,
11}
12
13impl<T: CodeGen> WriteBCodeGen<T> {
14 pub fn new(codegen: T, parent: &'static str) -> WriteBCodeGen<T> {
15 WriteBCodeGen {
16 codegen,
17 parent: format_ident!("{}", parent),
18 }
19 }
20
21 fn body(&mut self, nodes: Vec<HIR>) -> TokenStream {
22 self.codegen.gen(nodes)
23 }
24}
25
26impl<T: CodeGen> CodeGen for WriteBCodeGen<T> {
27 fn gen(&mut self, v: Vec<HIR>) -> TokenStream {
28 let body = self.body(v);
29 let parent = &self.parent;
30 quote! {
31 {
32 #[allow(unused_imports)]
33 use #parent::*;
34 macro_rules! buf_ref {
35 ($b:expr) => { &mut $b };
36 }
37 #body
38 }
39 }
40 }
41}