Class: Opal::Rewriters::BinaryOperatorAssignment

Inherits:
Base
  • Object
show all
Defined in:
opal/lib/opal/rewriters/binary_operator_assignment.rb

Direct Known Subclasses

ConditionalSendHandler, SendHandler

Defined Under Namespace

Classes: ConditionalSendHandler, SendHandler

Constant Summary

GET_SET =
->(get_type, set_type) {

  ->(lhs, op, rhs) {
    get_node = lhs.updated(get_type) # lhs
    set_node = s(:send, get_node, op, rhs) # lhs + rhs

    lhs.updated(set_type, [*lhs, set_node]) # lhs = lhs + rhs
  }

}
LocalVariableHandler =

Takes lhs += rhs Produces lhs = lhs + rhs

GET_SET[:lvar, :lvasgn]
InstanceVariableHandler =

Takes @lhs += rhs Produces @lhs = @lhs + rhs

GET_SET[:ivar, :ivasgn]
ConstantHandler =

Takes LHS += rhs Produces LHS = LHS + rhs

GET_SET[:const, :casgn]
GlobalVariableHandler =

Takes $lhs += rhs Produces $lhs = $lhs + rhs

GET_SET[:gvar, :gvasgn]
ClassVariableHandler =

Takes @@lhs += rhs Produces @@lhs = @@lhs + rhs

GET_SET[:cvar, :cvasgn]
HANDLERS =
{
  lvasgn: LocalVariableHandler,
  ivasgn: InstanceVariableHandler,
  casgn:  ConstantHandler,
  gvasgn: GlobalVariableHandler,
  cvasgn: ClassVariableHandler,
  send:   SendHandler,
  csend:  ConditionalSendHandler
}
ASSIGNMENT_STRING_NODE =
s(:str, 'assignment')

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#append_to_body, #prepend_to_body, #s, s

Class Method Details

.new_tempObject



11
12
13
14
15
# File 'opal/lib/opal/rewriters/binary_operator_assignment.rb', line 11

def self.new_temp
  @@counter ||= 0
  @@counter += 1
  :$binary_op_recvr_tmp_#{@@counter}"
end

.reset_tmp_counter!Object



7
8
9
# File 'opal/lib/opal/rewriters/binary_operator_assignment.rb', line 7

def self.reset_tmp_counter!
  @@counter = 0
end

Instance Method Details

#on_defined?(node) ⇒ Boolean

Rewrites any or_asgn and and_asgn node like defined?(a ||= 1) and defined?(a &&= 1) to a static "assignment" string node

Returns:

  • (Boolean)


131
132
133
134
135
136
137
138
# File 'opal/lib/opal/rewriters/binary_operator_assignment.rb', line 131

def on_defined?(node)
  inner, _ = *node
  if inner.type == :op_asgn
    ASSIGNMENT_STRING_NODE
  else
    super(node)
  end
end

#on_op_asgn(node) ⇒ Object

lhs += rhs



114
115
116
117
118
119
120
121
122
# File 'opal/lib/opal/rewriters/binary_operator_assignment.rb', line 114

def on_op_asgn(node)
  lhs, op, rhs = *node

  result = HANDLERS
    .fetch(lhs.type) { raise NotImplementedError }
    .call(lhs, op, rhs)

  process(result)
end