Class: Opal::Nodes::BaseYieldNode
- Defined in:
- opal/lib/opal/nodes/yield.rb
Direct Known Subclasses
Instance Attribute Summary
Attributes inherited from Base
Attributes included from Closure::NodeSupport
Instance Method Summary collapse
- #compile_call ⇒ Object
- #find_yielding_scope ⇒ Object
- #uses_splat?(children) ⇒ Boolean
- #yields_single_arg?(children) ⇒ Boolean
Methods inherited from Base
#add_gvar , #add_ivar , #add_local , #add_temp , #children , children , #class_variable_owner , #class_variable_owner_nesting_level , #comments , #compile , #compile_to_fragments , #error , #expr , #expr? , #expr_or_empty , #expr_or_nil , #fragment , handle , handlers , #has_rescue_else? , #helper , #in_ensure , #in_ensure? , #in_resbody , #in_resbody? , #in_rescue , #in_while? , #initialize , #process , #push , #recv , #recv? , #s , #scope , #source_location , #stmt , #stmt? , #top_scope , truthy_optimize? , #unshift , #while_loop , #with_temp , #wrap
Methods included from Closure::NodeSupport
#closure_is? , #compile_catcher , #generate_thrower , #generate_thrower_without_catcher , #in_closure , #pop_closure , #push_closure , #select_closure , #thrower
Methods included from Helpers
#current_indent , #empty_line , #indent , #js_truthy , #js_truthy_optimize , #line , #mid_to_jsid , #property , #valid_name?
Constructor Details
This class inherits a constructor from Opal::Nodes::Base
Instance Method Details
#compile_call ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
# File 'opal/lib/opal/nodes/yield.rb', line 8 def compile_call yielding_scope = find_yielding_scope yielding_scope.uses_block! yielding_scope.block_name ||= '$yield' block_name = yielding_scope.block_name if yields_single_arg?(children) push expr(children.first) wrap "Opal.yield1(#{block_name}, ", ')' else push expr(s(:arglist, *children)) if uses_splat?(children) wrap "Opal.yieldX(#{block_name}, ", ')' else wrap "Opal.yieldX(#{block_name}, [", '])' end end end
#find_yielding_scope ⇒ Object
30 31 32 33 34 35 36 37 38 39 40
# File 'opal/lib/opal/nodes/yield.rb', line 30 def find_yielding_scope working = scope while working if working.block_name || working.def? break end working = working.parent end working end
#uses_splat?(children) ⇒ Boolean
Returns:
- (Boolean)
46 47 48
# File 'opal/lib/opal/nodes/yield.rb', line 46 def uses_splat?(children) children.any? { |child| child.type == :splat } end
#yields_single_arg?(children) ⇒ Boolean
Returns:
- (Boolean)
42 43 44
# File 'opal/lib/opal/nodes/yield.rb', line 42 def yields_single_arg?(children) !uses_splat?(children) && children.size == 1 end