difftreelog
fix(rowan-parser) forbid assert in objcomp
in: master
3 files changed
crates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth408408409 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 false457 };458 };459 elems += 1;458460459 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);crates/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
+ `----
crates/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,