Use match
instead of let
to hold on to the writer
This fixes a bunch of lifetime issues
This commit is contained in:
parent
136d8abdf6
commit
4c6fe05395
2 changed files with 9 additions and 8 deletions
|
@ -48,10 +48,10 @@ pub fn parse(cx: &ExtCtxt, input: &[TokenTree], sp: Span) -> P<Expr> {
|
||||||
in_attr: false,
|
in_attr: false,
|
||||||
input: input,
|
input: input,
|
||||||
span: sp,
|
span: sp,
|
||||||
render: Renderer::new(cx, write.to_vec()),
|
render: Renderer::new(cx),
|
||||||
};
|
};
|
||||||
parser.markups();
|
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]) {
|
fn split_comma<'a>(cx: &ExtCtxt, input: &'a [TokenTree], sp: Span) -> (&'a [TokenTree], &'a [TokenTree]) {
|
||||||
|
|
|
@ -23,17 +23,16 @@ pub struct Renderer<'cx> {
|
||||||
|
|
||||||
impl<'cx> Renderer<'cx> {
|
impl<'cx> Renderer<'cx> {
|
||||||
/// Creates a new `Renderer` using the given extension context.
|
/// 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 writer = token::gensym_ident("__maud_writer");
|
||||||
let result = token::gensym_ident("__maud_result");
|
let result = token::gensym_ident("__maud_result");
|
||||||
let loop_label = token::gensym_ident("__maud_loop_label");
|
let loop_label = token::gensym_ident("__maud_loop_label");
|
||||||
let writer_stmt = quote_stmt!(cx, let $writer = &mut $writer_expr).unwrap();
|
|
||||||
Renderer {
|
Renderer {
|
||||||
cx: cx,
|
cx: cx,
|
||||||
writer: writer,
|
writer: writer,
|
||||||
result: result,
|
result: result,
|
||||||
loop_label: vec![TtToken(DUMMY_SP, token::Lifetime(loop_label))],
|
loop_label: vec![TtToken(DUMMY_SP, token::Lifetime(loop_label))],
|
||||||
stmts: vec![writer_stmt],
|
stmts: vec![],
|
||||||
tail: String::new(),
|
tail: String::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,13 +64,15 @@ impl<'cx> Renderer<'cx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Reifies the `Renderer` into a block of markup.
|
/// Reifies the `Renderer` into a block of markup.
|
||||||
pub fn into_expr(mut self) -> P<Expr> {
|
pub fn into_expr(mut self, writer_expr: Vec<TokenTree>) -> P<Expr> {
|
||||||
let Renderer { cx, result, loop_label, stmts, .. } = { self.flush(); self };
|
let Renderer { cx, writer, result, loop_label, stmts, .. } = { self.flush(); self };
|
||||||
quote_expr!(cx, {
|
quote_expr!(cx, {
|
||||||
let mut $result = Ok(());
|
let mut $result = Ok(());
|
||||||
$loop_label: loop {
|
$loop_label: loop {
|
||||||
use ::std::fmt::Write;
|
use ::std::fmt::Write;
|
||||||
$stmts
|
match &mut $writer_expr {
|
||||||
|
$writer => { $stmts }
|
||||||
|
}
|
||||||
break $loop_label;
|
break $loop_label;
|
||||||
}
|
}
|
||||||
$result
|
$result
|
||||||
|
|
Loading…
Add table
Reference in a new issue