diff options
-rw-r--r-- | lib/prism/translation/ripper.rb | 16 | ||||
-rw-r--r-- | prism/prism.c | 5 |
2 files changed, 16 insertions, 5 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 0e8c480f6c..e2654be228 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -19719,11 +19719,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) { |