class RuboCop::Cop::Style::MapToSet


[1, 2, 3].to_set { |i| i.to_s }
# good
[1, 2, 3].collect { |i| i.to_s }.to_set
# bad
something.to_set { |i| i * 2 }
# good
something.map { |i| i * 2 }.to_set
# bad
@example
is not an ‘Enumerable`.
This cop is unsafe, as it can produce false positives if the receiver
@safety
written with just `to_set`.
Looks for uses of `map.to_set` or `collect.to_set` that could be

def autocorrect(corrector, to_set, map)

def autocorrect(corrector, to_set, map)
  removal_range = range_between(to_set.loc.dot.begin_pos, to_set.loc.selector.end_pos)
  corrector.remove(range_with_surrounding_space(removal_range, side: :left))
  corrector.replace(map.loc.selector, 'to_set')
end

def on_send(node)

def on_send(node)
  return unless (to_set_node, map_node = map_to_set?(node))
  message = format(MSG, method: map_node.loc.selector.source)
  add_offense(map_node.loc.selector, message: message) do |corrector|
    # If the `to_set` call already has a block, do not autocorrect.
    next if to_set_node.block_node
    autocorrect(corrector, to_set_node, map_node)
  end
end