difftreelog
fix(rowan-parser) forbid assert in objcomp
in: master
3 files changed
crates/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);
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.rsdiffbeforeafterboth212 {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 "#214215 obj_compspec_incompatible_with_asserts => r#"216 {assert 1, a: 1 for a in [1,2,3]}217 "#214218215 local_method => r#"219 local_method => r#"216 local220 local