git.delta.rocks / jrsonnet / refs/commits / 53ec857983ef

difftreelog

refactor skip desugaring for in operator

Yaroslav Bolyukin2021-07-04parent: #f047fb1.patch.diff
in: master

3 files changed

modifiedcrates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth
60 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)),
64
63 (a, Add, b) => evaluate_add_op(a, b)?,65 (a, Add, b) => evaluate_add_op(a, b)?,
6466
modifiedcrates/jrsonnet-parser/src/expr.rsdiffbeforeafterboth
128 And,128 And,
129 Or,129 Or,
130
131 // Equialent to std.objectHasEx(a, b, true)
132 In,
130}133}
131134
132impl Display for BinaryOpType {135impl Display for BinaryOpType {
154 Neq => "!=",157 Neq => "!=",
155 And => "&&",158 And => "&&",
156 Or => "||",159 Or => "||",
160 In => "in",
157 }161 }
158 )162 )
159 }163 }
modifiedcrates/jrsonnet-parser/src/lib.rsdiffbeforeafterboth
218 = quiet!{ x() } / expected!("<unary op>")218 = quiet!{ x() } / expected!("<unary op>")
219219
220
221 use BinaryOpType::*;
220 rule expr(s: &ParserSettings) -> LocExpr222 rule expr(s: &ParserSettings) -> LocExpr
221 = start:position!() a:precedence! {223 = start:position!() a:precedence! {
222 a:(@) _ binop(<"||">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Or, b))}224 a:(@) _ binop(<"||">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Or, b))}
223 --225 --
224 a:(@) _ binop(<"&&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::And, b))}226 a:(@) _ binop(<"&&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, And, b))}
225 --227 --
226 a:(@) _ binop(<"|">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitOr, b))}228 a:(@) _ binop(<"|">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BitOr, b))}
227 --229 --
228 a:@ _ binop(<"^">) _ b:(@) {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitXor, b))}230 a:@ _ binop(<"^">) _ b:(@) {loc_expr_todo!(Expr::BinaryOp(a, BitXor, b))}
229 --231 --
230 a:(@) _ binop(<"&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitAnd, b))}232 a:(@) _ binop(<"&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BitAnd, b))}
231 --233 --
232 a:(@) _ binop(<"==">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Eq, b))}234 a:(@) _ binop(<"==">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Eq, b))}
233 a:(@) _ binop(<"!=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Neq, b))}235 a:(@) _ binop(<"!=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Neq, b))}
234 --236 --
235 a:(@) _ binop(<"<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lt, b))}237 a:(@) _ binop(<"<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lt, b))}
236 a:(@) _ binop(<">">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Gt, b))}238 a:(@) _ binop(<">">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Gt, b))}
237 a:(@) _ binop(<"<=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lte, b))}239 a:(@) _ binop(<"<=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lte, b))}
238 a:(@) _ binop(<">=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Gte, b))}240 a:(@) _ binop(<">=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Gte, b))}
239 a:(@) _ binop(<keyword("in")>) _ b:@ {loc_expr_todo!(Expr::Apply(241 a:(@) _ binop(<keyword("in")>) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, In, b))}
240 el!(Expr::Intrinsic("objectHasEx".into())), ArgsDesc(vec![Arg(None, b), Arg(None, a), Arg(None, el!(Expr::Literal(LiteralType::True)))]),
241 true
242 ))}
243 --242 --
244 a:(@) _ binop(<"<<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lhs, b))}243 a:(@) _ binop(<"<<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lhs, b))}
245 a:(@) _ binop(<">>">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Rhs, b))}244 a:(@) _ binop(<">>">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Rhs, b))}
246 --245 --
247 a:(@) _ binop(<"+">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Add, b))}246 a:(@) _ binop(<"+">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Add, b))}
248 a:(@) _ binop(<"-">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Sub, b))}247 a:(@) _ binop(<"-">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Sub, b))}
249 --248 --
250 a:(@) _ binop(<"*">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Mul, b))}249 a:(@) _ binop(<"*">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Mul, b))}
251 a:(@) _ binop(<"/">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Div, b))}250 a:(@) _ binop(<"/">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Div, b))}
252 a:(@) _ binop(<"%">) _ b:@ {loc_expr_todo!(Expr::Apply(251 a:(@) _ binop(<"%">) _ b:@ {loc_expr_todo!(Expr::Apply(
253 el!(Expr::Intrinsic("mod".into())), ArgsDesc(vec![Arg(None, a), Arg(None, b)]),252 el!(Expr::Intrinsic("mod".into())), ArgsDesc(vec![Arg(None, a), Arg(None, b)]),
254 false253 false
306 use super::{expr::*, parse};305 use super::{expr::*, parse};
307 use crate::ParserSettings;306 use crate::ParserSettings;
308 use std::path::PathBuf;307 use std::path::PathBuf;
308 use BinaryOpType::*;
309309
310 macro_rules! parse {310 macro_rules! parse {
311 ($s:expr) => {311 ($s:expr) => {
326 pub fn basic_math() -> LocExpr {326 pub fn basic_math() -> LocExpr {
327 el!(Expr::BinaryOp(327 el!(Expr::BinaryOp(
328 el!(Expr::Num(2.0)),328 el!(Expr::Num(2.0)),
329 BinaryOpType::Add,329 Add,
330 el!(Expr::BinaryOp(330 el!(Expr::BinaryOp(
331 el!(Expr::Num(2.0)),331 el!(Expr::Num(2.0)),
332 BinaryOpType::Mul,332 Mul,
333 el!(Expr::Num(2.0)),333 el!(Expr::Num(2.0)),
334 )),334 )),
335 ))335 ))
417 parse!("2+2*2"),417 parse!("2+2*2"),
418 el!(Expr::BinaryOp(418 el!(Expr::BinaryOp(
419 el!(Expr::Num(2.0)),419 el!(Expr::Num(2.0)),
420 BinaryOpType::Add,420 Add,
421 el!(Expr::BinaryOp(421 el!(Expr::BinaryOp(
422 el!(Expr::Num(2.0)),422 el!(Expr::Num(2.0)),
423 BinaryOpType::Mul,423 Mul,
424 el!(Expr::Num(2.0))424 el!(Expr::Num(2.0))
425 ))425 ))
426 ))426 ))
438 parse!("2+(2+2*2)"),438 parse!("2+(2+2*2)"),
439 el!(Expr::BinaryOp(439 el!(Expr::BinaryOp(
440 el!(Expr::Num(2.0)),440 el!(Expr::Num(2.0)),
441 BinaryOpType::Add,441 Add,
442 el!(Expr::Parened(expressions::basic_math())),442 el!(Expr::Parened(expressions::basic_math())),
443 ))443 ))
444 );444 );
451 parse!("2//comment\n+//comment\n3/*test*/*/*test*/4"),451 parse!("2//comment\n+//comment\n3/*test*/*/*test*/4"),
452 el!(Expr::BinaryOp(452 el!(Expr::BinaryOp(
453 el!(Expr::Num(2.0)),453 el!(Expr::Num(2.0)),
454 BinaryOpType::Add,454 Add,
455 el!(Expr::BinaryOp(455 el!(Expr::BinaryOp(
456 el!(Expr::Num(3.0)),456 el!(Expr::Num(3.0)),
457 BinaryOpType::Mul,457 Mul,
458 el!(Expr::Num(4.0))458 el!(Expr::Num(4.0))
459 ))459 ))
460 ))460 ))
468 parse!("2/*\\*/+*/ - 22"),468 parse!("2/*\\*/+*/ - 22"),
469 el!(Expr::BinaryOp(469 el!(Expr::BinaryOp(
470 el!(Expr::Num(2.0)),470 el!(Expr::Num(2.0)),
471 BinaryOpType::Sub,471 Sub,
472 el!(Expr::Num(22.0))472 el!(Expr::Num(22.0))
473 ))473 ))
474 );474 );
520 parse!("!a && !b"),520 parse!("!a && !b"),
521 el!(BinaryOp(521 el!(BinaryOp(
522 el!(UnaryOp(UnaryOpType::Not, el!(Var("a".into())))),522 el!(UnaryOp(UnaryOpType::Not, el!(Var("a".into())))),
523 BinaryOpType::And,523 And,
524 el!(UnaryOp(UnaryOpType::Not, el!(Var("b".into()))))524 el!(UnaryOp(UnaryOpType::Not, el!(Var("b".into()))))
525 ))525 ))
526 );526 );
533 parse!("!a / !b"),533 parse!("!a / !b"),
534 el!(BinaryOp(534 el!(BinaryOp(
535 el!(UnaryOp(UnaryOpType::Not, el!(Var("a".into())))),535 el!(UnaryOp(UnaryOpType::Not, el!(Var("a".into())))),
536 BinaryOpType::Div,536 Div,
537 el!(UnaryOp(UnaryOpType::Not, el!(Var("b".into()))))537 el!(UnaryOp(UnaryOpType::Not, el!(Var("b".into()))))
538 ))538 ))
539 );539 );