class Opal::Nodes::CaseNode

def case_parts

def case_parts
  children[1..-1]
end

def case_stmt

def case_stmt
  compiler.case_stmt
end

def compile

def compile
  compiler.in_case do
    compile_code
    wrap '(function() {', '})()' if needs_closure?
  end
end

def compile_code

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|
    if wen
      line
      case wen.type
      when :when
        wen = compiler.returns(wen) if needs_closure?
        push "else " unless idx == 0
        push stmt(wen)
      else # s(:else)
        handled_else = true
        wen = compiler.returns(wen) if needs_closure?
        push "else {", stmt(wen), "}"
      end
    end
  end
  # if we are having a closure, we must return a usable value
  if needs_closure? and !handled_else
    line
    push "else { return nil }"
  end
end

def needs_closure?

def needs_closure?
  !stmt?
end