summaryrefslogtreecommitdiff
path: root/lib/prism/translation/ripper.rb
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-05 20:36:58 -0500
committergit <svn-admin@ruby-lang.org>2024-03-06 16:42:48 +0000
commit3a7beffd1bcf2262d6a6db7356ad0f249a33e4d9 (patch)
tree5ead61100b1112ce7fbf555d34accdc7a097a8bd /lib/prism/translation/ripper.rb
parent8f7db7e64c7bd34e75fdac5794e7a4e32a2f2df1 (diff)
[ruby/prism] Consolidate body node visiting in ripper translation
https://github.com/ruby/prism/commit/8feb073fe4
Diffstat (limited to 'lib/prism/translation/ripper.rb')
-rw-r--r--lib/prism/translation/ripper.rb142
1 files changed, 52 insertions, 90 deletions
diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb
index ae7ba6d536..0c2496fe80 100644
--- a/lib/prism/translation/ripper.rb
+++ b/lib/prism/translation/ripper.rb
@@ -356,6 +356,25 @@ module Prism
on_bodystmt(statements, rescue_clause, else_clause, ensure_clause)
end
+ # Visit the body of a structure that can have either a set of statements
+ # or statements wrapped in rescue/else/ensure.
+ private def visit_body_node(node, location)
+ case node
+ when nil
+ bounds(location)
+ on_bodystmt(visit_statements_node_body([nil]), nil, nil, nil)
+ when StatementsNode
+ body = visit(node)
+
+ bounds(node.location)
+ on_bodystmt(body, nil, nil, nil)
+ when BeginNode
+ visit_begin_node_clauses(node)
+ else
+ raise
+ end
+ end
+
# foo(&bar)
# ^^^^
def visit_block_argument_node(node)
@@ -371,31 +390,36 @@ module Prism
# Visit a BlockNode.
def visit_block_node(node)
- params_val = node.parameters.nil? ? nil : visit(node.parameters)
-
- # If the body is empty, we use a void statement. If there is
- # a semicolon after the opening delimiter, we append a void
- # statement, unless the body is also empty. So we should never
- # get a double void statement.
-
- body_val = if node.body.nil?
- on_stmts_add(on_stmts_new, on_void_stmt)
- elsif node_has_semicolon?(node)
- v = visit(node.body)
- raise(NoMethodError, __method__, "Unexpected statement structure #{v.inspect}") if v[0] != :stmts_add
- v[1] = on_stmts_add(on_stmts_new, on_void_stmt)
- v
- else
- visit(node.body)
- end
+ braces = node.opening == "{"
+ parameters = visit(node.parameters)
+
+ body =
+ case node.body
+ when nil
+ bounds(node.location)
+ stmts = on_stmts_add(on_stmts_new, on_void_stmt)
+
+ bounds(node.location)
+ braces ? stmts : on_bodystmt(stmts, nil, nil, nil)
+ when StatementsNode
+ stmts = node.body.body
+ stmts.unshift(nil) if source.byteslice((node.parameters&.location || node.opening_loc).end_offset...node.body.location.start_offset).include?(";")
+ stmts = visit_statements_node_body(stmts)
- case node.opening
- when "{"
- on_brace_block(params_val, body_val)
- when "do"
- on_do_block(params_val, on_bodystmt(body_val, nil, nil, nil))
+ bounds(node.body.location)
+ braces ? stmts : on_bodystmt(stmts, nil, nil, nil)
+ when BeginNode
+ visit_body_node(node.body, node.location)
+ else
+ raise
+ end
+
+ if braces
+ bounds(node.location)
+ on_brace_block(parameters, body)
else
- raise
+ bounds(node.location)
+ on_do_block(parameters, body)
end
end
@@ -768,21 +792,7 @@ module Prism
end
superclass = visit(node.superclass)
- bodystmt =
- case node.body
- when nil
- bounds(node.location)
- on_bodystmt(visit_statements_node_body([nil]), nil, nil, nil)
- when StatementsNode
- body = visit(node.body)
-
- bounds(node.body.location)
- on_bodystmt(body, nil, nil, nil)
- when BeginNode
- visit_begin_node_clauses(node.body)
- else
- raise
- end
+ bodystmt = visit_body_node(node.body, node.location)
bounds(node.location)
on_class(constant_path, superclass, bodystmt)
@@ -1052,20 +1062,7 @@ module Prism
bodystmt =
if node.equal_loc.nil?
- case node.body
- when nil
- bounds(node.location)
- on_bodystmt(visit_statements_node_body([nil]), nil, nil, nil)
- when StatementsNode
- body = visit(node.body)
-
- bounds(node.body.location)
- on_bodystmt(body, nil, nil, nil)
- when BeginNode
- visit_begin_node_clauses(node.body)
- else
- raise
- end
+ visit_body_node(node.body, node.location)
else
body = visit(node.body.body.first)
@@ -1811,21 +1808,7 @@ module Prism
visit(node.constant_path)
end
- bodystmt =
- case node.body
- when nil
- bounds(node.location)
- on_bodystmt(visit_statements_node_body([nil]), nil, nil, nil)
- when StatementsNode
- body = visit(node.body)
-
- bounds(node.body.location)
- on_bodystmt(body, nil, nil, nil)
- when BeginNode
- visit_begin_node_clauses(node.body)
- else
- raise
- end
+ bodystmt = visit_body_node(node.body, node.location)
bounds(node.location)
on_module(constant_path, bodystmt)
@@ -2187,21 +2170,7 @@ module Prism
# ^^^^^^^^^^^^^^^^^^
def visit_singleton_class_node(node)
expression = visit(node.expression)
- bodystmt =
- case node.body
- when nil
- bounds(node.location)
- on_bodystmt(visit_statements_node_body([nil]), nil, nil, nil)
- when StatementsNode
- body = visit(node.body)
-
- bounds(node.body.location)
- on_bodystmt(body, nil, nil, nil)
- when BeginNode
- visit_begin_node_clauses(node.body)
- else
- raise
- end
+ bodystmt = visit_body_node(node.body, node.location)
bounds(node.location)
on_sclass(expression, bodystmt)
@@ -2551,7 +2520,7 @@ module Prism
location = node.location
if slice[0] == "-"
- bounds_values(location.start_line, location.start_column + 1)
+ bounds(location.copy(start_offset: location.start_offset + 1))
value = yield slice[1..-1]
bounds(node.location)
@@ -2614,13 +2583,6 @@ module Prism
@column = location.start_column
end
- # If we need to do something unusual, we can directly update the line number
- # and column to reflect the current node.
- def bounds_values(lineno, column)
- @lineno = lineno
- @column = column
- end
-
##########################################################################
# Ripper interface
##########################################################################