class Rufo::Formatter

def visit_hash_pattern(node)

def visit_hash_pattern(node)
  _, const_ref, elements, rest = node
  if const_ref
    visit const_ref
  end
  token_column = current_token_column
  need_space = false
  expected_right_token = nil
  if const_ref
    if current_token_kind == :on_lparen
      consume_token :on_lparen
      expected_right_token = :on_rparen
    else
      consume_token :on_lbracket
      expected_right_token = :on_rbracket
    end
  elsif current_token_kind == :on_lbrace
    expected_right_token = :on_rbrace
    closing_brace_token, _ = find_closing_brace_token
    need_space = need_space_for_hash?(node, [*elements, rest].compact, closing_brace_token)
    consume_token :on_lbrace
    brace_position = @output.length - 1
    consume_space if need_space
  end
  # pattern is {}
  empty = !const_ref && !elements && !rest
  if empty
    consume_token :on_rbrace
    return
  end
  # pattern is {**}
  empty = !const_ref && elements.empty? && !rest
  if empty
    consume_space
    consume_op "**"
    consume_space
    consume_token :on_rbrace
    return
  end
  visit_literal_elements elements, inside_hash: true, token_column: token_column, keep_final_newline: expected_right_token.nil? do |element|
    key, value = element
    if current_token_kind == :on_tstring_beg
      consume_token :on_tstring_beg
      visit key
      consume_token :on_label_end
    else
      visit key
    end
    if value
      consume_space
      visit value
    end
  end
  if rest || op?("**") || comma?
    unless elements.empty?
      write ","
    end
    skip_space_or_newline
    if rest || op?("**")
      consume_space
      consume_op "**"
      if rest
        visit rest
      end
    end
  end
  unless expected_right_token.nil?
    skip_space
    if expected_right_token == :on_rbrace
      # in some case, need_space_for_hash? might be unexpected behaviour for some patterns, example:
      #   { a: 1,
      #     ** }
      # so re-check need_space? at here, and insert a space in the missing position if needed.
      char_after_brace = @output[brace_position + 1]
      if !need_space && !["\n", " "].include?(char_after_brace)
        need_space = true
        @output.insert(brace_position + 1, " ")
      end
    end
    check expected_right_token
    right = current_token_value
    write " " if need_space
    write right
    next_token
  end
end