Module: RLSL::Prism::Emitters::BaseEmitter::ControlFlowEmission
- Included in:
- RLSL::Prism::Emitters::BaseEmitter
- Defined in:
- lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb
Instance Method Summary collapse
- #elsif_node?(node) ⇒ Boolean
- #emit_break(_node) ⇒ Object
- #emit_conditional(node, needs_return:) ⇒ Object
- #emit_elsif(node, needs_return: false) ⇒ Object
- #emit_for_loop(node) ⇒ Object
- #emit_if_statement(node) ⇒ Object
- #emit_return(node) ⇒ Object
- #emit_tuple_return(node) ⇒ Object
- #emit_while_loop(node) ⇒ Object
Instance Method Details
#elsif_node?(node) ⇒ Boolean
48 49 50 51 52 53 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 48 def elsif_node?(node) return true if node.is_a?(IR::IfStatement) return false unless node.is_a?(IR::Block) node.statements.length == 1 && node.statements.first.is_a?(IR::IfStatement) end |
#emit_break(_node) ⇒ Object
75 76 77 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 75 def emit_break(_node) "break" end |
#emit_conditional(node, needs_return:) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 17 def emit_conditional(node, needs_return:) condition = emit(node.condition) then_code = emit_branch(node.then_branch, needs_return: needs_return) return "#{indent}if (#{condition}) {\n#{then_code}#{indent}}#{needs_return ? "\n" : ""}" unless node.else_branch if elsif_node?(node.else_branch) elsif_code = emit_elsif(node.else_branch, needs_return: needs_return) "#{indent}if (#{condition}) {\n#{then_code}#{indent}} #{elsif_code}#{needs_return ? "\n" : ""}" else else_code = emit_branch(node.else_branch, needs_return: needs_return) "#{indent}if (#{condition}) {\n#{then_code}#{indent}} else {\n#{else_code}#{indent}}#{needs_return ? "\n" : ""}" end end |
#emit_elsif(node, needs_return: false) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 32 def emit_elsif(node, needs_return: false) if_node = node.is_a?(IR::Block) ? node.statements.first : node condition = emit(if_node.condition) then_code = emit_branch(if_node.then_branch, needs_return: needs_return) return "else if (#{condition}) {\n#{then_code}#{indent}}" unless if_node.else_branch if elsif_node?(if_node.else_branch) elsif_code = emit_elsif(if_node.else_branch, needs_return: needs_return) "else if (#{condition}) {\n#{then_code}#{indent}} #{elsif_code}" else else_code = emit_branch(if_node.else_branch, needs_return: needs_return) "else if (#{condition}) {\n#{then_code}#{indent}} else {\n#{else_code}#{indent}}" end end |
#emit_for_loop(node) ⇒ Object
59 60 61 62 63 64 65 66 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 59 def emit_for_loop(node) var = node.variable start_val = emit(node.range_start) end_val = emit(node.range_end) body = emit_indented_block(node.body) "for (int #{var} = #{start_val}; #{var} < #{end_val}; #{var}++) {\n#{body}#{indent}}" end |
#emit_if_statement(node) ⇒ Object
13 14 15 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 13 def emit_if_statement(node) emit_conditional(node, needs_return: return_context?) end |
#emit_return(node) ⇒ Object
55 56 57 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 55 def emit_return(node) node.expression ? "return #{emit(node.expression)}" : "return" end |
#emit_tuple_return(node) ⇒ Object
8 9 10 11 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 8 def emit_tuple_return(node) elements = node.elements.map { |elem| emit(elem) }.join(", ") "#{indent}return (#{current_return_struct_name}){#{elements}};\n" end |
#emit_while_loop(node) ⇒ Object
68 69 70 71 72 73 |
# File 'lib/rlsl/prism/emitters/base_emitter/control_flow_emission.rb', line 68 def emit_while_loop(node) condition = emit(node.condition) body = emit_indented_block(node.body) "while (#{condition}) {\n#{body}#{indent}}" end |