Skip to content

Commit 871ed4b

Browse files
committed
Fix not receiver
`not foo` should be `!foo` `not()` should be `!nil` Fixes [Bug #21027]
1 parent 2a2a1eb commit 871ed4b

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
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)

src/prism.c

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

1971419714
if (accept1(parser, PM_TOKEN_PARENTHESIS_LEFT)) {
19715-
arguments.opening_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous);
19715+
pm_token_t lparen = parser->previous;
1971619716

1971719717
if (accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) {
19718-
arguments.closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous);
19718+
receiver = (pm_node_t *) pm_parentheses_node_create(parser, &lparen, NULL, &parser->previous);
1971919719
} else {
19720+
arguments.opening_loc = PM_LOCATION_TOKEN_VALUE(&lparen);
1972019721
receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
1972119722

1972219723
if (!parser->recovering) {

test/prism/snapshots/whitequark/not.txt

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)