Class: Ikra::Translator::LastStatementReturnsVisitor

Inherits:
AST::Visitor show all
Defined in:
lib/translator/last_returns_visitor.rb

Overview

Visitor that replaces implicit returns with explicit ones

Instance Method Summary collapse

Methods inherited from AST::Visitor

#visit_array_node, #visit_block_def_node, #visit_class_def_node, #visit_const_node, #visit_hash_node, #visit_ivar_read_node, #visit_meth_def_node, #visit_node, #visit_program_node, #visit_source_code_expr_node, #visit_string_node, #visit_symbol_node, #visit_ternary_node, #visit_until_node, #visit_until_post_node, #visit_var_def_node, #visit_while_node, #visit_while_post_node

Instance Method Details

#process_node(node) ⇒ Object



61
62
63
# File 'lib/translator/last_returns_visitor.rb', line 61

def process_node(node)
    node.parent.replace_child(node, AST::ReturnNode.new(value: node))
end

#visit_begin_node(node) ⇒ Object



49
50
51
# File 'lib/translator/last_returns_visitor.rb', line 49

def visit_begin_node(node)
    node.body_stmts.last.accept(self)
end

#visit_bool_node(node) ⇒ Object



28
29
30
# File 'lib/translator/last_returns_visitor.rb', line 28

def visit_bool_node(node)
    process_node(node)
end

#visit_break_node(node) ⇒ Object

Raises:



40
41
42
# File 'lib/translator/last_returns_visitor.rb', line 40

def visit_break_node(node)
    raise AssertionError.new("Break must not be a return value")
end

#visit_float_node(node) ⇒ Object



24
25
26
# File 'lib/translator/last_returns_visitor.rb', line 24

def visit_float_node(node)
    process_node(node)
end

#visit_for_node(node) ⇒ Object

Raises:

  • (NotImplementedError)


36
37
38
# File 'lib/translator/last_returns_visitor.rb', line 36

def visit_for_node(node)
    raise NotImplementedError.new("Cannot handle for loop as return value")
end

#visit_if_node(node) ⇒ Object



44
45
46
47
# File 'lib/translator/last_returns_visitor.rb', line 44

def visit_if_node(node)
    node.true_body_stmts.accept(self)
    node.false_body_stmts.accept(self)
end

#visit_int_node(node) ⇒ Object



20
21
22
# File 'lib/translator/last_returns_visitor.rb', line 20

def visit_int_node(node)
    process_node(node)
end

#visit_lvar_read_node(node) ⇒ Object



12
13
14
# File 'lib/translator/last_returns_visitor.rb', line 12

def visit_lvar_read_node(node)
    process_node(node)
end

#visit_lvar_write_node(node) ⇒ Object



16
17
18
# File 'lib/translator/last_returns_visitor.rb', line 16

def visit_lvar_write_node(node)
    process_node(node)
end

#visit_nil_node(node) ⇒ Object



32
33
34
# File 'lib/translator/last_returns_visitor.rb', line 32

def visit_nil_node(node)
    process_node(node)
end

#visit_return_node(node) ⇒ Object



57
58
59
# File 'lib/translator/last_returns_visitor.rb', line 57

def visit_return_node(node)
    # Do nothing
end

#visit_root_node(node) ⇒ Object



8
9
10
# File 'lib/translator/last_returns_visitor.rb', line 8

def visit_root_node(node)
    node.single_child.accept(self)
end

#visit_send_node(node) ⇒ Object



53
54
55
# File 'lib/translator/last_returns_visitor.rb', line 53

def visit_send_node(node)
    process_node(node)
end