1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
# frozen_string_literal: true
module Unparser
class Emitter
# Block emitter
class Block < self
handle :block, :numblock
children :target, :arguments, :body
private
def dispatch
emit_target
ws
write_open
emit_block_arguments unless n_lambda?(target)
target_writer.emit_heredoc_reminders if n_send?(target)
emit_optional_body_ensure_rescue(body)
write_close
end
def need_do?
body && (n_rescue?(body) || n_ensure?(body))
end
def write_open
if need_do?
write('do')
else
write('{')
end
end
def write_close
if need_do?
k_end
else
write('}')
end
end
def target_writer
writer_with(Writer::Send::Regular, target)
end
memoize :target_writer
def emit_target
case target.type
when :send
emit_send_target
when :lambda
visit(target)
emit_lambda_arguments unless node.type.equal?(:numblock)
else
visit(target)
end
end
def emit_send_target
target_writer.emit_receiver
target_writer.emit_selector
target_writer.emit_arguments_without_heredoc_body
end
def emit_lambda_arguments
parentheses { writer_with(Args, arguments).emit_lambda_arguments }
end
def numblock?
node.type.equal?(:numblock)
end
def emit_block_arguments
return if numblock? || arguments.children.empty?
ws
parentheses('|', '|') do
writer_with(Args, arguments).emit_block_arguments
end
end
end # Block
end # Emitter
end # Unparser
|