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.snapdiffbeforeafterbothno changes
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,