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 88 89 90 91 92 93 94 95 96 97 98 99
|
# frozen_string_literal: true
module Unparser
module Writer
class Binary
include Writer, Adamantium
children :left, :right
OPERATOR_TOKENS =
{
and: '&&',
or: '||'
}.freeze
KEYWORD_TOKENS =
{
and: 'and',
or: 'or'
}.freeze
KEYWORD_SYMBOLS =
{
and: :kAND,
or: :kOR
}.freeze
OPERATOR_SYMBOLS =
{
and: :tANDOP,
or: :tOROP
}.freeze
MAP =
{
kAND: 'and',
kOR: 'or',
tOROP: '||',
tANDOP: '&&'
}.freeze
NEED_KEYWORD = %i[return break next].freeze
private_constant(*constants(false))
def emit_operator
emit_with(OPERATOR_TOKENS)
end
def symbol_name
true
end
def dispatch
left_emitter.write_to_buffer
write(' ', MAP.fetch(effective_symbol), ' ')
visit(right)
end
private
def effective_symbol
if NEED_KEYWORD.include?(right.type) || NEED_KEYWORD.include?(left.type)
return keyword_symbol
end
unless left_emitter.symbol_name
return operator_symbol
end
keyword_symbol
end
def emit_with(map)
visit(left)
write(' ', map.fetch(node.type), ' ')
visit(right)
end
def keyword_symbol
KEYWORD_SYMBOLS.fetch(node.type)
end
def operator_symbol
OPERATOR_SYMBOLS.fetch(node.type)
end
def left_emitter
emitter(left)
end
memoize :left_emitter
def right_emitter
emitter(right)
end
memoize :right_emitter
end # Binary
end # Writer
end # Unparser
|