summaryrefslogtreecommitdiff
path: root/lib/prism/translation/ripper.rb
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-05 01:00:22 -0500
committergit <svn-admin@ruby-lang.org>2024-03-06 16:42:37 +0000
commita035f63daa06b52c2eaae14e1b546ede1fc00411 (patch)
tree8bbdc7325892d9fd5089b0b0b6b02361ae0df71a /lib/prism/translation/ripper.rb
parent069568dbfcff5bc13551b14e864c0a4b2bd90811 (diff)
[ruby/prism] Implement even more ripper visitor methods
https://github.com/ruby/prism/commit/9a883a474a
Diffstat (limited to 'lib/prism/translation/ripper.rb')
-rw-r--r--lib/prism/translation/ripper.rb119
1 files changed, 104 insertions, 15 deletions
diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb
index 88ce546fdc..dc2b49d889 100644
--- a/lib/prism/translation/ripper.rb
+++ b/lib/prism/translation/ripper.rb
@@ -849,13 +849,29 @@ module Prism
# $foo &&= bar
# ^^^^^^^^^^^^
def visit_global_variable_and_write_node(node)
- raise NoMethodError, __method__
+ bounds(node.name_loc)
+ target = on_var_field(on_gvar(node.name.to_s))
+
+ bounds(node.operator_loc)
+ operator = on_op("&&=")
+ value = visit(node.value)
+
+ bounds(node.location)
+ on_opassign(target, operator, value)
end
# $foo ||= bar
# ^^^^^^^^^^^^
def visit_global_variable_or_write_node(node)
- raise NoMethodError, __method__
+ bounds(node.name_loc)
+ target = on_var_field(on_gvar(node.name.to_s))
+
+ bounds(node.operator_loc)
+ operator = on_op("||=")
+ value = visit(node.value)
+
+ bounds(node.location)
+ on_opassign(target, operator, value)
end
# $foo, = bar
@@ -939,31 +955,61 @@ module Prism
# @foo
# ^^^^
def visit_instance_variable_read_node(node)
- raise NoMethodError, __method__
+ bounds(node.location)
+ on_var_ref(on_ivar(node.name.to_s))
end
# @foo = 1
# ^^^^^^^^
def visit_instance_variable_write_node(node)
- raise NoMethodError, __method__
+ bounds(node.name_loc)
+ target = on_var_field(on_ivar(node.name.to_s))
+ value = visit(node.value)
+
+ bounds(node.location)
+ on_assign(target, value)
end
# @foo += bar
# ^^^^^^^^^^^
def visit_instance_variable_operator_write_node(node)
- raise NoMethodError, __method__
+ bounds(node.name_loc)
+ target = on_var_field(on_ivar(node.name.to_s))
+
+ bounds(node.operator_loc)
+ operator = on_op("#{node.operator}=")
+ value = visit(node.value)
+
+ bounds(node.location)
+ on_opassign(target, operator, value)
end
# @foo &&= bar
# ^^^^^^^^^^^^
def visit_instance_variable_and_write_node(node)
- raise NoMethodError, __method__
+ bounds(node.name_loc)
+ target = on_var_field(on_ivar(node.name.to_s))
+
+ bounds(node.operator_loc)
+ operator = on_op("&&=")
+ value = visit(node.value)
+
+ bounds(node.location)
+ on_opassign(target, operator, value)
end
# @foo ||= bar
# ^^^^^^^^^^^^
def visit_instance_variable_or_write_node(node)
- raise NoMethodError, __method__
+ bounds(node.name_loc)
+ target = on_var_field(on_ivar(node.name.to_s))
+
+ bounds(node.operator_loc)
+ operator = on_op("||=")
+ value = visit(node.value)
+
+ bounds(node.location)
+ on_opassign(target, operator, value)
end
# @foo, = bar
@@ -1193,25 +1239,27 @@ module Prism
# nil
# ^^^
def visit_nil_node(node)
- raise NoMethodError, __method__
+ bounds(node.location)
+ on_var_ref(on_kw("nil"))
end
# def foo(**nil); end
# ^^^^^
def visit_no_keywords_parameter_node(node)
- raise NoMethodError, __method__
+ :nil
end
# -> { _1 + _2 }
# ^^^^^^^^^^^^^^
- def visit_number_nodeed_parameters_node(node)
+ def visit_numbered_parameters_node(node)
raise NoMethodError, __method__
end
# $1
# ^^
- def visit_number_nodeed_reference_read_node(node)
- raise NoMethodError, __method__
+ def visit_numbered_reference_read_node(node)
+ bounds(node.location)
+ on_backref(node.slice)
end
# def foo(bar: baz); end
@@ -1255,6 +1303,7 @@ module Prism
keyword_rest = visit(node.keyword_rest)
block = visit(node.block)
+ bounds(node.location)
on_params(requireds, optionals, rest, posts, keywords, keyword_rest, block)
end
@@ -1375,7 +1424,11 @@ module Prism
# foo rescue bar
# ^^^^^^^^^^^^^^
def visit_rescue_modifier_node(node)
- raise NoMethodError, __method__
+ expression = visit(node.expression)
+ rescue_expression = visit(node.rescue_expression)
+
+ bounds(node.location)
+ on_rescue_mod(expression, rescue_expression)
end
# begin; rescue; end
@@ -1586,7 +1639,25 @@ module Prism
# bar until foo
# ^^^^^^^^^^^^^
def visit_until_node(node)
- raise NoMethodError, __method__
+ if node.statements.nil? || (node.keyword_loc.start_offset < node.statements.location.start_offset)
+ predicate = visit(node.predicate)
+ statements =
+ if node.statements.nil?
+ bounds(node.location)
+ on_stmts_add(on_stmts_new, on_void_stmt)
+ else
+ visit(node.statements)
+ end
+
+ bounds(node.location)
+ on_until(predicate, statements)
+ else
+ statements = visit(node.statements.body.first)
+ predicate = visit(node.predicate)
+
+ bounds(node.location)
+ on_until_mod(predicate, statements)
+ end
end
# case foo; when bar; end
@@ -1601,7 +1672,25 @@ module Prism
# bar while foo
# ^^^^^^^^^^^^^
def visit_while_node(node)
- raise NoMethodError, __method__
+ if node.statements.nil? || (node.keyword_loc.start_offset < node.statements.location.start_offset)
+ predicate = visit(node.predicate)
+ statements =
+ if node.statements.nil?
+ bounds(node.location)
+ on_stmts_add(on_stmts_new, on_void_stmt)
+ else
+ visit(node.statements)
+ end
+
+ bounds(node.location)
+ on_while(predicate, statements)
+ else
+ statements = visit(node.statements.body.first)
+ predicate = visit(node.predicate)
+
+ bounds(node.location)
+ on_while_mod(predicate, statements)
+ end
end
# `foo`