Module: RLSL::Prism::Emitters::BaseEmitter::StatementEmission

Included in:
RLSL::Prism::Emitters::BaseEmitter
Defined in:
lib/rlsl/prism/emitters/base_emitter/statement_emission.rb

Instance Method Summary collapse

Instance Method Details

#emit_block(node, needs_return = nil) ⇒ Object



8
9
10
11
12
13
# File 'lib/rlsl/prism/emitters/base_emitter/statement_emission.rb', line 8

def emit_block(node, needs_return = nil)
  statements = node.statements
  return "" if statements.empty?

  emit_statements(statements, returning: needs_return.nil? ? return_context? : needs_return)
end

#emit_branch(node, needs_return:) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/rlsl/prism/emitters/base_emitter/statement_emission.rb', line 36

def emit_branch(node, needs_return:)
  with_indent do
    if node.is_a?(IR::Block)
      emit(node, needs_return: needs_return)
    else
      emit_statement(node, needs_return: needs_return)
    end
  end
end

#emit_indented_block(node, needs_return: false) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/rlsl/prism/emitters/base_emitter/statement_emission.rb', line 46

def emit_indented_block(node, needs_return: false)
  with_indent do
    if node.is_a?(IR::Block)
      emit(node, needs_return: needs_return)
    else
      emit_statement(node, needs_return: needs_return)
    end
  end
end

#emit_statement(node, needs_return: false) ⇒ Object



22
23
24
25
26
# File 'lib/rlsl/prism/emitters/base_emitter/statement_emission.rb', line 22

def emit_statement(node, needs_return: false)
  return emit_terminal_statement(node) if needs_return

  "#{indent}#{emit(node)}#{statement_terminator(node)}"
end

#emit_statements(statements, returning:) ⇒ Object



15
16
17
18
19
20
# File 'lib/rlsl/prism/emitters/base_emitter/statement_emission.rb', line 15

def emit_statements(statements, returning:)
  return statements.map { |statement| emit_statement(statement) }.join unless returning

  leading = statements[0...-1].map { |statement| emit_statement(statement) }.join
  leading + emit_terminal_statement(statements.last)
end

#emit_terminal_statement(node) ⇒ Object



28
29
30
31
32
33
34
# File 'lib/rlsl/prism/emitters/base_emitter/statement_emission.rb', line 28

def emit_terminal_statement(node)
  return emit(node, needs_return: true) if node.is_a?(IR::IfStatement)
  return emit_statement(node) if terminal_passthrough_node?(node)
  return emit_tuple_return(node) if node.is_a?(IR::ArrayLiteral)

  "#{indent}return #{emit(node)};\n"
end