summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaldun Bayhantopcu <[email protected]>2023-09-28 11:45:35 +0200
committergit <[email protected]>2023-09-28 13:32:02 +0000
commit834560a923dcc4aa6685fb7fd7aecae1808217f1 ()
tree1c47fe03326eb8f3b2f3c7586e53e7c29d2911ae
parent7799fe90da49958af0d33d18c82f12012610f32a (diff)
[ruby/prism] Check whether the predicate is closed for conditionals
https://.com/ruby/prism/commit/bf43006d0a
-rw-r--r--prism/prism.c20
-rw-r--r--test/prism/errors_test.rb5
2 files changed, 13 insertions, 12 deletions
@@ -9843,12 +9843,10 @@ parse_arguments_list(pm_parser_t *parser, pm_arguments_t *arguments, bool accept
}
static inline pm_node_t *
-parse_conditional(pm_parser_t *parser, pm_context_t context) {
- pm_token_t keyword = parser->previous;
-
context_push(parser, PM_CONTEXT_PREDICATE);
pm_diagnostic_id_t error_id = context == PM_CONTEXT_IF ? PM_ERR_CONDITIONAL_IF_PREDICATE : PM_ERR_CONDITIONAL_UNLESS_PREDICATE;
- pm_node_t *predicate = parse_expression(parser, PM_BINDING_POWER_MODIFIER, error_id);
// Predicates are closed by a term, a "then", or a term and then a "then".
bool predicate_closed = accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON);
@@ -9858,6 +9856,13 @@ parse_conditional(pm_parser_t *parser, pm_context_t context) {
}
context_pop(parser);
pm_statements_node_t *statements = NULL;
if (!match3(parser, PM_TOKEN_KEYWORD_ELSIF, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) {
@@ -9889,12 +9894,7 @@ parse_conditional(pm_parser_t *parser, pm_context_t context) {
if (context == PM_CONTEXT_IF) {
while (accept1(parser, PM_TOKEN_KEYWORD_ELSIF)) {
pm_token_t elsif_keyword = parser->previous;
- pm_node_t *predicate = parse_expression(parser, PM_BINDING_POWER_MODIFIER, PM_ERR_CONDITIONAL_ELSIF_PREDICATE);
-
- // Predicates are closed by a term, a "then", or a term and then a "then".
- accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON);
- accept1(parser, PM_TOKEN_KEYWORD_THEN);
-
pm_accepts_block_stack_push(parser, true);
pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_ELSIF);
pm_accepts_block_stack_pop(parser);
@@ -1317,10 +1317,11 @@ module Prism
end
def test_conditional_predicate_closed
- source = "if 0 0; end\nunless 0 0; end"
assert_errors expression(source), source, [
["Expected `then` or `;` or '\n" + "'", 5..6],
- ["Expected `then` or `;` or '\n" + "'", 21..22],
]
end