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
--- /dev/null
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snap
@@ -0,0 +1,57 @@
+---
+source: crates/jrsonnet-rowan-parser/src/tests.rs
+expression: "{assert 1, a: 1 for a in [1,2,3]}\n"
+---
+SOURCE_FILE@0..34
+  EXPR_OBJECT@0..33
+    OBJ_BODY_COMP@0..33
+      L_BRACE@0..1 "{"
+      ERROR_CUSTOM@1..9
+        MEMBER_ASSERT_STMT@1..9
+          ASSERTION@1..9
+            ASSERT_KW@1..7 "assert"
+            WHITESPACE@7..8 " "
+            LHS_EXPR@8..9
+              EXPR_NUMBER@8..9
+                FLOAT@8..9 "1"
+      COMMA@9..10 ","
+      WHITESPACE@10..11 " "
+      MEMBER_FIELD_NORMAL@11..15
+        FIELD_NAME_FIXED@11..12
+          NAME@11..12
+            IDENT@11..12 "a"
+        COLON@12..13 ":"
+        WHITESPACE@13..14 " "
+        EXPR_NUMBER@14..15
+          FLOAT@14..15 "1"
+      WHITESPACE@15..16 " "
+      FOR_SPEC@16..32
+        FOR_KW@16..19 "for"
+        WHITESPACE@19..20 " "
+        NAME@20..21
+          IDENT@20..21 "a"
+        WHITESPACE@21..22 " "
+        IN_KW@22..24 "in"
+        WHITESPACE@24..25 " "
+        EXPR_ARRAY@25..32
+          L_BRACK@25..26 "["
+          EXPR_NUMBER@26..27
+            FLOAT@26..27 "1"
+          COMMA@27..28 ","
+          EXPR_NUMBER@28..29
+            FLOAT@28..29 "2"
+          COMMA@29..30 ","
+          EXPR_NUMBER@30..31
+            FLOAT@30..31 "3"
+          R_BRACK@31..32 "]"
+      R_BRACE@32..33 "}"
+  WHITESPACE@33..34 "\n"
+===
+LocatedSyntaxError { error: Custom { error: "asserts can't be used in object comprehensions" }, range: 1..9 }
+===
+  x syntax error
+   ,----
+ 1 | {assert 1, a: 1 for a in [1,2,3]}
+   :  ^^^^|^^^
+   :      `-- asserts can't be used in object comprehensions
+   `----
modifiedcrates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth
212 {a:1, b:1, for a in [1, 2, 3], c:1}212 {a:1, b:1, for a in [1, 2, 3], c:1}
213 "#213 "#
214
215 obj_compspec_incompatible_with_asserts => r#"
216 {assert 1, a: 1 for a in [1,2,3]}
217 "#
214218
215 local_method => r#"219 local_method => r#"
216 local220 local