class RuboCop::Cop::Lint::DuplicateSetElement
[:foo, :bar].to_set
# good
[:foo, :bar, :foo].to_set
# bad
Set.new([:foo, :bar])
# good
Set.new([:foo, :bar, :foo])
# bad
Set[:foo, :bar]
# good
Set[:foo, :bar, :foo]
# bad
@example
Checks for duplicate literal, constant, or variable elements in Set.
def on_send(node)
def on_send(node) return unless (set_elements = set_init_elements(node)) seen_elements = Set[] set_elements.each_with_index do |set_element, index| # NOTE: Skip due to the possibility of corner cases where Set elements # may have changing return values if they are not literals, constants, or variables. next if !set_element.literal? && !set_element.const_type? && !set_element.variable? if seen_elements.include?(set_element) register_offense(set_element, set_elements[index - 1]) else seen_elements << set_element end end end
def register_offense(current_element, prev_element)
def register_offense(current_element, prev_element) add_offense(current_element) do |corrector| range = prev_element.source_range.end.join(current_element.source_range.end) corrector.remove(range) end end