Class: Opal::Nodes::CaseNode
- Inherits:
-
Base
- Object
- Base
- Opal::Nodes::CaseNode
show all
- Defined in:
- opal/lib/opal/nodes/case.rb
Instance Attribute Summary
Attributes inherited from Base
#compiler, #sexp, #type
Instance Method Summary
collapse
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_falsy, #js_truthy, #js_truthy_optimize, #line, #mid_to_jsid, #property, #valid_name?
Instance Method Details
#case_parts ⇒ Object
62
63
64
|
# File 'opal/lib/opal/nodes/case.rb', line 62
def case_parts
children[1..-1]
end
|
#case_stmt ⇒ Object
66
67
68
|
# File 'opal/lib/opal/nodes/case.rb', line 66
def case_stmt
compiler.case_stmt
end
|
#compile ⇒ Object
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# File 'opal/lib/opal/nodes/case.rb', line 12
def compile
compiler.in_case do
compile_code
if needs_closure?
if scope.await_encountered
wrap '(await (async function() {', '})())'
else
wrap '(function() {', '})()'
end
end
end
end
|
#compile_code ⇒ Object
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
|
# File 'opal/lib/opal/nodes/case.rb', line 26
def compile_code
handled_else = false
if condition
case_stmt[:cond] = true
add_local '$case'
push '$case = ', expr(condition), ';'
end
case_parts.each_with_index do |wen, idx|
next unless wen
line
case wen.type
when :when
wen = compiler.returns(wen) if needs_closure?
push 'else ' unless idx == 0
push stmt(wen)
else handled_else = true
wen = compiler.returns(wen) if needs_closure?
push 'else {', stmt(wen), '}'
end
end
if needs_closure? && !handled_else
line
push 'else { return nil }'
end
end
|
#needs_closure? ⇒ Boolean
58
59
60
|
# File 'opal/lib/opal/nodes/case.rb', line 58
def needs_closure?
!stmt?
end
|