Skip to content

Commit

Permalink
Handle MRHS in ripper translation
Browse files Browse the repository at this point in the history
  • Loading branch information
kddnewton committed Mar 6, 2024
1 parent 81feef4 commit 6088ca1
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 39 deletions.
107 changes: 73 additions & 34 deletions lib/prism/translation/ripper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -585,8 +585,8 @@ def visit_call_node(node)

bounds(node.location)
call = on_aref_field(receiver, arguments)
value = visit_write_value(last_argument)

value = visit(last_argument)
bounds(last_argument.location)
on_assign(call, value)
when :-@, :+@, :~@
Expand Down Expand Up @@ -648,8 +648,7 @@ def visit_call_node(node)
end

if node.name.end_with?("=") && !node.message.end_with?("=") && !node.arguments.nil? && node.block.nil?
bounds(node.arguments.location)
value = visit(node.arguments.arguments.first)
value = visit_write_value(node.arguments.arguments.first)

bounds(node.location)
on_assign(on_field(receiver, call_operator, message), value)
Expand Down Expand Up @@ -726,8 +725,9 @@ def visit_call_operator_write_node(node)

bounds(node.operator_loc)
operator = on_op("#{node.operator}=")
value = visit_write_value(node.value)

value = visit(node.value)
bounds(node.location)
on_opassign(target, operator, value)
end

Expand All @@ -747,8 +747,9 @@ def visit_call_and_write_node(node)

bounds(node.operator_loc)
operator = on_op("&&=")
value = visit_write_value(node.value)

value = visit(node.value)
bounds(node.location)
on_opassign(target, operator, value)
end

Expand All @@ -768,8 +769,9 @@ def visit_call_or_write_node(node)

bounds(node.operator_loc)
operator = on_op("||=")
value = visit_write_value(node.value)

value = visit(node.value)
bounds(node.location)
on_opassign(target, operator, value)
end

Expand Down Expand Up @@ -857,7 +859,7 @@ def visit_class_variable_read_node(node)
def visit_class_variable_write_node(node)
bounds(node.name_loc)
target = on_var_field(on_cvar(node.name.to_s))
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_assign(target, value)
Expand All @@ -871,7 +873,7 @@ def visit_class_variable_operator_write_node(node)

bounds(node.operator_loc)
operator = on_op("#{node.operator}=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -885,7 +887,7 @@ def visit_class_variable_and_write_node(node)

bounds(node.operator_loc)
operator = on_op("&&=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -899,7 +901,7 @@ def visit_class_variable_or_write_node(node)

bounds(node.operator_loc)
operator = on_op("||=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand Down Expand Up @@ -927,7 +929,7 @@ def visit_constant_read_node(node)
def visit_constant_write_node(node)
bounds(node.name_loc)
target = on_var_field(on_const(node.name.to_s))
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_assign(target, value)
Expand All @@ -941,7 +943,7 @@ def visit_constant_operator_write_node(node)

bounds(node.operator_loc)
operator = on_op("#{node.operator}=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -955,7 +957,7 @@ def visit_constant_and_write_node(node)

bounds(node.operator_loc)
operator = on_op("&&=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -969,7 +971,7 @@ def visit_constant_or_write_node(node)

bounds(node.operator_loc)
operator = on_op("||=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand Down Expand Up @@ -1009,7 +1011,7 @@ def visit_constant_path_node(node)
# ^^^^^^^^ ^^^^^^^^
def visit_constant_path_write_node(node)
target = visit_constant_path_write_node_target(node.target)
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_assign(target, value)
Expand Down Expand Up @@ -1042,7 +1044,7 @@ def visit_constant_path_operator_write_node(node)

bounds(node.operator_loc)
operator = on_op("#{node.operator}=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -1056,7 +1058,7 @@ def visit_constant_path_and_write_node(node)

bounds(node.operator_loc)
operator = on_op("&&=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -1070,7 +1072,7 @@ def visit_constant_path_or_write_node(node)

bounds(node.operator_loc)
operator = on_op("||=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand Down Expand Up @@ -1305,7 +1307,7 @@ def visit_global_variable_read_node(node)
def visit_global_variable_write_node(node)
bounds(node.name_loc)
target = on_var_field(on_gvar(node.name.to_s))
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_assign(target, value)
Expand All @@ -1319,7 +1321,7 @@ def visit_global_variable_operator_write_node(node)

bounds(node.operator_loc)
operator = on_op("#{node.operator}=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -1333,7 +1335,7 @@ def visit_global_variable_and_write_node(node)

bounds(node.operator_loc)
operator = on_op("&&=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -1347,7 +1349,7 @@ def visit_global_variable_or_write_node(node)

bounds(node.operator_loc)
operator = on_op("||=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand Down Expand Up @@ -1484,8 +1486,9 @@ def visit_index_operator_write_node(node)

bounds(node.operator_loc)
operator = on_op("#{node.operator}=")
value = visit_write_value(node.value)

value = visit(node.value)
bounds(node.location)
on_opassign(target, operator, value)
end

Expand All @@ -1500,8 +1503,9 @@ def visit_index_and_write_node(node)

bounds(node.operator_loc)
operator = on_op("&&=")
value = visit_write_value(node.value)

value = visit(node.value)
bounds(node.location)
on_opassign(target, operator, value)
end

Expand All @@ -1516,8 +1520,9 @@ def visit_index_or_write_node(node)

bounds(node.operator_loc)
operator = on_op("||=")
value = visit_write_value(node.value)

value = visit(node.value)
bounds(node.location)
on_opassign(target, operator, value)
end

Expand All @@ -1543,7 +1548,7 @@ def visit_instance_variable_read_node(node)
def visit_instance_variable_write_node(node)
bounds(node.name_loc)
target = on_var_field(on_ivar(node.name.to_s))
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_assign(target, value)
Expand All @@ -1557,7 +1562,7 @@ def visit_instance_variable_operator_write_node(node)

bounds(node.operator_loc)
operator = on_op("#{node.operator}=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -1571,7 +1576,7 @@ def visit_instance_variable_and_write_node(node)

bounds(node.operator_loc)
operator = on_op("&&=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -1585,7 +1590,7 @@ def visit_instance_variable_or_write_node(node)

bounds(node.operator_loc)
operator = on_op("||=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand Down Expand Up @@ -1793,7 +1798,7 @@ def visit_local_variable_read_node(node)
def visit_local_variable_write_node(node)
bounds(node.name_loc)
target = on_var_field(on_ident(node.name_loc.slice))
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_assign(target, value)
Expand All @@ -1807,7 +1812,7 @@ def visit_local_variable_operator_write_node(node)

bounds(node.operator_loc)
operator = on_op("#{node.operator}=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -1821,7 +1826,7 @@ def visit_local_variable_and_write_node(node)

bounds(node.operator_loc)
operator = on_op("&&=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand All @@ -1835,7 +1840,7 @@ def visit_local_variable_or_write_node(node)

bounds(node.operator_loc)
operator = on_op("||=")
value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_opassign(target, operator, value)
Expand Down Expand Up @@ -1968,7 +1973,7 @@ def visit_multi_write_node(node)
targets = on_mlhs_paren(targets)
end

value = visit(node.value)
value = visit_write_value(node.value)

bounds(node.location)
on_massign(targets, value)
Expand Down Expand Up @@ -2741,6 +2746,40 @@ def visit_number_node(node)
end
end

# Visit a node that represents a write value. This is used to handle the
# special case of an implicit array that is generated without brackets.
def visit_write_value(node)
if node.is_a?(ArrayNode) && node.opening_loc.nil?
elements = node.elements
length = elements.length

bounds(elements.first.location)
elements.each_with_index.inject(on_args_new) do |args, (element, index)|
arg = visit(element)
bounds(element.location)

if index == length - 1
if element.is_a?(SplatNode)
on_mrhs_add_star(on_mrhs_new_from_args(args), arg)
else
on_mrhs_add(on_mrhs_new_from_args(args), arg)
end
else
case element
when BlockArgumentNode
on_args_add_block(args, arg)
when SplatNode
on_args_add_star(args, arg)
else
on_args_add(args, arg)
end
end
end
else
visit(node)
end
end

# This method is responsible for updating lineno and column information
# to reflect the current node.
#
Expand Down
5 changes: 0 additions & 5 deletions test/prism/ripper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,8 @@ class RipperTest < TestCase
seattlerb/heredoc_squiggly_visually_blank_lines.txt
seattlerb/if_elsif.txt
seattlerb/lambda_do_vs_brace.txt
seattlerb/lasgn_middle_splat.txt
seattlerb/masgn_arg_colon_arg.txt
seattlerb/masgn_colon2.txt
seattlerb/masgn_colon3.txt
seattlerb/masgn_double_paren.txt
seattlerb/masgn_lhs_splat.txt
seattlerb/method_call_assoc_trailing_comma.txt
seattlerb/method_call_trailing_comma.txt
seattlerb/parse_line_dstr_escaped_newline.txt
Expand Down Expand Up @@ -133,7 +129,6 @@ class RipperTest < TestCase
whitequark/if_elsif.txt
whitequark/kwbegin_compstmt.txt
whitequark/lvar_injecting_match.txt
whitequark/masgn.txt
whitequark/masgn_attr.txt
whitequark/masgn_nested.txt
whitequark/masgn_splat.txt
Expand Down

0 comments on commit 6088ca1

Please sign in to comment.