summaryrefslogtreecommitdiff
path: root/lib/prism/translation/ripper.rb
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-05 00:31:19 -0500
committergit <svn-admin@ruby-lang.org>2024-03-06 16:42:36 +0000
commitbe5376e422252850b5ee8c41dff81e7d61604f62 (patch)
tree03be1abc8be282dae6331837e537641297cd54f9 /lib/prism/translation/ripper.rb
parent3b7d5efd050ff349ba4e61520a270ce4c838f381 (diff)
[ruby/prism] Implement even more ripper visitor methods
https://github.com/ruby/prism/commit/88b8185075
Diffstat (limited to 'lib/prism/translation/ripper.rb')
-rw-r--r--lib/prism/translation/ripper.rb79
1 files changed, 69 insertions, 10 deletions
diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb
index c7368d610d..47b27bc75c 100644
--- a/lib/prism/translation/ripper.rb
+++ b/lib/prism/translation/ripper.rb
@@ -1292,7 +1292,8 @@ module Prism
# redo
# ^^^^
def visit_redo_node(node)
- raise NoMethodError, __method__
+ bounds(node.location)
+ on_redo
end
# /foo/
@@ -1373,7 +1374,8 @@ module Prism
# retry
# ^^^^^
def visit_retry_node(node)
- raise NoMethodError, __method__
+ bounds(node.location)
+ on_retry
end
# return
@@ -1382,13 +1384,22 @@ module Prism
# return 1
# ^^^^^^^^
def visit_return_node(node)
- raise NoMethodError, __method__
+ if node.arguments.nil?
+ bounds(node.location)
+ on_return0
+ else
+ arguments = visit(node.arguments)
+
+ bounds(node.location)
+ on_return(on_args_add_block(arguments, false))
+ end
end
# self
# ^^^^
def visit_self_node(node)
- raise NoMethodError, __method__
+ bounds(node.location)
+ on_var_ref(on_kw("self"))
end
# class << self; end
@@ -1400,19 +1411,22 @@ module Prism
# __ENCODING__
# ^^^^^^^^^^^^
def visit_source_encoding_node(node)
- raise NoMethodError, __method__
+ bounds(node.location)
+ on_var_ref(on_kw("__ENCODING__"))
end
# __FILE__
# ^^^^^^^^
def visit_source_file_node(node)
- raise NoMethodError, __method__
+ bounds(node.location)
+ on_var_ref(on_kw("__FILE__"))
end
# __LINE__
# ^^^^^^^^
def visit_source_line_node(node)
- raise NoMethodError, __method__
+ bounds(node.location)
+ on_var_ref(on_kw("__LINE__"))
end
# foo(*bar)
@@ -1448,7 +1462,11 @@ module Prism
# super(foo)
# ^^^^^^^^^^
def visit_super_node(node)
- raise NoMethodError, __method__
+ bounds(node.arguments.location)
+ arguments = on_args_add_block(visit_array_node_elements(node.arguments.arguments), node.block.nil? ? false : visit(node.block))
+
+ bounds(node.location)
+ on_super(arguments)
end
# :foo
@@ -1467,7 +1485,27 @@ module Prism
# undef foo
# ^^^^^^^^^
def visit_undef_node(node)
- raise NoMethodError, __method__
+ names =
+ node.names.map do |name|
+ case name
+ when SymbolNode
+ bounds(name.value_loc)
+ token = visit_token(name.unescaped)
+
+ if name.opening_loc.nil?
+ on_symbol_literal(token)
+ else
+ on_symbol_literal(on_symbol(token))
+ end
+ when InterpolatedSymbolNode
+ visit(name)
+ else
+ raise
+ end
+ end
+
+ bounds(node.location)
+ on_undef(names)
end
# unless foo; bar end
@@ -1519,7 +1557,15 @@ module Prism
# yield 1
# ^^^^^^^
def visit_yield_node(node)
- raise NoMethodError, __method__
+ if node.arguments.nil?
+ bounds(node.location)
+ on_yield0
+ else
+ arguments = visit(node.arguments)
+
+ bounds(node.location)
+ on_yield(arguments)
+ end
end
private
@@ -1533,6 +1579,19 @@ module Prism
# Helpers
##########################################################################
+ # Visit the string content of a particular node. This method is used to
+ # split into the various token types.
+ def visit_token(token)
+ case token
+ when *RUBY_KEYWORDS
+ on_kw(token)
+ when /^[[:upper:]]/
+ on_const(token)
+ else
+ on_ident(token)
+ end
+ end
+
# Generate Ripper events for a CallNode with no opening_loc
def visit_no_paren_call(node)
# No opening_loc can mean an operator. It can also mean a