Class: Opal::Rewriters::LogicalOperatorAssignment
- Inherits:
-
Base
- Object
- Parser::AST::Processor
- Base
- Opal::Rewriters::LogicalOperatorAssignment
- Defined in:
- opal/lib/opal/rewriters/logical_operator_assignment.rb
Direct Known Subclasses
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
Produceslhs = lhs || rhs
GET_SET[:lvar, :lvasgn]
- InstanceVariableHandler =
Takes
@lhs ||= rhs
Produces@lhs = @lhs || rhs
GET_SET[:ivar, :ivasgn]
- ConstantHandler =
Takes
LHS ||= rhs
ProducesLHS = 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')
Constants inherited from Base
Instance Attribute Summary
Attributes inherited from Base
Class Method Summary collapse
Instance Method Summary collapse
-
#on_and_asgn(node) ⇒ Object
lhs &&= rhs.
-
#on_defined?(node) ⇒ Boolean
Rewrites any or_asgn and and_asgn node like
defined?(a ||= 1)
anddefined?(a &&= 1)
to a static "assignment" string node. -
#on_or_asgn(node) ⇒ Object
lhs ||= rhs.
Methods inherited from Base
#append_to_body, #prepend_to_body, #process, #s, s
Class Method Details
.new_temp ⇒ Object
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
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 |