module Unparser::Generation

rubocop:disable Metrics/ModuleLength

Constants

EXTRA_NL

Public Instance Methods

emit_heredoc_reminders() click to toggle source
# File lib/unparser/generation.rb, line 10
def emit_heredoc_reminders; end
symbol_name() click to toggle source
# File lib/unparser/generation.rb, line 12
def symbol_name; end
write_to_buffer() click to toggle source
# File lib/unparser/generation.rb, line 14
def write_to_buffer
  with_comments { dispatch }
  self
end

Private Instance Methods

children() click to toggle source
# File lib/unparser/generation.rb, line 247
def children
  node.children
end
conditional_parentheses(flag, &block) click to toggle source
# File lib/unparser/generation.rb, line 239
def conditional_parentheses(flag, &block)
  if flag
    parentheses(&block)
  else
    block.call
  end
end
delimited(nodes, delimiter = ', ', &block) click to toggle source
# File lib/unparser/generation.rb, line 21
def delimited(nodes, delimiter = ', ', &block)
  return if nodes.empty?

  emit_join(nodes, block || method(:visit), -> { write(delimiter) })
end
emit_body(node, indent: true) click to toggle source
# File lib/unparser/generation.rb, line 123
def emit_body(node, indent: true)
  if indent
    buffer.indent
    nl
  end

  if n_begin?(node)
    if node.children.one?
      visit_deep(node)
    else
      emit_body_inner(node)
    end
  else
    visit_deep(node)
  end

  if indent
    buffer.unindent
    nl
  end
end
emit_body_ensure_rescue(node) click to toggle source
# File lib/unparser/generation.rb, line 196
def emit_body_ensure_rescue(node)
  if n_ensure?(node)
    emit_ensure(node)
  elsif n_rescue?(node)
    emit_rescue_regular(node)
  else
    emit_body(node)
  end
end
emit_body_inner(node) click to toggle source
# File lib/unparser/generation.rb, line 145
def emit_body_inner(node)
  head, *tail = node.children
  emit_body_member(head)

  tail.each do |child|
    nl

    nl if EXTRA_NL.include?(child.type)

    emit_body_member(child)
  end
end
emit_body_member(node) click to toggle source
# File lib/unparser/generation.rb, line 158
def emit_body_member(node)
  if n_rescue?(node)
    emit_rescue_postcontrol(node)
  else
    visit_deep(node)
  end
end
emit_body_rescue(node) click to toggle source
# File lib/unparser/generation.rb, line 180
def emit_body_rescue(node)
  if n_rescue?(node)
    emit_rescue_regular(node)
  else
    emit_body(node)
  end
end
emit_comments(comments) click to toggle source
# File lib/unparser/generation.rb, line 77
def emit_comments(comments)
  max = comments.size - 1
  comments.each_with_index do |comment, index|
    if comment.type.equal?(:document)
      buffer.append_without_prefix(comment.text.chomp)
    else
      write(comment.text)
    end
    buffer.nl if index < max
  end
end
emit_comments_before(source_part = :expression) click to toggle source
# File lib/unparser/generation.rb, line 69
def emit_comments_before(source_part = :expression)
  comments_before = comments.take_before(node, source_part)
  return if comments_before.empty?

  emit_comments(comments_before)
  buffer.nl
end
emit_ensure(node) click to toggle source
# File lib/unparser/generation.rb, line 166
def emit_ensure(node)
  body, ensure_body = node.children

  if body
    emit_body_rescue(body)
  else
    nl
  end

  write('ensure')

  emit_optional_body(ensure_body)
end
emit_eof_comments() click to toggle source
# File lib/unparser/generation.rb, line 60
def emit_eof_comments
  emit_eol_comments
  comments_left = comments.take_all
  return if comments_left.empty?

  buffer.nl
  emit_comments(comments_left)
end
emit_eol_comments() click to toggle source
# File lib/unparser/generation.rb, line 54
def emit_eol_comments
  comments.take_eol_comments.each do |comment|
    write(' ', comment.text)
  end
end
emit_join(nodes, emit_node, emit_delimiter) click to toggle source
# File lib/unparser/generation.rb, line 27
def emit_join(nodes, emit_node, emit_delimiter)
  return if nodes.empty?

  head, *tail = nodes
  emit_node.call(head)

  tail.each do |node|
    emit_delimiter.call
    emit_node.call(node)
  end
end
emit_optional_body(node, indent: true) click to toggle source
# File lib/unparser/generation.rb, line 115
def emit_optional_body(node, indent: true)
  if node
    emit_body(node, indent: indent)
  else
    nl
  end
end
emit_optional_body_ensure_rescue(node) click to toggle source
# File lib/unparser/generation.rb, line 188
def emit_optional_body_ensure_rescue(node)
  if node
    emit_body_ensure_rescue(node)
  else
    nl
  end
end
emit_rescue_postcontrol(node) click to toggle source
# File lib/unparser/generation.rb, line 206
def emit_rescue_postcontrol(node)
  writer = writer_with(Writer::Rescue, node)
  writer.emit_postcontrol
  writer.emit_heredoc_reminders
end
emit_rescue_regular(node) click to toggle source
# File lib/unparser/generation.rb, line 212
def emit_rescue_regular(node)
  writer_with(Writer::Rescue, node).emit_regular
end
emitter(node) click to toggle source
# File lib/unparser/generation.rb, line 220
def emitter(node)
  Emitter.emitter(**to_h.merge(node: node))
end
first_child() click to toggle source
# File lib/unparser/generation.rb, line 235
def first_child
  children.first
end
indented() { || ... } click to toggle source
# File lib/unparser/generation.rb, line 106
def indented
  buffer = buffer()
  buffer.indent
  nl
  yield
  nl
  buffer.unindent
end
k_end() click to toggle source
# File lib/unparser/generation.rb, line 93
def k_end
  buffer.indent
  emit_comments_before(:end)
  buffer.unindent
  write('end')
end
nl() click to toggle source
# File lib/unparser/generation.rb, line 39
def nl
  emit_eol_comments
  buffer.nl
end
parentheses(open = '(', close = ')') { || ... } click to toggle source
# File lib/unparser/generation.rb, line 100
def parentheses(open = '(', close = ')')
  write(open)
  yield
  write(close)
end
visit(node) click to toggle source
# File lib/unparser/generation.rb, line 224
def visit(node)
  emitter(node).write_to_buffer
end
visit_deep(node) click to toggle source
# File lib/unparser/generation.rb, line 228
def visit_deep(node)
  emitter(node).tap do |emitter|
    emitter.write_to_buffer
    emitter.emit_heredoc_reminders
  end
end
with_comments() { || ... } click to toggle source
# File lib/unparser/generation.rb, line 44
def with_comments
  emit_comments_before if buffer.fresh_line?
  yield
  comments.consume(node)
end
write(*strings) click to toggle source
# File lib/unparser/generation.rb, line 89
def write(*strings)
  strings.each(&buffer.method(:append))
end
writer_with(klass, node) click to toggle source
# File lib/unparser/generation.rb, line 216
def writer_with(klass, node)
  klass.new(to_h.merge(node: node))
end
ws() click to toggle source
# File lib/unparser/generation.rb, line 50
def ws
  write(' ')
end