class Opal::Rewriters::LogicalOperatorAssignment::SendHandler

(lhs is a recvr.meth)
Produces ‘recvr.meth || recvr.meth = rhs`
Takes `recvr.meth ||= rhs`

def self.call(lhs, rhs, root_type)

def self.call(lhs, rhs, root_type)
  recvr, reader_method, *args = *lhs
  # If recvr is a complex expression it must be cached.
  # MRI calls recvr in `recvr.meth ||= rhs` only once.
  if recvr && recvr.type == :send
    recvr_tmp = new_temp
    cache_recvr = s(:lvasgn, recvr_tmp, recvr)                         # $tmp = recvr
    recvr = s(:js_tmp, recvr_tmp)
  end
  writer_method = :"#{reader_method}="
  call_reader = lhs.updated(:send, [recvr, reader_method, *args])      # $tmp.meth
  call_writer = lhs.updated(:send, [recvr, writer_method, *args, rhs]) # $tmp.meth = rhs
  get_or_set = s(root_type, call_reader, call_writer)
  if cache_recvr
    s(:begin, cache_recvr, get_or_set)
  else
    get_or_set
  end
end