class RuboCop::Cop::Custom::HashValueOmission

{ foo:, bar: }
{ controller: }
# good
{ foo: foo, bar: bar }
{ controller: controller }
# bad
@example
When a hash key and value have the same name, use the shorthand syntax.
Enforces hash value omission syntax introduced in Ruby 3.1

def already_omitted?(node, key_name)

def already_omitted?(node, key_name)
  source = node.source.strip
  source == "#{key_name}:"
end

def on_pair(node)

def on_pair(node)
  return unless valid_pair_for_omission?(node)
  key_name = node.key.value.to_s
  return if already_omitted?(node, key_name)
  return unless same_name?(node, key_name)
  add_offense(node, message: format(MSG, key: key_name)) do |corrector|
    corrector.replace(node.source_range, "#{key_name}:")
  end
end

def same_name?(node, key_name)

def same_name?(node, key_name)
  value_name = node.value.source
  key_name == value_name
end

def valid_pair_for_omission?(node)

def valid_pair_for_omission?(node)
  key = node.key
  value = node.value
  key.sym_type? && value&.lvar_type?
end