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
|
# frozen_string_literal: true
module Unparser
class Emitter
# Emitter for postconditions
class Post < self
children :condition, :body
MAP = {
while_post: 'while',
until_post: 'until'
}.freeze
handle(*MAP.keys)
private
def dispatch
visit(body)
write(' ', MAP.fetch(node.type), ' ')
visit(condition)
end
end
# Emitter for while and until nodes
class Repetition < self
MAP = {
while: 'while',
until: 'until'
}.freeze
handle(*MAP.keys)
children :condition, :body
private
def dispatch
if postcontrol?
emit_postcontrol
else
emit_normal
end
end
def postcontrol?
body && local_variable_scope.first_assignment_in?(body, condition)
end
def emit_keyword
write(MAP.fetch(node.type), ' ')
end
def emit_normal
emit_keyword
visit(condition)
if body
emit_body(body)
else
nl
end
k_end
end
def emit_postcontrol
visit(body)
ws
emit_keyword
visit(condition)
end
end # Repetition
end # Emitter
end # Unparser
|