class RuboCop::Cop::Lint::DuplicateSetElement

Checks for duplicate literal, constant, or variable elements in Set.

@example

# bad
Set[:foo, :bar, :foo]

# good
Set[:foo, :bar]

# bad
Set.new([:foo, :bar, :foo])

# good
Set.new([:foo, :bar])

# bad
[:foo, :bar, :foo].to_set

# good
[:foo, :bar].to_set

Constants

MSG
RESTRICT_ON_SEND

Public Instance Methods

on_csend(node)
Alias for: on_send
on_send(node) click to toggle source
# File lib/rubocop/cop/lint/duplicate_set_element.rb, line 43
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
Also aliased as: on_csend

Private Instance Methods

register_offense(current_element, prev_element) click to toggle source
# File lib/rubocop/cop/lint/duplicate_set_element.rb, line 64
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