yarte_codegen 0.15.6

Code generator for yarte
Documentation
use proc_macro2::{Ident, TokenStream};
use quote::{format_ident, quote};

use yarte_hir::HIR;

use crate::CodeGen;

pub struct WriteBCodeGen<T: CodeGen> {
    codegen: T,
    parent: Ident,
}

impl<T: CodeGen> WriteBCodeGen<T> {
    pub fn new(codegen: T, parent: &'static str) -> WriteBCodeGen<T> {
        WriteBCodeGen {
            codegen,
            parent: format_ident!("{}", parent),
        }
    }

    fn body(&mut self, nodes: Vec<HIR>) -> TokenStream {
        self.codegen.gen(nodes)
    }
}

impl<T: CodeGen> CodeGen for WriteBCodeGen<T> {
    fn gen(&mut self, v: Vec<HIR>) -> TokenStream {
        let body = self.body(v);
        let parent = &self.parent;
        quote! {
            {
                #[allow(unused_imports)]
                use #parent::*;
                macro_rules! buf_ref {
                    ($b:expr) => { &mut $b };
                }
                #body
            }
        }
    }
}