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
|