class Opal::Rewriters::ForwardArgs

def on_args(node)

def on_args(node)
  if node.children.last && node.children.last.type == :forward_arg
    prev_children = node.children[0..-2]
    super(node.updated(nil,
      [
        *prev_children,
        s(:restarg, '$fwd_rest'),
        s(:blockarg, '$fwd_block')
      ]
    ))
  else
    super
  end
end

def on_block_pass(node)

def on_block_pass(node)
  if !node.children.first
    process(
      node.updated(nil,
        [s(:lvar, '$fwd_block')]
      )
    )
  else
    super
  end
end

def on_blockarg(node)

def on_blockarg(node)
  if !node.children.first
    node.updated(nil, ['$fwd_block'])
  else
    super
  end
end

def on_forward_args(_node)

def on_forward_args(_node)
  process(
    s(:args, s(:forward_arg, :"$"))
  )
end

def on_forwarded_kwrestarg(_node)

def on_forwarded_kwrestarg(_node)
  process(
    s(:kwsplat, s(:lvar, '$fwd_kwrest'))
  )
end

def on_forwarded_restarg(_node)

def on_forwarded_restarg(_node)
  process(
    s(:splat, s(:lvar, '$fwd_rest'))
  )
end

def on_kwrestarg(node)

def on_kwrestarg(node)
  if !node.children.first
    node.updated(nil, ['$fwd_kwrest'])
  else
    super
  end
end

def on_restarg(node)

def on_restarg(node)
  if !node.children.first
    node.updated(nil, ['$fwd_rest'])
  else
    super
  end
end

def on_send(node)

def on_send(node)
  if node.children.last &&
     node.children.last.class != Symbol &&
     node.children.last.type == :forwarded_args
    prev_children = node.children[0..-2]
    super(node.updated(nil,
      [
        *prev_children,
        s(:splat,
          s(:lvar, '$fwd_rest')
        ),
        s(:block_pass,
          s(:lvar, '$fwd_block')
        )
      ]
    ))
  else
    super
  end
end