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,
|
||||
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]) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue