difftreelog
feat(parser) slice desugaring
in: master
1 file changed
crates/jsonnet-parser/src/lib.rsdiffbeforeafterboth192192193 / l(s,<keyword("error") _ expr:expr(s) { Expr::Error(expr) }>)193 / l(s,<keyword("error") _ expr:expr(s) { Expr::Error(expr) }>)194194195 rule slice_part(s: &ParserSettings) -> Option<LocExpr>196 = e:(_ e:expr(s) _{e})? {e}195 pub rule slice_desc(s: &ParserSettings) -> SliceDesc197 pub rule slice_desc(s: &ParserSettings) -> SliceDesc196 = start:expr(s)? _ ":" _ pair:(end:expr(s)? _ step:(":" _ e:expr(s) {e})? {(end, step)})? {198 = start:slice_part(s) ":" pair:(end:slice_part(s) ":" step:slice_part(s) {(end, step)})? {197 if let Some((end, step)) = pair {199 let (end, step) = if let Some((end, step)) = pair {198 SliceDesc { start, end, step }200 (end, step)199 }else{201 }else{202 (None, None)203 };204200 SliceDesc { start, end: None, step: None }205 SliceDesc { start, end, step }201 }202 }206 }203207204 rule expr(s: &ParserSettings) -> LocExpr208 rule expr(s: &ParserSettings) -> LocExpr262 "!" _ b:@ {loc_expr_todo!(Expr::UnaryOp(UnaryOpType::Not, b))}266 "!" _ b:@ {loc_expr_todo!(Expr::UnaryOp(UnaryOpType::Not, b))}263 "~" _ b:@ { loc_expr_todo!(Expr::UnaryOp(UnaryOpType::BitNot, b)) }267 "~" _ b:@ { loc_expr_todo!(Expr::UnaryOp(UnaryOpType::BitNot, b)) }264 --268 --265 a:(@) _ "[" _ s:slice_desc(s) _ "]" {loc_expr_todo!(Expr::Slice(a, s))}269 a:(@) _ "[" _ s:slice_desc(s) _ "]" {loc_expr_todo!(Expr::Apply(270 el!(Expr::Index(271 el!(Expr::Var("std".to_owned())),272 el!(Expr::Str("slice".to_owned())),273 )),274 ArgsDesc(vec![275 Arg(None, a),276 Arg(None, s.start.unwrap_or_else(||el!(Expr::Literal(LiteralType::Null)))),277 Arg(None, s.end.unwrap_or_else(||el!(Expr::Literal(LiteralType::Null)))),278 Arg(None, s.step.unwrap_or_else(||el!(Expr::Literal(LiteralType::Null)))),279 ]),280 true,281 ))}266 a:(@) _ "." _ s:id() {loc_expr_todo!(Expr::Index(a, el!(Expr::Str(s))))}282 a:(@) _ "." _ s:id() {loc_expr_todo!(Expr::Index(a, el!(Expr::Str(s))))}267 a:(@) _ "[" _ s:expr(s) _ "]" {loc_expr_todo!(Expr::Index(a, s))}283 a:(@) _ "[" _ s:expr(s) _ "]" {loc_expr_todo!(Expr::Index(a, s))}339 )355 )340 }356 }357358 #[test]359 fn slice() {360 println!("{:?}", parse!("a[1:]"));361 println!("{:?}", parse!("a[1::]"));362 println!("{:?}", parse!("a[:1:]"));363 println!("{:?}", parse!("a[::1]"));364 }341365342 #[test]366 #[test]343 fn string_escaping() {367 fn string_escaping() {