diff --git a/lib/prism/parse_result/newlines.rb b/lib/prism/parse_result/newlines.rb index a04fa78a75..37f64f8ae2 100644 --- a/lib/prism/parse_result/newlines.rb +++ b/lib/prism/parse_result/newlines.rb @@ -63,7 +63,7 @@ module Prism class Node def newline_flag? # :nodoc: - @newline_flag ? true : false + !!defined?(@newline_flag) end def newline_flag!(lines) # :nodoc: diff --git a/prism/prism.c b/prism/prism.c index 6f8d5b005d..ffa5d3ddc4 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21219,6 +21219,11 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t return result; } case PM_LOCAL_VARIABLE_READ_NODE: { + if (pm_token_is_numbered_parameter(node->location.start, node->location.end)) { + PM_PARSER_ERR_FORMAT(parser, node->location.start, node->location.end, PM_ERR_PARAMETER_NUMBERED_RESERVED, node->location.start); + parse_target_implicit_parameter(parser, node); + } + pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); @@ -21337,6 +21342,11 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t return result; } case PM_LOCAL_VARIABLE_READ_NODE: { + if (pm_token_is_numbered_parameter(node->location.start, node->location.end)) { + PM_PARSER_ERR_FORMAT(parser, node->location.start, node->location.end, PM_ERR_PARAMETER_NUMBERED_RESERVED, node->location.start); + parse_target_implicit_parameter(parser, node); + } + pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); @@ -21465,6 +21475,11 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t return result; } case PM_LOCAL_VARIABLE_READ_NODE: { + if (pm_token_is_numbered_parameter(node->location.start, node->location.end)) { + PM_PARSER_ERR_FORMAT(parser, node->location.start, node->location.end, PM_ERR_PARAMETER_NUMBERED_RESERVED, node->location.start); + parse_target_implicit_parameter(parser, node); + } + pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); diff --git a/test/prism/errors/numbered_and_write.txt b/test/prism/errors/numbered_and_write.txt new file mode 100644 index 0000000000..f80b97b2d5 --- /dev/null +++ b/test/prism/errors/numbered_and_write.txt @@ -0,0 +1,3 @@ +tap { _1 &&= 1 } + ^~ _1 is reserved for numbered parameters + diff --git a/test/prism/errors/numbered_operator_write.txt b/test/prism/errors/numbered_operator_write.txt new file mode 100644 index 0000000000..70cd58c811 --- /dev/null +++ b/test/prism/errors/numbered_operator_write.txt @@ -0,0 +1,3 @@ +tap { _1 += 1 } + ^~ _1 is reserved for numbered parameters + diff --git a/test/prism/errors/numbered_or_write.txt b/test/prism/errors/numbered_or_write.txt new file mode 100644 index 0000000000..b27495498d --- /dev/null +++ b/test/prism/errors/numbered_or_write.txt @@ -0,0 +1,3 @@ +tap { _1 ||= 1 } + ^~ _1 is reserved for numbered parameters + diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb index cb2fd48d37..62bbd8458b 100644 --- a/test/prism/errors_test.rb +++ b/test/prism/errors_test.rb @@ -14,7 +14,10 @@ module Prism "targeting_numbered_parameter.txt", "defining_numbered_parameter.txt", "defining_numbered_parameter_2.txt", - "numbered_parameters_in_block_arguments.txt" + "numbered_parameters_in_block_arguments.txt", + "numbered_and_write.txt", + "numbered_or_write.txt", + "numbered_operator_write.txt" ] end