Class: RuboCop::Cop::Custom::HashValueOmission

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/custom/hash_value_omission.rb

Overview

Enforces hash value omission syntax introduced in Ruby 3.1 When a hash key and value have the same name, use the shorthand syntax.

Examples:

# bad
{ controller: controller }
{ foo: foo, bar: bar }

# good
{ controller: }
{ foo:, bar: }

Constant Summary collapse

MSG =
"Use hash value omission (`%<key>s:`) when the value is the same-named local variable."

Instance Method Summary collapse

Instance Method Details

#already_omitted?(node, key_name) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
44
# File 'lib/rubocop/cop/custom/hash_value_omission.rb', line 41

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

#on_pair(node) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/rubocop/cop/custom/hash_value_omission.rb', line 22

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

#same_name?(node, key_name) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
# File 'lib/rubocop/cop/custom/hash_value_omission.rb', line 46

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

#valid_pair_for_omission?(node) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
37
38
39
# File 'lib/rubocop/cop/custom/hash_value_omission.rb', line 34

def valid_pair_for_omission?(node)
  key = node.key
  value = node.value

  key.sym_type? && value&.lvar_type?
end