git.delta.rocks / jrsonnet / refs/commits / a6892a95138f

difftreelog

fix(rowan-parser) forbid assert in objcomp

Yaroslav Bolyukin2022-12-14parent: #cf173f6.patch.diff
in: master

3 files changed

modifiedcrates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/parser.rs
+++ b/crates/jrsonnet-rowan-parser/src/parser.rs
@@ -408,6 +408,7 @@
 
 	let mut elems = 0;
 	let mut compspecs = Vec::new();
+	let mut asserts = Vec::new();
 	loop {
 		if p.at(T!['}']) {
 			p.bump();
@@ -430,10 +431,10 @@
 		let m = p.start();
 		if p.at(T![local]) {
 			obj_local(p);
-			m.complete(p, MEMBER_BIND_STMT)
+			m.complete(p, MEMBER_BIND_STMT);
 		} else if p.at(T![assert]) {
 			assertion(p);
-			m.complete(p, MEMBER_ASSERT_STMT)
+			asserts.push(m.complete(p, MEMBER_ASSERT_STMT));
 		} else {
 			field_name(p);
 			if p.at(T![+]) {
@@ -455,14 +456,14 @@
 				expr(p);
 				false
 			};
+			elems += 1;
 
 			if params {
 				m.complete(p, MEMBER_FIELD_METHOD)
 			} else {
 				m.complete(p, MEMBER_FIELD_NORMAL)
-			}
+			};
 		};
-		elems += 1;
 		while p.at_ts(COMPSPEC) {
 			compspecs.push(compspec(p));
 		}
@@ -482,6 +483,9 @@
 		}
 		m.complete(p, OBJ_BODY_MEMBER_LIST);
 	} else if !compspecs.is_empty() {
+		for errored in asserts {
+			errored.wrap_error(p, "asserts can't be used in object comprehensions");
+		}
 		m.complete(p, OBJ_BODY_COMP);
 	} else {
 		m.complete(p, OBJ_BODY_MEMBER_LIST);
addedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snapdiffbeforeafterboth
after · crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snap
1---2source: crates/jrsonnet-rowan-parser/src/tests.rs3expression: "{assert 1, a: 1 for a in [1,2,3]}\n"4---5SOURCE_FILE@0..346  EXPR_OBJECT@0..337    OBJ_BODY_COMP@0..338      L_BRACE@0..1 "{"9      ERROR_CUSTOM@1..910        MEMBER_ASSERT_STMT@1..911          ASSERTION@1..912            ASSERT_KW@1..7 "assert"13            WHITESPACE@7..8 " "14            LHS_EXPR@8..915              EXPR_NUMBER@8..916                FLOAT@8..9 "1"17      COMMA@9..10 ","18      WHITESPACE@10..11 " "19      MEMBER_FIELD_NORMAL@11..1520        FIELD_NAME_FIXED@11..1221          NAME@11..1222            IDENT@11..12 "a"23        COLON@12..13 ":"24        WHITESPACE@13..14 " "25        EXPR_NUMBER@14..1526          FLOAT@14..15 "1"27      WHITESPACE@15..16 " "28      FOR_SPEC@16..3229        FOR_KW@16..19 "for"30        WHITESPACE@19..20 " "31        NAME@20..2132          IDENT@20..21 "a"33        WHITESPACE@21..22 " "34        IN_KW@22..24 "in"35        WHITESPACE@24..25 " "36        EXPR_ARRAY@25..3237          L_BRACK@25..26 "["38          EXPR_NUMBER@26..2739            FLOAT@26..27 "1"40          COMMA@27..28 ","41          EXPR_NUMBER@28..2942            FLOAT@28..29 "2"43          COMMA@29..30 ","44          EXPR_NUMBER@30..3145            FLOAT@30..31 "3"46          R_BRACK@31..32 "]"47      R_BRACE@32..33 "}"48  WHITESPACE@33..34 "\n"49===50LocatedSyntaxError { error: Custom { error: "asserts can't be used in object comprehensions" }, range: 1..9 }51===52  x syntax error53   ,----54 1 | {assert 1, a: 1 for a in [1,2,3]}55   :  ^^^^|^^^56   :      `-- asserts can't be used in object comprehensions57   `----
modifiedcrates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/tests.rs
+++ b/crates/jrsonnet-rowan-parser/src/tests.rs
@@ -212,6 +212,10 @@
 		{a:1, b:1, for a in [1, 2, 3], c:1}
 	"#
 
+	obj_compspec_incompatible_with_asserts => r#"
+		{assert 1, a: 1 for a in [1,2,3]}
+	"#
+
 	local_method => r#"
 		local
 			a(x) = x,