Skip to content

Commit

Permalink
Merge pull request #3243 from ydah/reject-invalid-operator
Browse files Browse the repository at this point in the history
Reject invalid operator after match predicate or after match required
  • Loading branch information
tenderlove authored Dec 2, 2024
2 parents 9ccb069 + d0d9699 commit ec5c11c
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/prism.c
Original file line number Diff line number Diff line change
Expand Up @@ -21407,6 +21407,33 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
case PM_TOKEN_STAR:
case PM_TOKEN_STAR_STAR: {
parser_lex(parser);
pm_token_t operator = parser->previous;
switch (PM_NODE_TYPE(node)) {
case PM_RESCUE_MODIFIER_NODE: {
pm_rescue_modifier_node_t *cast = (pm_rescue_modifier_node_t *) node;
if (PM_NODE_TYPE_P(cast->rescue_expression, PM_MATCH_PREDICATE_NODE) || PM_NODE_TYPE_P(cast->rescue_expression, PM_MATCH_REQUIRED_NODE)) {
PM_PARSER_ERR_TOKEN_FORMAT(parser, operator, PM_ERR_EXPECT_EOL_AFTER_STATEMENT, pm_token_type_human(operator.type));
}
break;
}
case PM_AND_NODE: {
pm_and_node_t *cast = (pm_and_node_t *) node;
if (PM_NODE_TYPE_P(cast->right, PM_MATCH_PREDICATE_NODE) || PM_NODE_TYPE_P(cast->right, PM_MATCH_REQUIRED_NODE)) {
PM_PARSER_ERR_TOKEN_FORMAT(parser, operator, PM_ERR_EXPECT_EOL_AFTER_STATEMENT, pm_token_type_human(operator.type));
}
break;
}
case PM_OR_NODE: {
pm_or_node_t *cast = (pm_or_node_t *) node;
if (PM_NODE_TYPE_P(cast->right, PM_MATCH_PREDICATE_NODE) || PM_NODE_TYPE_P(cast->right, PM_MATCH_REQUIRED_NODE)) {
PM_PARSER_ERR_TOKEN_FORMAT(parser, operator, PM_ERR_EXPECT_EOL_AFTER_STATEMENT, pm_token_type_human(operator.type));
}
break;
}
default:
break;
}

pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, 0);
}
Expand Down
3 changes: 3 additions & 0 deletions test/prism/errors/match_predicate_after_and_with_opreator.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1 and 2 in 3 % 4
^ unexpected '%', expecting end-of-input

3 changes: 3 additions & 0 deletions test/prism/errors/match_predicate_after_or_with_opreator.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1 or 2 in 3 + 4
^ unexpected '+', expecting end-of-input

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1 rescue 2 in 3 << 4
^~ unexpected <<, expecting end-of-input

3 changes: 3 additions & 0 deletions test/prism/errors/match_required_after_and_with_opreator.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1 and 2 => 3 - 4
^ unexpected '-', expecting end-of-input

3 changes: 3 additions & 0 deletions test/prism/errors/match_required_after_or_with_opreator.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1 or 2 => 3 ^ 4
^ unexpected '^', expecting end-of-input

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1 rescue 2 => 3 ** 4
^~ unexpected '**', expecting end-of-input

0 comments on commit ec5c11c

Please sign in to comment.