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
    if needs_closure?
      if scope.await_encountered
        wrap '(await (async function() {', '})())'
      else
        wrap '(function() {', '})()'
      end
    end
  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|
    next unless 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
  # if we are having a closure, we must return a usable value
  if needs_closure? && !handled_else
    line
    push 'else { return nil }'
  end
end

def needs_closure?

def needs_closure?
  !stmt?
end