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

def compile_while(test_code, redo_code = nil)

def compile_while(test_code, redo_code = nil)
  unshift redo_code if redo_code
  unshift while_open, test_code, while_close
  unshift redo_code if redo_code
  line '}'
end

def compile_with_redo(test_code)

def compile_with_redo(test_code)
  compile_while(test_code, "#{@redo_var} = false;")
end

def compile_without_redo(test_code)

def compile_without_redo(test_code)
  compile_while(test_code)
end

def uses_redo?

def uses_redo?
  @sexp.meta[:has_redo]
end

def while_close

def while_close
  ') {'
end

def while_open

def while_open
  if uses_redo?
    redo_part = "#{@redo_var} || "
  end
  "while (#{redo_part}"
end

def wrap_in_closure?

def wrap_in_closure?
  expr? || recv?
end