Skip to content

Commit 9a883a4

Browse files
committed
Implement even more ripper visitor methods
1 parent 336bd72 commit 9a883a4

File tree

1 file changed

+104
-15
lines changed

1 file changed

+104
-15
lines changed

lib/prism/translation/ripper.rb

Lines changed: 104 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -849,13 +849,29 @@ def visit_global_variable_operator_write_node(node)
849849
# $foo &&= bar
850850
# ^^^^^^^^^^^^
851851
def visit_global_variable_and_write_node(node)
852-
raise NoMethodError, __method__
852+
bounds(node.name_loc)
853+
target = on_var_field(on_gvar(node.name.to_s))
854+
855+
bounds(node.operator_loc)
856+
operator = on_op("&&=")
857+
value = visit(node.value)
858+
859+
bounds(node.location)
860+
on_opassign(target, operator, value)
853861
end
854862

855863
# $foo ||= bar
856864
# ^^^^^^^^^^^^
857865
def visit_global_variable_or_write_node(node)
858-
raise NoMethodError, __method__
866+
bounds(node.name_loc)
867+
target = on_var_field(on_gvar(node.name.to_s))
868+
869+
bounds(node.operator_loc)
870+
operator = on_op("||=")
871+
value = visit(node.value)
872+
873+
bounds(node.location)
874+
on_opassign(target, operator, value)
859875
end
860876

861877
# $foo, = bar
@@ -939,31 +955,61 @@ def visit_index_target_node(node)
939955
# @foo
940956
# ^^^^
941957
def visit_instance_variable_read_node(node)
942-
raise NoMethodError, __method__
958+
bounds(node.location)
959+
on_var_ref(on_ivar(node.name.to_s))
943960
end
944961

945962
# @foo = 1
946963
# ^^^^^^^^
947964
def visit_instance_variable_write_node(node)
948-
raise NoMethodError, __method__
965+
bounds(node.name_loc)
966+
target = on_var_field(on_ivar(node.name.to_s))
967+
value = visit(node.value)
968+
969+
bounds(node.location)
970+
on_assign(target, value)
949971
end
950972

951973
# @foo += bar
952974
# ^^^^^^^^^^^
953975
def visit_instance_variable_operator_write_node(node)
954-
raise NoMethodError, __method__
976+
bounds(node.name_loc)
977+
target = on_var_field(on_ivar(node.name.to_s))
978+
979+
bounds(node.operator_loc)
980+
operator = on_op("#{node.operator}=")
981+
value = visit(node.value)
982+
983+
bounds(node.location)
984+
on_opassign(target, operator, value)
955985
end
956986

957987
# @foo &&= bar
958988
# ^^^^^^^^^^^^
959989
def visit_instance_variable_and_write_node(node)
960-
raise NoMethodError, __method__
990+
bounds(node.name_loc)
991+
target = on_var_field(on_ivar(node.name.to_s))
992+
993+
bounds(node.operator_loc)
994+
operator = on_op("&&=")
995+
value = visit(node.value)
996+
997+
bounds(node.location)
998+
on_opassign(target, operator, value)
961999
end
9621000

9631001
# @foo ||= bar
9641002
# ^^^^^^^^^^^^
9651003
def visit_instance_variable_or_write_node(node)
966-
raise NoMethodError, __method__
1004+
bounds(node.name_loc)
1005+
target = on_var_field(on_ivar(node.name.to_s))
1006+
1007+
bounds(node.operator_loc)
1008+
operator = on_op("||=")
1009+
value = visit(node.value)
1010+
1011+
bounds(node.location)
1012+
on_opassign(target, operator, value)
9671013
end
9681014

9691015
# @foo, = bar
@@ -1193,25 +1239,27 @@ def visit_next_node(node)
11931239
# nil
11941240
# ^^^
11951241
def visit_nil_node(node)
1196-
raise NoMethodError, __method__
1242+
bounds(node.location)
1243+
on_var_ref(on_kw("nil"))
11971244
end
11981245

11991246
# def foo(**nil); end
12001247
# ^^^^^
12011248
def visit_no_keywords_parameter_node(node)
1202-
raise NoMethodError, __method__
1249+
:nil
12031250
end
12041251

12051252
# -> { _1 + _2 }
12061253
# ^^^^^^^^^^^^^^
1207-
def visit_number_nodeed_parameters_node(node)
1254+
def visit_numbered_parameters_node(node)
12081255
raise NoMethodError, __method__
12091256
end
12101257

12111258
# $1
12121259
# ^^
1213-
def visit_number_nodeed_reference_read_node(node)
1214-
raise NoMethodError, __method__
1260+
def visit_numbered_reference_read_node(node)
1261+
bounds(node.location)
1262+
on_backref(node.slice)
12151263
end
12161264

12171265
# def foo(bar: baz); end
@@ -1255,6 +1303,7 @@ def visit_parameters_node(node)
12551303
keyword_rest = visit(node.keyword_rest)
12561304
block = visit(node.block)
12571305

1306+
bounds(node.location)
12581307
on_params(requireds, optionals, rest, posts, keywords, keyword_rest, block)
12591308
end
12601309

@@ -1375,7 +1424,11 @@ def visit_required_parameter_node(node)
13751424
# foo rescue bar
13761425
# ^^^^^^^^^^^^^^
13771426
def visit_rescue_modifier_node(node)
1378-
raise NoMethodError, __method__
1427+
expression = visit(node.expression)
1428+
rescue_expression = visit(node.rescue_expression)
1429+
1430+
bounds(node.location)
1431+
on_rescue_mod(expression, rescue_expression)
13791432
end
13801433

13811434
# begin; rescue; end
@@ -1586,7 +1639,25 @@ def visit_unless_node(node)
15861639
# bar until foo
15871640
# ^^^^^^^^^^^^^
15881641
def visit_until_node(node)
1589-
raise NoMethodError, __method__
1642+
if node.statements.nil? || (node.keyword_loc.start_offset < node.statements.location.start_offset)
1643+
predicate = visit(node.predicate)
1644+
statements =
1645+
if node.statements.nil?
1646+
bounds(node.location)
1647+
on_stmts_add(on_stmts_new, on_void_stmt)
1648+
else
1649+
visit(node.statements)
1650+
end
1651+
1652+
bounds(node.location)
1653+
on_until(predicate, statements)
1654+
else
1655+
statements = visit(node.statements.body.first)
1656+
predicate = visit(node.predicate)
1657+
1658+
bounds(node.location)
1659+
on_until_mod(predicate, statements)
1660+
end
15901661
end
15911662

15921663
# case foo; when bar; end
@@ -1601,7 +1672,25 @@ def visit_when_node(node)
16011672
# bar while foo
16021673
# ^^^^^^^^^^^^^
16031674
def visit_while_node(node)
1604-
raise NoMethodError, __method__
1675+
if node.statements.nil? || (node.keyword_loc.start_offset < node.statements.location.start_offset)
1676+
predicate = visit(node.predicate)
1677+
statements =
1678+
if node.statements.nil?
1679+
bounds(node.location)
1680+
on_stmts_add(on_stmts_new, on_void_stmt)
1681+
else
1682+
visit(node.statements)
1683+
end
1684+
1685+
bounds(node.location)
1686+
on_while(predicate, statements)
1687+
else
1688+
statements = visit(node.statements.body.first)
1689+
predicate = visit(node.predicate)
1690+
1691+
bounds(node.location)
1692+
on_while_mod(predicate, statements)
1693+
end
16051694
end
16061695

16071696
# `foo`

0 commit comments

Comments
 (0)