yarte_codegen/
write_b.rs

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}