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.snapdiffbeforeafterboth1---2source: crates/jrsonnet-rowan-parser/src/tests.rs3expression: "{assert 1, a: 1 for a in [1,2,3]}\n"4---5SOURCE_FILE@0..346 EXPR_OBJECT@0..337 OBJ_BODY_COMP@0..338 L_BRACE@0..1 "{"9 ERROR_CUSTOM@1..910 MEMBER_ASSERT_STMT@1..911 ASSERTION@1..912 ASSERT_KW@1..7 "assert"13 WHITESPACE@7..8 " "14 LHS_EXPR@8..915 EXPR_NUMBER@8..916 FLOAT@8..9 "1"17 COMMA@9..10 ","18 WHITESPACE@10..11 " "19 MEMBER_FIELD_NORMAL@11..1520 FIELD_NAME_FIXED@11..1221 NAME@11..1222 IDENT@11..12 "a"23 COLON@12..13 ":"24 WHITESPACE@13..14 " "25 EXPR_NUMBER@14..1526 FLOAT@14..15 "1"27 WHITESPACE@15..16 " "28 FOR_SPEC@16..3229 FOR_KW@16..19 "for"30 WHITESPACE@19..20 " "31 NAME@20..2132 IDENT@20..21 "a"33 WHITESPACE@21..22 " "34 IN_KW@22..24 "in"35 WHITESPACE@24..25 " "36 EXPR_ARRAY@25..3237 L_BRACK@25..26 "["38 EXPR_NUMBER@26..2739 FLOAT@26..27 "1"40 COMMA@27..28 ","41 EXPR_NUMBER@28..2942 FLOAT@28..29 "2"43 COMMA@29..30 ","44 EXPR_NUMBER@30..3145 FLOAT@30..31 "3"46 R_BRACK@31..32 "]"47 R_BRACE@32..33 "}"48 WHITESPACE@33..34 "\n"49===50LocatedSyntaxError { error: Custom { error: "asserts can't be used in object comprehensions" }, range: 1..9 }51===52 x syntax error53 ,----54 1 | {assert 1, a: 1 for a in [1,2,3]}55 : ^^^^|^^^56 : `-- asserts can't be used in object comprehensions57 `----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,