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, #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_while?, #initialize, #process, #push, #recv, #recv?, #s, #scope, #stmt, #stmt?, 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
56
57
58
|
# File 'opal/lib/opal/nodes/case.rb', line 56
def case_parts
children[1..-1]
end
|
#case_stmt ⇒ Object
60
61
62
|
# File 'opal/lib/opal/nodes/case.rb', line 60
def case_stmt
compiler.case_stmt
end
|
#compile ⇒ Object
12
13
14
15
16
17
18
|
# File 'opal/lib/opal/nodes/case.rb', line 12
def compile
compiler.in_case do
compile_code
wrap '(function() {', '})()' if needs_closure?
end
end
|
#compile_code ⇒ Object
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
|
# File 'opal/lib/opal/nodes/case.rb', line 20
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
52
53
54
|
# File 'opal/lib/opal/nodes/case.rb', line 52
def needs_closure?
!stmt?
end
|