From a6892a95138f8383f72eccaf7e0011eb1ea71a25 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Wed, 14 Dec 2022 01:05:12 +0000 Subject: [PATCH] fix(rowan-parser): forbid assert in objcomp --- --- 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); --- /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 + `---- --- 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, -- gitstuff