Class: Opal::Nodes::IterNode
  
  
  
  Instance Attribute Summary
  
  Attributes inherited from NodeWithArgs
  #arity, #original_args, #used_kwargs
  
  
  Attributes inherited from ScopeNode
  #await_encountered, #block_name, #catch_return, #defs, #gvars, #has_break, #has_retry, #identity, #ivars, #locals, #methods, #mid, #name, #parent, #rescue_else_sexp, #scope_name
  
  
  Attributes inherited from Base
  #compiler, #sexp, #type
  
    
      Instance Method Summary
      collapse
    
    
  
  
  
  
  
  
  
  
  
  
  #compile_arity_check, #initialize, #parameters_code
  
  
  
  
  
  
  
  
  Methods inherited from ScopeNode
  #accepts_using?, #add_arg, #add_proto_ivar, #add_scope_gvar, #add_scope_ivar, #add_scope_local, #add_scope_temp, #class?, #class_scope?, #collect_refinements_temps, #current_rescue, #def?, #def_in_class?, #defines_lambda, #find_parent_def, #gen_retry_id, #has_local?, #has_rescue_else?, #has_temp?, #identify!, #in_ensure, #in_ensure?, #in_resbody, #in_resbody?, #in_rescue, #in_scope, #in_while?, #initialize, #is_lambda!, #iter?, #lambda?, #lambda_definition?, #module?, #nesting, #new_refinements_temp, #new_temp, #next_temp, #pop_while, #prepare_block, #push_while, #queue_temp, #refinements_temp, #relative_access, #sclass?, #scope_locals, #self, #super_chain, #to_vars, #top?, #uses_block!, #uses_block?
  
  
  
  
  
  
  
  
  Methods inherited from Base
  #add_gvar, #add_ivar, #add_local, #add_temp, #children, children, #class_variable_owner, #class_variable_owner_nesting_level, #comments, #compile_to_fragments, #error, #expr, #expr?, #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 Helpers
  #conditional_send, #current_indent, #empty_line, #indent, #js_truthy, #js_truthy_optimize, #line, #mid_to_jsid, #property, #valid_name?
  
    Instance Method Details
    
      
  
  
    #arity_check_node  ⇒ Object 
  
  
  
  
    | 
131
132
133 | # File 'opal/lib/opal/nodes/iter.rb', line 131
def arity_check_node
  s(:iter_arity_check, original_args)
end | 
 
    
      
  
  
    #compile  ⇒ Object 
  
  
  
  
    | 
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 | # File 'opal/lib/opal/nodes/iter.rb', line 13
def compile
  is_lambda! if scope.lambda_definition?
  inline_params = nil
  to_vars = identity = body_code = nil
  in_scope do
    identity = scope.identify!
    inline_params = process(inline_args)
    compile_arity_check
    body_code = stmt(returned_body)
    add_temp "self = #{identity}.$$s == null ? this : #{identity}.$$s" if @define_self
    to_vars = scope.to_vars
    line body_code
    if scope.catch_return
      unshift "try {\n"
      line '} catch ($returner) { if ($returner === Opal.returner) { return $returner.$v }'
      push ' throw $returner; }'
    end
  end
  unshift to_vars
  if await_encountered
    unshift "async function #{identity}(", inline_params, '){'
  else
    unshift "function #{identity}(", inline_params, '){'
  end
  push '}'
  blockopts = []
  blockopts << "$$arity: #{arity}"
  blockopts << "$$s: #{scope.self}" if @define_self
  blockopts << "$$brk: $brk" if contains_break?
  if compiler.arity_check?
    blockopts << "$$parameters: #{parameters_code}"
  end
                  if has_top_level_mlhs_arg?
    blockopts << "$$has_top_level_mlhs_arg: true"
  end
  if has_trailing_comma_in_args?
    blockopts << "$$has_trailing_comma_in_args: true"
  end
  if blockopts.length == 1
    push ", #{arity}"
  elsif blockopts.length > 1
    push ', {', blockopts.join(', '), '}'
  end
  scope.nesting if @define_nesting
  scope.relative_access if @define_relative_access
end | 
 
    
      
  
  
    #compile_block_arg  ⇒ Object 
  
  
  
  
    | 
86
87
88
89
90 | # File 'opal/lib/opal/nodes/iter.rb', line 86
def compile_block_arg
  if block_arg
    scope.prepare_block
  end
end | 
 
    
      
  
  
    #contains_break?  ⇒ Boolean 
  
  
  
  
    | 
135
136
137
138
139 | # File 'opal/lib/opal/nodes/iter.rb', line 135
def contains_break?
  finder = Opal::Rewriters::BreakFinder.new
  finder.process(@sexp)
  finder.found_break?
end | 
 
    
      
  
  
    | 
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 | # File 'opal/lib/opal/nodes/iter.rb', line 92
def 
  valid_args = []
  caught_blank_argument = false
  args.children.each do |arg|
    arg_name = arg.children.first
    if arg_name == :_
      unless caught_blank_argument
        caught_blank_argument = true
        valid_args << arg
      end
    else
      valid_args << arg
    end
  end
  @sexp = @sexp.updated(
    nil, [
      args.updated(nil, valid_args),
      body
    ]
  )
end | 
 
    
      
  
  
    #has_top_level_mlhs_arg?  ⇒ Boolean 
  
  
  
  
    | 
120
121
122 | # File 'opal/lib/opal/nodes/iter.rb', line 120
def has_top_level_mlhs_arg?
  original_args.children.any? { |arg| arg.type == :mlhs }
end | 
 
    
      
  
  
    #has_trailing_comma_in_args?  ⇒ Boolean 
  
  
  
  
    | 
124
125
126
127
128
129 | # File 'opal/lib/opal/nodes/iter.rb', line 124
def has_trailing_comma_in_args?
  if original_args.loc && original_args.loc.expression
    args_source = original_args.loc.expression.source
    args_source.match(/,\s*\|/)
  end
end | 
 
    
      
  
  
    #returned_body  ⇒ Object 
  
  
  
  
    | 
116
117
118 | # File 'opal/lib/opal/nodes/iter.rb', line 116
def returned_body
  compiler.returns(body || s(:nil))
end |