difftreelog
refactor skip desugaring for in operator
in: master
3 files changed
crates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth60 use BinaryOpType::*;60 use BinaryOpType::*;61 use Val::*;61 use Val::*;62 Ok(match (a, op, b) {62 Ok(match (a, op, b) {63 (Str(a), In, Obj(obj)) => Bool(obj.has_field_ex(a.clone(), true)),6463 (a, Add, b) => evaluate_add_op(a, b)?,65 (a, Add, b) => evaluate_add_op(a, b)?,6466crates/jrsonnet-parser/src/expr.rsdiffbeforeafterboth--- a/crates/jrsonnet-parser/src/expr.rs
+++ b/crates/jrsonnet-parser/src/expr.rs
@@ -127,6 +127,9 @@
And,
Or,
+
+ // Equialent to std.objectHasEx(a, b, true)
+ In,
}
impl Display for BinaryOpType {
@@ -154,6 +157,7 @@
Neq => "!=",
And => "&&",
Or => "||",
+ In => "in",
}
)
}
crates/jrsonnet-parser/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-parser/src/lib.rs
+++ b/crates/jrsonnet-parser/src/lib.rs
@@ -217,38 +217,37 @@
rule unaryop(x: rule<()>) -> ()
= quiet!{ x() } / expected!("<unary op>")
+
+ use BinaryOpType::*;
rule expr(s: &ParserSettings) -> LocExpr
= start:position!() a:precedence! {
- a:(@) _ binop(<"||">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Or, b))}
+ a:(@) _ binop(<"||">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Or, b))}
--
- a:(@) _ binop(<"&&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::And, b))}
+ a:(@) _ binop(<"&&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, And, b))}
--
- a:(@) _ binop(<"|">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitOr, b))}
+ a:(@) _ binop(<"|">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BitOr, b))}
--
- a:@ _ binop(<"^">) _ b:(@) {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitXor, b))}
+ a:@ _ binop(<"^">) _ b:(@) {loc_expr_todo!(Expr::BinaryOp(a, BitXor, b))}
--
- a:(@) _ binop(<"&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitAnd, b))}
+ a:(@) _ binop(<"&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BitAnd, b))}
--
- a:(@) _ binop(<"==">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Eq, b))}
- a:(@) _ binop(<"!=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Neq, b))}
+ a:(@) _ binop(<"==">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Eq, b))}
+ a:(@) _ binop(<"!=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Neq, b))}
--
- a:(@) _ binop(<"<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lt, b))}
- a:(@) _ binop(<">">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Gt, b))}
- a:(@) _ binop(<"<=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lte, b))}
- a:(@) _ binop(<">=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Gte, b))}
- a:(@) _ binop(<keyword("in")>) _ b:@ {loc_expr_todo!(Expr::Apply(
- el!(Expr::Intrinsic("objectHasEx".into())), ArgsDesc(vec![Arg(None, b), Arg(None, a), Arg(None, el!(Expr::Literal(LiteralType::True)))]),
- true
- ))}
+ a:(@) _ binop(<"<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lt, b))}
+ a:(@) _ binop(<">">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Gt, b))}
+ a:(@) _ binop(<"<=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lte, b))}
+ a:(@) _ binop(<">=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Gte, b))}
+ a:(@) _ binop(<keyword("in")>) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, In, b))}
--
- a:(@) _ binop(<"<<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lhs, b))}
- a:(@) _ binop(<">>">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Rhs, b))}
+ a:(@) _ binop(<"<<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lhs, b))}
+ a:(@) _ binop(<">>">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Rhs, b))}
--
- a:(@) _ binop(<"+">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Add, b))}
- a:(@) _ binop(<"-">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Sub, b))}
+ a:(@) _ binop(<"+">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Add, b))}
+ a:(@) _ binop(<"-">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Sub, b))}
--
- a:(@) _ binop(<"*">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Mul, b))}
- a:(@) _ binop(<"/">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Div, b))}
+ a:(@) _ binop(<"*">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Mul, b))}
+ a:(@) _ binop(<"/">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Div, b))}
a:(@) _ binop(<"%">) _ b:@ {loc_expr_todo!(Expr::Apply(
el!(Expr::Intrinsic("mod".into())), ArgsDesc(vec![Arg(None, a), Arg(None, b)]),
false
@@ -306,6 +305,7 @@
use super::{expr::*, parse};
use crate::ParserSettings;
use std::path::PathBuf;
+ use BinaryOpType::*;
macro_rules! parse {
($s:expr) => {
@@ -326,10 +326,10 @@
pub fn basic_math() -> LocExpr {
el!(Expr::BinaryOp(
el!(Expr::Num(2.0)),
- BinaryOpType::Add,
+ Add,
el!(Expr::BinaryOp(
el!(Expr::Num(2.0)),
- BinaryOpType::Mul,
+ Mul,
el!(Expr::Num(2.0)),
)),
))
@@ -417,10 +417,10 @@
parse!("2+2*2"),
el!(Expr::BinaryOp(
el!(Expr::Num(2.0)),
- BinaryOpType::Add,
+ Add,
el!(Expr::BinaryOp(
el!(Expr::Num(2.0)),
- BinaryOpType::Mul,
+ Mul,
el!(Expr::Num(2.0))
))
))
@@ -438,7 +438,7 @@
parse!("2+(2+2*2)"),
el!(Expr::BinaryOp(
el!(Expr::Num(2.0)),
- BinaryOpType::Add,
+ Add,
el!(Expr::Parened(expressions::basic_math())),
))
);
@@ -451,10 +451,10 @@
parse!("2//comment\n+//comment\n3/*test*/*/*test*/4"),
el!(Expr::BinaryOp(
el!(Expr::Num(2.0)),
- BinaryOpType::Add,
+ Add,
el!(Expr::BinaryOp(
el!(Expr::Num(3.0)),
- BinaryOpType::Mul,
+ Mul,
el!(Expr::Num(4.0))
))
))
@@ -468,7 +468,7 @@
parse!("2/*\\*/+*/ - 22"),
el!(Expr::BinaryOp(
el!(Expr::Num(2.0)),
- BinaryOpType::Sub,
+ Sub,
el!(Expr::Num(22.0))
))
);
@@ -520,7 +520,7 @@
parse!("!a && !b"),
el!(BinaryOp(
el!(UnaryOp(UnaryOpType::Not, el!(Var("a".into())))),
- BinaryOpType::And,
+ And,
el!(UnaryOp(UnaryOpType::Not, el!(Var("b".into()))))
))
);
@@ -533,7 +533,7 @@
parse!("!a / !b"),
el!(BinaryOp(
el!(UnaryOp(UnaryOpType::Not, el!(Var("a".into())))),
- BinaryOpType::Div,
+ Div,
el!(UnaryOp(UnaryOpType::Not, el!(Var("b".into()))))
))
);