module RuboCop::Cop::IndexMethod

def execute_correction(corrector, node, correction)

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

def extract_captures(match)

def extract_captures(match)
  argname, body_expr = *match
  Captures.new(argname, body_expr)
end

def handle_possible_offense(node, match, match_desc)

def handle_possible_offense(node, match, match_desc)
  captures = extract_captures(match)
  return if captures.noop_transformation?
  add_offense(
    node, message: "Prefer `#{new_method_name}` over `#{match_desc}`."
  ) do |corrector|
    correction = prepare_correction(node)
    execute_correction(corrector, node, correction)
  end
end

def new_method_name

def new_method_name
  raise NotImplementedError
end

def on_bad_each_with_object(_node)

Other tags:
    Abstract: - Implemented with `def_node_matcher`
def on_bad_each_with_object(_node)
  raise NotImplementedError
end

def on_bad_hash_brackets_map(_node)

Other tags:
    Abstract: - Implemented with `def_node_matcher`
def on_bad_hash_brackets_map(_node)
  raise NotImplementedError
end

def on_bad_map_to_h(_node)

Other tags:
    Abstract: - Implemented with `def_node_matcher`
def on_bad_map_to_h(_node)
  raise NotImplementedError
end

def on_bad_to_h(_node)

Other tags:
    Abstract: - Implemented with `def_node_matcher`
def on_bad_to_h(_node)
  raise NotImplementedError
end

def on_block(node)

def on_block(node)
  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) do |*match|
    handle_possible_offense(node, match, 'to_h { ... }')
  end
end

def on_csend(node)

def on_csend(node)
  on_bad_map_to_h(node) do |*match|
    handle_possible_offense(node, match, 'map { ... }.to_h')
  end
end

def on_send(node)

def on_send(node)
  on_bad_map_to_h(node) do |*match|
    handle_possible_offense(node, match, 'map { ... }.to_h')
  end
  on_bad_hash_brackets_map(node) do |*match|
    handle_possible_offense(node, match, 'Hash[map { ... }]')
  end
end

def prepare_correction(node)

def prepare_correction(node)
  if (match = on_bad_each_with_object(node))
    Autocorrection.from_each_with_object(node, match)
  elsif (match = on_bad_to_h(node))
    Autocorrection.from_to_h(node, match)
  elsif (match = on_bad_map_to_h(node))
    Autocorrection.from_map_to_h(node, match)
  elsif (match = on_bad_hash_brackets_map(node))
    Autocorrection.from_hash_brackets_map(node, match)
  else
    raise 'unreachable'
  end
end