From c989d90754edeefa4e692d2cd8c351394cb217e7 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Thu, 13 Feb 2025 17:54:41 -0800 Subject: merge revision(s) 117d6e145a0270ab8fc9134403519ef13b9ebb24: [Backport #21027] [ruby/prism] Fix `not` receiver `not foo` should be `!foo` `not()` should be `!nil` Fixes [Bug #21027] https://github.com/ruby/prism/commit/871ed4b462 --- lib/prism/translation/ripper.rb | 16 +++++++++++++--- prism/prism.c | 5 +++-- version.h | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb index 018842715b..dce96e01ab 100644 --- a/lib/prism/translation/ripper.rb +++ b/lib/prism/translation/ripper.rb @@ -1045,10 +1045,20 @@ module Prism bounds(node.location) on_unary(node.name, receiver) when :! - receiver = visit(node.receiver) + if node.message == "not" + receiver = + if !node.receiver.is_a?(ParenthesesNode) || !node.receiver.body.nil? + visit(node.receiver) + end - bounds(node.location) - on_unary(node.message == "not" ? :not : :!, receiver) + bounds(node.location) + on_unary(:not, receiver) + else + receiver = visit(node.receiver) + + bounds(node.location) + on_unary(:!, receiver) + end when *BINARY_OPERATORS receiver = visit(node.receiver) value = visit(node.arguments.arguments.first) diff --git a/prism/prism.c b/prism/prism.c index 9d21b25b7c..8c46e31d30 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -19711,11 +19711,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b accept1(parser, PM_TOKEN_NEWLINE); if (accept1(parser, PM_TOKEN_PARENTHESIS_LEFT)) { - arguments.opening_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous); + pm_token_t lparen = parser->previous; if (accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { - arguments.closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous); + receiver = (pm_node_t *) pm_parentheses_node_create(parser, &lparen, NULL, &parser->previous); } else { + arguments.opening_loc = PM_LOCATION_TOKEN_VALUE(&lparen); receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1)); if (!parser->recovering) { diff --git a/version.h b/version.h index ead2182345..82f505e172 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 1 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 9 +#define RUBY_PATCHLEVEL 10 #include "ruby/version.h" #include "ruby/internal/abi.h" -- cgit v1.2.3