Class: Opal::Rewriters::LogicalOperatorAssignment

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

Direct Known Subclasses

ConditionalSendHandler, SendHandler

Defined Under Namespace

Classes: ConditionalSendHandler, SendHandler

Constant Summary

GET_SET =
->(get_type, set_type) {

  ->(lhs, rhs, root_type) {
    get_node = lhs.updated(get_type) # lhs
    condition_node = s(root_type, get_node, rhs) # lhs || rhs

    lhs.updated(set_type, [*lhs, condition_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/logical_operator_assignment.rb', line 11

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

.reset_tmp_counter!Object



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

def self.reset_tmp_counter!
  @@counter = 0
end

Instance Method Details

#on_and_asgn(node) ⇒ Object

lhs &&= rhs



127
128
129
130
131
132
133
134
135
# File 'opal/lib/opal/rewriters/logical_operator_assignment.rb', line 127

def on_and_asgn(node)
  lhs, rhs = *node

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

  process(result)
end

#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)


144
145
146
147
148
149
150
151
# File 'opal/lib/opal/rewriters/logical_operator_assignment.rb', line 144

def on_defined?(node)
  inner, _ = *node
  if [:or_asgn, :and_asgn].include?(inner.type)
    ASSIGNMENT_STRING_NODE
  else
    super(node)
  end
end

#on_or_asgn(node) ⇒ Object

lhs ||= rhs



116
117
118
119
120
121
122
123
124
# File 'opal/lib/opal/rewriters/logical_operator_assignment.rb', line 116

def on_or_asgn(node)
  lhs, rhs = *node

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

  process(result)
end