Use match instead of let to hold on to the writer

This fixes a bunch of lifetime issues
This commit is contained in:
Chris Wong 2015-09-06 12:10:55 +12:00
parent 136d8abdf6
commit 4c6fe05395
2 changed files with 9 additions and 8 deletions
maud_macros/src

View file

@ -48,10 +48,10 @@ pub fn parse(cx: &ExtCtxt, input: &[TokenTree], sp: Span) -> P<Expr> {
in_attr: false,
input: input,
span: sp,
render: Renderer::new(cx, write.to_vec()),
render: Renderer::new(cx),
};
parser.markups();
parser.into_render().into_expr()
parser.into_render().into_expr(write.to_vec())
}
fn split_comma<'a>(cx: &ExtCtxt, input: &'a [TokenTree], sp: Span) -> (&'a [TokenTree], &'a [TokenTree]) {

View file

@ -23,17 +23,16 @@ pub struct Renderer<'cx> {
impl<'cx> Renderer<'cx> {
/// Creates a new `Renderer` using the given extension context.
pub fn new(cx: &'cx ExtCtxt<'cx>, writer_expr: Vec<TokenTree>) -> Renderer<'cx> {
pub fn new(cx: &'cx ExtCtxt<'cx>) -> Renderer<'cx> {
let writer = token::gensym_ident("__maud_writer");
let result = token::gensym_ident("__maud_result");
let loop_label = token::gensym_ident("__maud_loop_label");
let writer_stmt = quote_stmt!(cx, let $writer = &mut $writer_expr).unwrap();
Renderer {
cx: cx,
writer: writer,
result: result,
loop_label: vec![TtToken(DUMMY_SP, token::Lifetime(loop_label))],
stmts: vec![writer_stmt],
stmts: vec![],
tail: String::new(),
}
}
@ -65,13 +64,15 @@ impl<'cx> Renderer<'cx> {
}
/// Reifies the `Renderer` into a block of markup.
pub fn into_expr(mut self) -> P<Expr> {
let Renderer { cx, result, loop_label, stmts, .. } = { self.flush(); self };
pub fn into_expr(mut self, writer_expr: Vec<TokenTree>) -> P<Expr> {
let Renderer { cx, writer, result, loop_label, stmts, .. } = { self.flush(); self };
quote_expr!(cx, {
let mut $result = Ok(());
$loop_label: loop {
use ::std::fmt::Write;
$stmts
match &mut $writer_expr {
$writer => { $stmts }
}
break $loop_label;
}
$result