require_relative "normalizer" module Ruby # The if must have condition and a true branch, the false is optional # # It maps pretty much one to one to a Vool, except for "hoisting" # # Ruby may have super complex expressions as the condition, whereas # Vool may not. Ie of a Statement list all but the last are hoisted to before # the vool if. This is equivalent, just easier to compile later # # The hoisintg code is in Normalizer, as it is also useed in return and while class IfStatement < Statement include Normalizer attr_reader :condition , :if_true , :if_false def initialize( cond , if_true , if_false = nil) @condition = cond @if_true = if_true @if_false = if_false end def to_vool cond , hoisted = *normalized_vool(@condition) me = Vool::IfStatement.new(cond , @if_true&.to_vool, @if_false&.to_vool) return me unless hoisted Vool::Statements.new( hoisted ) << me end def has_false? @if_false != nil end def has_true? @if_true != nil end def to_s(depth = 0) parts = ["if(#{@condition})" ] parts << @if_true.to_s(depth + 1) if(@if_true) parts += ["else" , @if_false.to_s(depth + 1)] if(@if_false) parts << "end" at_depth(depth , *parts ) end end end