Skip to content

Commit ccc746f

Browse files
committed
Disallow dynamic patterns in labels at top level followed by pipes
1 parent fb25917 commit ccc746f

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/prism.c

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17274,6 +17274,9 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm
1727417274
case PM_CASE_PRIMITIVE: {
1727517275
pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_MAX, false, true, diag_id, (uint16_t) (depth + 1));
1727617276

17277+
// If we found a label, we need to immediately return to the caller.
17278+
if (pm_symbol_node_label_p(node)) return node;
17279+
1727717280
// Now that we have a primitive, we need to check if it's part of a range.
1727817281
if (accept2(parser, PM_TOKEN_DOT_DOT, PM_TOKEN_DOT_DOT_DOT)) {
1727917282
pm_token_t operator = parser->previous;
@@ -17391,10 +17394,10 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm
1739117394
* assignment.
1739217395
*/
1739317396
static pm_node_t *
17394-
parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_diagnostic_id_t diag_id, uint16_t depth) {
17395-
pm_node_t *node = NULL;
17397+
parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node_t *first_node, pm_diagnostic_id_t diag_id, uint16_t depth) {
17398+
pm_node_t *node = first_node;
1739617399

17397-
do {
17400+
while ((node == NULL) || accept1(parser, PM_TOKEN_PIPE)) {
1739817401
pm_token_t operator = parser->previous;
1739917402

1740017403
switch (parser->current.type) {
@@ -17447,7 +17450,7 @@ parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, p
1744717450
break;
1744817451
}
1744917452
}
17450-
} while (accept1(parser, PM_TOKEN_PIPE));
17453+
}
1745117454

1745217455
// If we have an =>, then we are assigning this pattern to a variable.
1745317456
// In this case we should create an assignment node.
@@ -17508,6 +17511,24 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag
1750817511

1750917512
return node;
1751017513
}
17514+
case PM_TOKEN_STRING_BEGIN: {
17515+
// We need special handling for string beginnings because they could
17516+
// be dynamic symbols leading to hash patterns.
17517+
node = parse_pattern_primitive(parser, captures, diag_id, (uint16_t) (depth + 1));
17518+
17519+
if (pm_symbol_node_label_p(node)) {
17520+
node = (pm_node_t *) parse_pattern_hash(parser, captures, node, (uint16_t) (depth + 1));
17521+
17522+
if (!(flags & PM_PARSE_PATTERN_TOP)) {
17523+
pm_parser_err_node(parser, node, PM_ERR_PATTERN_HASH_IMPLICIT);
17524+
}
17525+
17526+
return node;
17527+
}
17528+
17529+
node = parse_pattern_primitives(parser, captures, node, diag_id, (uint16_t) (depth + 1));
17530+
break;
17531+
}
1751117532
case PM_TOKEN_USTAR: {
1751217533
if (flags & (PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI)) {
1751317534
parser_lex(parser);
@@ -17518,7 +17539,7 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag
1751817539
}
1751917540
/* fallthrough */
1752017541
default:
17521-
node = parse_pattern_primitives(parser, captures, diag_id, (uint16_t) (depth + 1));
17542+
node = parse_pattern_primitives(parser, captures, NULL, diag_id, (uint16_t) (depth + 1));
1752217543
break;
1752317544
}
1752417545

@@ -17556,7 +17577,7 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag
1755617577

1755717578
trailing_rest = true;
1755817579
} else {
17559-
node = parse_pattern_primitives(parser, captures, PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1));
17580+
node = parse_pattern_primitives(parser, captures, NULL, PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1));
1756017581
}
1756117582

1756217583
pm_node_list_append(&nodes, node);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:a => 'a': | 1
2+
^ expected a pattern expression after the key
3+

0 commit comments

Comments
 (0)