class Opal::Nodes::WhileNode

def compile

def compile
  test_code = js_truthy(test)
  @redo_var = scope.new_temp if uses_redo?
  compiler.in_while do
    while_loop[:closure] = true if wrap_in_closure?
    while_loop[:redo_var] = @redo_var
    in_closure(Closure::LOOP | Closure::JS_LOOP | (wrap_in_closure? ? Closure::JS_FUNCTION : 0)) do
      in_closure(Closure::LOOP_INSIDE | Closure::JS_LOOP_INSIDE) do
        line(indent { stmt(body) })
      end
      if uses_redo?
        compile_with_redo(test_code)
      else
        compile_without_redo(test_code)
      end
    end
  end
  scope.queue_temp(@redo_var) if uses_redo?
  if wrap_in_closure?
    if scope.await_encountered
      wrap '(await (async function() {', '; return nil; })())'
    else
      wrap '(function() {', '; return nil; })()'
    end
  end
end