Rename $if and $for to #if and #for

`#if` and `#for` aren't splices. They are a different concept, so should
have different syntax as well.
This commit is contained in:
Chris Wong 2015-09-12 13:53:14 +12:00
parent 59360c719c
commit 37835b3b24
2 changed files with 17 additions and 14 deletions
maud_macros

View file

@ -13,6 +13,9 @@ use super::render::{Escape, Renderer};
macro_rules! dollar { macro_rules! dollar {
() => (TtToken(_, token::Dollar)) () => (TtToken(_, token::Dollar))
} }
macro_rules! pound {
() => (TtToken(_, token::Pound))
}
macro_rules! dot { macro_rules! dot {
() => (TtToken(_, token::Dot)) () => (TtToken(_, token::Dot))
} }
@ -125,12 +128,12 @@ impl<'cx, 'i> Parser<'cx, 'i> {
self.literal(tt, false); self.literal(tt, false);
}, },
// If // If
[dollar!(), ident!(sp, name), ..] if name.name == "if" => { [pound!(), ident!(sp, name), ..] if name.name == "if" => {
self.shift(2); self.shift(2);
self.if_expr(sp); self.if_expr(sp);
}, },
// For // For
[dollar!(), ident!(sp, name), ..] if name.name == "for" => { [pound!(), ident!(sp, name), ..] if name.name == "for" => {
self.shift(2); self.shift(2);
self.for_expr(sp); self.for_expr(sp);
}, },
@ -201,11 +204,11 @@ impl<'cx, 'i> Parser<'cx, 'i> {
self.shift(1); self.shift(1);
if_cond.push(tt.clone()); if_cond.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"),
}} }}
// Parse the (optional) else // Parse the (optional) else
let else_body = match self.input { let else_body = match self.input {
[dollar!(), ident!(else_), ..] if else_.name == "else" => { [pound!(), ident!(else_), ..] if else_.name == "else" => {
self.shift(2); self.shift(2);
match self.input { match self.input {
[ident!(sp, if_), ..] if if_.name == "if" => { [ident!(sp, if_), ..] if if_.name == "if" => {
@ -225,7 +228,7 @@ impl<'cx, 'i> Parser<'cx, 'i> {
self.shift(1); self.shift(1);
Some(self.block(sp, &d.tts)) Some(self.block(sp, &d.tts))
}, },
_ => self.render.cx.span_fatal(sp, "expected body for this $else"), _ => self.render.cx.span_fatal(sp, "expected body for this #else"),
} }
}, },
_ => None, _ => None,
@ -244,7 +247,7 @@ impl<'cx, 'i> Parser<'cx, 'i> {
self.shift(1); self.shift(1);
pattern.push(tt.clone()); pattern.push(tt.clone());
}, },
_ => self.render.cx.span_fatal(sp, "invalid $for"), _ => self.render.cx.span_fatal(sp, "invalid #for"),
}} }}
let pattern = self.with_rust_parser(pattern, RustParser::parse_pat); let pattern = self.with_rust_parser(pattern, RustParser::parse_pat);
let mut iterable = vec![]; let mut iterable = vec![];
@ -259,7 +262,7 @@ impl<'cx, 'i> Parser<'cx, 'i> {
self.shift(1); self.shift(1);
iterable.push(tt.clone()); iterable.push(tt.clone());
}, },
_ => self.render.cx.span_fatal(sp, "invalid $for"), _ => self.render.cx.span_fatal(sp, "invalid #for"),
}} }}
let iterable = self.with_rust_parser(iterable, RustParser::parse_expr); let iterable = self.with_rust_parser(iterable, RustParser::parse_expr);
self.render.emit_for(pattern, iterable, body); self.render.emit_for(pattern, iterable, body);

View file

@ -202,13 +202,13 @@ mod control {
for (number, &name) in (1..4).zip(["one", "two", "three"].iter()) { for (number, &name) in (1..4).zip(["one", "two", "three"].iter()) {
let mut s = String::new(); let mut s = String::new();
html!(s, { html!(s, {
$if number == 1 { #if number == 1 {
"one" "one"
} $else if number == 2 { } #else if number == 2 {
"two" "two"
} $else if number == 3 { } #else if number == 3 {
"three" "three"
} $else { } #else {
"oh noes" "oh noes"
} }
}).unwrap(); }).unwrap();
@ -221,9 +221,9 @@ mod control {
for &(input, output) in [(Some("yay"), "yay"), (None, "oh noes")].iter() { for &(input, output) in [(Some("yay"), "yay"), (None, "oh noes")].iter() {
let mut s = String::new(); let mut s = String::new();
html!(s, { html!(s, {
$if let Some(value) = input { #if let Some(value) = input {
$value $value
} $else { } #else {
"oh noes" "oh noes"
} }
}).unwrap(); }).unwrap();
@ -236,7 +236,7 @@ mod control {
let ponies = ["Apple Bloom", "Scootaloo", "Sweetie Belle"]; let ponies = ["Apple Bloom", "Scootaloo", "Sweetie Belle"];
let mut s = String::new(); let mut s = String::new();
html!(s, { html!(s, {
ul $for pony in &ponies { ul #for pony in &ponies {
li $pony li $pony
} }
}).unwrap(); }).unwrap();