class Opal::Rewriters::BinaryOperatorAssignment::SendHandler
(lhs is a recvr.meth, op is :+)
Produces ‘recvr.meth = recvr.meth + rhs`
Takes `recvr.meth += rhs`
def self.call(node, lhs, operation, rhs)
def self.call(node, lhs, operation, rhs) 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_op = node.updated(:send, [call_reader, operation, rhs]) # $tmp.meth + rhs call_writer = lhs.updated(:send, [recvr, writer_method, *args, call_op]) # $tmp.meth = $tmp.meth + rhs if cache_recvr node.updated(:begin, [cache_recvr, call_writer]) else call_writer end end