[フレーム]

Class: Opal::Rewriters::BinaryOperatorAssignment

Inherits:
Base
  • Object
  • Parser::AST::Processor
  • Base
  • Opal::Rewriters::BinaryOperatorAssignment
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 collapse

GET_SET =
->(get_type, set_type) {
 ->(node, lhs, operation, rhs) {
 get_node = lhs.updated(get_type) # lhs
 set_node = node.updated(:send, [get_node, operation, rhs]) # lhs + rhs

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

Takes lhs += rhs Produces lhs = lhs + rhs

InstanceVariableHandler =

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

ConstantHandler =

Takes LHS += rhs Produces LHS = LHS + rhs

GlobalVariableHandler =

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

ClassVariableHandler =

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

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

Constants inherited from Base

Opal::Rewriters::Base::DUMMY_LOCATION

Instance Attribute Summary

Attributes inherited from Base

#current_node

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#append_to_body , #begin_with_stmts , #dynamic! , #error , #on_top , #prepend_to_body , #process , s , #s , #stmts_of

Class Method Details

.new_tempObject

12
13
14
15
16
# File 'opal/lib/opal/rewriters/binary_operator_assignment.rb', line 12
def self.new_temp
 @@counter ||= 0
 @@counter += 1
 :"$binary_op_recvr_tmp_#{@@counter}"
end

.reset_tmp_counter!Object

8
9
10
# File 'opal/lib/opal/rewriters/binary_operator_assignment.rb', line 8
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) { error "cannot handle LHS type: #{lhs.type}" }
 .call(node, lhs, op, rhs)
 process(result)
end

AltStyle によって変換されたページ (->オリジナル) /