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

difftreelog

fix(rowan-parser) forbid assert in objcomp

Yaroslav Bolyukin2023-09-04parent: #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

no changes

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,