summaryrefslogtreecommitdiff
path: root/lib/prism/translation/ripper.rb
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-05 08:35:10 -0500
committergit <svn-admin@ruby-lang.org>2024-03-06 16:42:44 +0000
commitfabece2507c12f131c67d2324c1aee27ab8a5f7d (patch)
tree9ee9d5ffd8c608d21eaade9327974421c25563a6 /lib/prism/translation/ripper.rb
parentd719814d82f63774272f0009d1d019a56a87ba9b (diff)
[ruby/prism] Implement lambdas for ripper translation
https://github.com/ruby/prism/commit/602d3d2ccb
Diffstat (limited to 'lib/prism/translation/ripper.rb')
-rw-r--r--lib/prism/translation/ripper.rb28
1 files changed, 27 insertions, 1 deletions
diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb
index 0c6f59dec1..6eb65b14ae 100644
--- a/lib/prism/translation/ripper.rb
+++ b/lib/prism/translation/ripper.rb
@@ -1399,7 +1399,31 @@ module Prism
# -> {}
def visit_lambda_node(node)
- raise NoMethodError, __method__
+ parameters =
+ if node.parameters.nil?
+ bounds(node.location)
+ on_params(nil, nil, nil, nil, nil, nil, nil)
+ else
+ # Ripper does not track block-locals within lambdas, so we skip
+ # directly to the parameters here.
+ visit(node.parameters.parameters)
+ end
+
+ if !node.opening_loc.nil?
+ bounds(node.opening_loc)
+ parameters = on_paren(parameters)
+ end
+
+ body =
+ if node.body.nil?
+ bounds(node.location)
+ on_stmts_add(on_stmts_new, on_void_stmt)
+ else
+ visit(node.body)
+ end
+
+ bounds(node.location)
+ on_lambda(parameters, body)
end
# foo
@@ -2160,6 +2184,8 @@ module Prism
on_kw(token)
when /^[[:upper:]]/
on_const(token)
+ when /^[[:punct:]]/
+ on_op(token)
else
on_ident(token)
end