Rewrite if
expression stuff
This commit is contained in:
parent
b1e0647192
commit
ef1e305468
3 changed files with 33 additions and 21 deletions
|
@ -146,7 +146,8 @@ impl<'cx, 's, 'i> Parser<'cx, 's, 'i> {
|
|||
}
|
||||
|
||||
fn if_expr(&mut self, sp: Span) {
|
||||
let mut cond = vec![];
|
||||
// Parse the initial if
|
||||
let mut cond_tts = vec![];
|
||||
let if_body;
|
||||
loop { match self.input {
|
||||
[TtDelimited(sp, ref d), ..] if d.delim == DelimToken::Brace => {
|
||||
|
@ -156,28 +157,39 @@ impl<'cx, 's, 'i> Parser<'cx, 's, 'i> {
|
|||
},
|
||||
[ref tt, ..] => {
|
||||
self.shift(1);
|
||||
cond.push(tt.clone());
|
||||
cond_tts.push(tt.clone());
|
||||
},
|
||||
[] => self.render.cx.span_fatal(sp, "expected body for this $if"),
|
||||
[] => self.render.cx.span_fatal(sp, "expected body for this `if`"),
|
||||
}}
|
||||
let cond = self.new_rust_parser(cond).parse_expr();
|
||||
let if_cond = self.new_rust_parser(cond_tts).parse_expr();
|
||||
// Parse the (optional) else
|
||||
let else_body = match self.input {
|
||||
[dollar!(), ident!(name), ..] if name.as_str() == "else" => {
|
||||
[dollar!(), ident!(else_), ..] if else_.as_str() == "else" => {
|
||||
self.shift(2);
|
||||
let else_body = {
|
||||
// Parse a single markup, but capture the result rather
|
||||
// than emitting it right away
|
||||
let mut render = self.render.fork();
|
||||
mem::swap(&mut self.render, &mut render);
|
||||
self.markup();
|
||||
mem::swap(&mut self.render, &mut render);
|
||||
render.into_stmts()
|
||||
};
|
||||
Some(else_body)
|
||||
match self.input {
|
||||
[ident!(sp, if_), ..] if if_.as_str() == "if" => {
|
||||
self.shift(1);
|
||||
let else_body = {
|
||||
// Parse an if expression, but capture the result
|
||||
// rather than emitting it right away
|
||||
let mut render = self.render.fork();
|
||||
mem::swap(&mut self.render, &mut render);
|
||||
self.if_expr(sp);
|
||||
mem::swap(&mut self.render, &mut render);
|
||||
render.into_stmts()
|
||||
};
|
||||
Some(else_body)
|
||||
},
|
||||
[TtDelimited(sp, ref d), ..] if d.delim == DelimToken::Brace => {
|
||||
self.shift(1);
|
||||
Some(self.block(sp, &d.tts))
|
||||
},
|
||||
_ => self.render.cx.span_fatal(sp, "invalid syntax"),
|
||||
}
|
||||
},
|
||||
_ => None,
|
||||
};
|
||||
self.render.emit_if(cond, if_body, else_body);
|
||||
self.render.emit_if(if_cond, if_body, else_body);
|
||||
}
|
||||
|
||||
fn splice(&mut self, sp: Span) -> P<Expr> {
|
||||
|
|
|
@ -126,12 +126,12 @@ impl<'cx, 's> Renderer<'cx, 's> {
|
|||
self.write(">");
|
||||
}
|
||||
|
||||
pub fn emit_if(&mut self, cond: P<Expr>, if_body: Vec<P<Stmt>>,
|
||||
pub fn emit_if(&mut self, if_cond: P<Expr>, if_body: Vec<P<Stmt>>,
|
||||
else_body: Option<Vec<P<Stmt>>>) {
|
||||
let stmt = match else_body {
|
||||
None => quote_stmt!(self.cx, if $cond { $if_body }),
|
||||
None => quote_stmt!(self.cx, if $if_cond { $if_body }),
|
||||
Some(else_body) =>
|
||||
quote_stmt!(self.cx, if $cond { $if_body } else { $else_body }),
|
||||
quote_stmt!(self.cx, if $if_cond { $if_body } else { $else_body }),
|
||||
};
|
||||
self.stmts.push(stmt);
|
||||
}
|
||||
|
|
|
@ -190,9 +190,9 @@ mod control {
|
|||
let s = html! {
|
||||
$if number == 1 {
|
||||
"one"
|
||||
} $else $if number == 2 {
|
||||
} $else if number == 2 {
|
||||
"two"
|
||||
} $else $if number == 3 {
|
||||
} $else if number == 3 {
|
||||
"three"
|
||||
} $else {
|
||||
"oh noes"
|
||||
|
|
Loading…
Add table
Reference in a new issue