aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--askama_shared/src/parser.rs18
-rw-r--r--testing/templates/precedence.html7
-rw-r--r--testing/tests/precedence.rs15
3 files changed, 34 insertions, 6 deletions
diff --git a/askama_shared/src/parser.rs b/askama_shared/src/parser.rs
index 8732f0e..8ff2063 100644
--- a/askama_shared/src/parser.rs
+++ b/askama_shared/src/parser.rs
@@ -229,15 +229,21 @@ named!(expr_filtered<Expr>, do_parse!(
macro_rules! expr_prec_layer {
( $name:ident, $inner:ident, $( $op:expr ),* ) => {
- named!($name<Expr>, alt!(
+ named!($name<Expr>,
do_parse!(
left: $inner >>
- op: ws!(alt!($( tag_s!($op) )|*)) >>
- right: $inner >>
- (Expr::BinOp(str::from_utf8(op).unwrap(),
+ op_and_right: opt!(pair!(ws!(alt!($( tag_s!($op) )|*)), expr_any)) >>
+ (
+ if op_and_right.is_some() {
+ let (op, right) = op_and_right.unwrap();
+ (Expr::BinOp(str::from_utf8(op).unwrap(),
Box::new(left), Box::new(right)))
- ) | $inner
- ));
+ } else {
+ left
+ }
+ )
+ )
+ );
}
}
diff --git a/testing/templates/precedence.html b/testing/templates/precedence.html
new file mode 100644
index 0000000..e5d12dd
--- /dev/null
+++ b/testing/templates/precedence.html
@@ -0,0 +1,7 @@
+{{ 3 * 4 / 2 -}}
+{{ 26 / 2 % 7 -}}
+{{ 3 % 2 * 6 -}}
+{{ 1 * 2 + 4 -}}
+{{ 11 - 15 / 3 -}}
+{{ 4 + 5 % 3 -}}
+{{ 4 | 2 + 5 & 2 -}}
diff --git a/testing/tests/precedence.rs b/testing/tests/precedence.rs
new file mode 100644
index 0000000..f02189d
--- /dev/null
+++ b/testing/tests/precedence.rs
@@ -0,0 +1,15 @@
+#[macro_use]
+extern crate askama;
+
+use askama::Template;
+
+#[derive(Template)]
+#[template(path = "precedence.html")]
+struct PrecedenceTemplate {
+}
+
+#[test]
+fn test_precedence() {
+ let t = PrecedenceTemplate { };
+ assert_eq!(t.render().unwrap(), "6".repeat(7));
+}