From 0b2a41fa24cce3b67b5a12fc4f5db16ce26de950 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Mon, 23 Mar 2026 06:51:38 +0000 Subject: [PATCH] fix(rowan): statements bind the tighest --- --- a/crates/jrsonnet-rowan-parser/src/parser.rs +++ b/crates/jrsonnet-rowan-parser/src/parser.rs @@ -313,6 +313,7 @@ }; m.complete(p, EXPR) } + fn expr_binding_power( p: &mut Parser, minimum_binding_power: u8, @@ -335,9 +336,14 @@ } let m = m.precede(p); - let parsed_rhs = expr_binding_power(p, right_binding_power) - .map(|v| v.precede(p).complete(p, EXPR)) - .is_ok(); + let parsed_rhs = if p.at(T![local]) || p.at(T![assert]) { + expr(p); + true + } else { + expr_binding_power(p, right_binding_power) + .map(|v| v.precede(p).complete(p, EXPR)) + .is_ok() + }; lhs = m.complete( p, if op == BinaryOperatorKind::MetaObjectApply { --- /dev/null +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_in_binop_rhs.snap @@ -0,0 +1,34 @@ +--- +source: crates/jrsonnet-rowan-parser/src/tests.rs +expression: "a + local x = 1; x\n" +--- +SOURCE_FILE@0..19 + EXPR@0..18 + EXPR_BINARY@0..18 + EXPR@0..1 + EXPR_VAR@0..1 + NAME@0..1 + IDENT@0..1 "a" + WHITESPACE@1..2 " " + PLUS@2..3 "+" + WHITESPACE@3..4 " " + EXPR@4..18 + STMT_LOCAL@4..16 + LOCAL_KW@4..9 "local" + WHITESPACE@9..10 " " + BIND_DESTRUCT@10..15 + DESTRUCT_FULL@10..11 + NAME@10..11 + IDENT@10..11 "x" + WHITESPACE@11..12 " " + ASSIGN@12..13 "=" + WHITESPACE@13..14 " " + EXPR@14..15 + EXPR_NUMBER@14..15 + FLOAT@14..15 "1" + SEMI@15..16 ";" + WHITESPACE@16..17 " " + EXPR_VAR@17..18 + NAME@17..18 + IDENT@17..18 "x" + WHITESPACE@18..19 "\n" --- a/crates/jrsonnet-rowan-parser/src/tests.rs +++ b/crates/jrsonnet-rowan-parser/src/tests.rs @@ -224,6 +224,10 @@ unary_not_in_call => r#" std.assertEqual(!false, true) "# + + local_in_binop_rhs => r#" + a + local x = 1; x + "# ); #[test] -- gitstuff