module RuboCop::Cop::HashTransformMethod

Common functionality for Style/HashTransformKeys and Style/HashTransformValues

Constants

Autocorrection

Internal helper class to hold autocorrect data

Captures

Internal helper class to hold match data

RESTRICT_ON_SEND

Public Instance Methods

on_block(node) click to toggle source
# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 17
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
  on_bad_each_with_object(node) do |*match|
    handle_possible_offense(node, match, 'each_with_object')
  end

  return if target_ruby_version < 2.6

  on_bad_to_h(node) { |*match| handle_possible_offense(node, match, 'to_h {...}') }
end
on_csend(node) click to toggle source
# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 34
def on_csend(node)
  on_bad_map_to_h(node) { |*match| handle_possible_offense(node, match, 'map {...}.to_h') }
end
on_send(node) click to toggle source
# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 27
def on_send(node)
  on_bad_hash_brackets_map(node) do |*match|
    handle_possible_offense(node, match, 'Hash[_.map {...}]')
  end
  on_bad_map_to_h(node) { |*match| handle_possible_offense(node, match, 'map {...}.to_h') }
end

Private Instance Methods

execute_correction(corrector, node, correction) click to toggle source
# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 108
def execute_correction(corrector, node, correction)
  correction.strip_prefix_and_suffix(node, corrector)
  correction.set_new_method_name(new_method_name, corrector)

  captures = extract_captures(correction.match)
  correction.set_new_arg_name(captures.transformed_argname, corrector)
  correction.set_new_body_expression(captures.transforming_body_expr, corrector)
end
extract_captures(_match) click to toggle source

@abstract

@return [Captures]

# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 83
def extract_captures(_match)
  raise NotImplementedError
end
handle_possible_offense(node, match, match_desc) click to toggle source
# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 60
def handle_possible_offense(node, match, match_desc)
  captures = extract_captures(match)

  # If key didn't actually change either, this is most likely a false
  # positive (receiver isn't a hash).
  return if captures.noop_transformation?

  # Can't `transform_keys` if key transformation uses value, or
  # `transform_values` if value transformation uses key.
  return if captures.transformation_uses_both_args?

  return unless captures.use_transformed_argname?

  message = "Prefer `#{new_method_name}` over `#{match_desc}`."
  add_offense(node, message: message) do |corrector|
    correction = prepare_correction(node)
    execute_correction(corrector, node, correction)
  end
end
new_method_name() click to toggle source

@abstract

@return [String]

# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 90
def new_method_name
  raise NotImplementedError
end
on_bad_each_with_object(_node) click to toggle source

@abstract Implemented with `def_node_matcher`

# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 41
def on_bad_each_with_object(_node)
  raise NotImplementedError
end
on_bad_hash_brackets_map(_node) click to toggle source

@abstract Implemented with `def_node_matcher`

# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 46
def on_bad_hash_brackets_map(_node)
  raise NotImplementedError
end
on_bad_map_to_h(_node) click to toggle source

@abstract Implemented with `def_node_matcher`

# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 51
def on_bad_map_to_h(_node)
  raise NotImplementedError
end
on_bad_to_h(_node) click to toggle source

@abstract Implemented with `def_node_matcher`

# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 56
def on_bad_to_h(_node)
  raise NotImplementedError
end
prepare_correction(node) click to toggle source
# File lib/rubocop/cop/mixin/hash_transform_method.rb, line 94
def prepare_correction(node)
  if (match = on_bad_each_with_object(node))
    Autocorrection.from_each_with_object(node, match)
  elsif (match = on_bad_hash_brackets_map(node))
    Autocorrection.from_hash_brackets_map(node, match)
  elsif (match = on_bad_map_to_h(node))
    Autocorrection.from_map_to_h(node, match)
  elsif (match = on_bad_to_h(node))
    Autocorrection.from_to_h(node, match)
  else
    raise 'unreachable'
  end
end