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