Skip to content

Commit 117d6e1

Browse files
committed
[ruby/prism] Fix not receiver
`not foo` should be `!foo` `not()` should be `!nil` Fixes [Bug #21027] ruby/prism@871ed4b462
1 parent 9c962ea commit 117d6e1

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

lib/prism/translation/ripper.rb

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,10 +1045,20 @@ def visit_call_node(node)
10451045
bounds(node.location)
10461046
on_unary(node.name, receiver)
10471047
when :!
1048-
receiver = visit(node.receiver)
1048+
if node.message == "not"
1049+
receiver =
1050+
if !node.receiver.is_a?(ParenthesesNode) || !node.receiver.body.nil?
1051+
visit(node.receiver)
1052+
end
10491053

1050-
bounds(node.location)
1051-
on_unary(node.message == "not" ? :not : :!, receiver)
1054+
bounds(node.location)
1055+
on_unary(:not, receiver)
1056+
else
1057+
receiver = visit(node.receiver)
1058+
1059+
bounds(node.location)
1060+
on_unary(:!, receiver)
1061+
end
10521062
when *BINARY_OPERATORS
10531063
receiver = visit(node.receiver)
10541064
value = visit(node.arguments.arguments.first)

prism/prism.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19719,11 +19719,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
1971919719
accept1(parser, PM_TOKEN_NEWLINE);
1972019720

1972119721
if (accept1(parser, PM_TOKEN_PARENTHESIS_LEFT)) {
19722-
arguments.opening_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous);
19722+
pm_token_t lparen = parser->previous;
1972319723

1972419724
if (accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) {
19725-
arguments.closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous);
19725+
receiver = (pm_node_t *) pm_parentheses_node_create(parser, &lparen, NULL, &parser->previous);
1972619726
} else {
19727+
arguments.opening_loc = PM_LOCATION_TOKEN_VALUE(&lparen);
1972719728
receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
1972819729

1972919730
if (!parser->recovering) {

0 commit comments

Comments
 (0)