summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2025-02-13 17:54:41 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2025-02-13 17:54:41 -0800
commitc989d90754edeefa4e692d2cd8c351394cb217e7 (patch)
treef904b64042d0367f50338ded2aa53dbb5aae549b
parent9240f01b1fbe5ea4f6a2017d35f8f605f84f0039 (diff)
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
-rw-r--r--lib/prism/translation/ripper.rb16
-rw-r--r--prism/prism.c5
-rw-r--r--version.h2
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"