diff options
| author | Takashi Kokubun <takashikkbn@gmail.com> | 2025-02-13 17:54:41 -0800 |
|---|---|---|
| committer | Takashi Kokubun <takashikkbn@gmail.com> | 2025-02-13 17:54:41 -0800 |
| commit | c989d90754edeefa4e692d2cd8c351394cb217e7 (patch) | |
| tree | f904b64042d0367f50338ded2aa53dbb5aae549b | |
| parent | 9240f01b1fbe5ea4f6a2017d35f8f605f84f0039 (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.rb | 16 | ||||
| -rw-r--r-- | prism/prism.c | 5 | ||||
| -rw-r--r-- | 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) { @@ -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" |
