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
408408
409 let mut elems = 0;409 let mut elems = 0;
410 let mut compspecs = Vec::new();410 let mut compspecs = Vec::new();
411 let mut asserts = Vec::new();
411 loop {412 loop {
412 if p.at(T!['}']) {413 if p.at(T!['}']) {
413 p.bump();414 p.bump();
430 let m = p.start();431 let m = p.start();
431 if p.at(T![local]) {432 if p.at(T![local]) {
432 obj_local(p);433 obj_local(p);
433 m.complete(p, MEMBER_BIND_STMT)434 m.complete(p, MEMBER_BIND_STMT);
434 } else if p.at(T![assert]) {435 } else if p.at(T![assert]) {
435 assertion(p);436 assertion(p);
436 m.complete(p, MEMBER_ASSERT_STMT)437 asserts.push(m.complete(p, MEMBER_ASSERT_STMT));
437 } else {438 } else {
438 field_name(p);439 field_name(p);
439 if p.at(T![+]) {440 if p.at(T![+]) {
455 expr(p);456 expr(p);
456 false457 false
457 };458 };
459 elems += 1;
458460
459 if params {461 if params {
460 m.complete(p, MEMBER_FIELD_METHOD)462 m.complete(p, MEMBER_FIELD_METHOD)
461 } else {463 } else {
462 m.complete(p, MEMBER_FIELD_NORMAL)464 m.complete(p, MEMBER_FIELD_NORMAL)
463 }465 };
464 };466 };
465 elems += 1;
466 while p.at_ts(COMPSPEC) {467 while p.at_ts(COMPSPEC) {
467 compspecs.push(compspec(p));468 compspecs.push(compspec(p));
468 }469 }
482 }483 }
483 m.complete(p, OBJ_BODY_MEMBER_LIST);484 m.complete(p, OBJ_BODY_MEMBER_LIST);
484 } else if !compspecs.is_empty() {485 } else if !compspecs.is_empty() {
486 for errored in asserts {
487 errored.wrap_error(p, "asserts can't be used in object comprehensions");
488 }
485 m.complete(p, OBJ_BODY_COMP);489 m.complete(p, OBJ_BODY_COMP);
486 } else {490 } else {
487 m.complete(p, OBJ_BODY_MEMBER_LIST);491 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
--- 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,