class RuboCop::Cop::Lint::UnneededSplatExpansion

This cop checks for unneeded usages of splat expansion

@example

# bad

a = *[1, 2, 3]
a = *'a'
a = *1

begin
  foo
rescue *[StandardError, ApplicationError]
  bar
end

case foo
when *[1, 2, 3]
  bar
else
  baz
end

@example

# good

c = [1, 2, 3]
a = *c
a, b = *c
a, *b = *c
a = *1..10
a = ['a']

begin
  foo
rescue StandardError, ApplicationError
  bar
end

case foo
when *[1, 2, 3]
  bar
else
  baz
end

Constants

ARRAY_NEW_PATTERN
ARRAY_PARAM_MSG
ASSIGNMENT_TYPES
MSG
PERCENT_CAPITAL_I
PERCENT_CAPITAL_W
PERCENT_I
PERCENT_W

Public Instance Methods

on_splat(node) click to toggle source
# File lib/rubocop/cop/lint/unneeded_splat_expansion.rb, line 65
def on_splat(node)
  literal_expansion?(node) do |object|
    if object.send_type?
      return unless ASSIGNMENT_TYPES.include?(node.parent.parent.type)
    end

    if array_splat?(node) &&
       (method_argument?(node) || part_of_an_array?(node))
      add_offense(node, message: ARRAY_PARAM_MSG)
    else
      add_offense(node)
    end
  end
end

Private Instance Methods

array_splat?(node) click to toggle source
# File lib/rubocop/cop/lint/unneeded_splat_expansion.rb, line 97
def array_splat?(node)
  node.children.first.array_type?
end
autocorrect(node) click to toggle source
# File lib/rubocop/cop/lint/unneeded_splat_expansion.rb, line 82
def autocorrect(node)
  variable, = *node
  loc = node.loc

  lambda do |corrector|
    if !variable.array_type?
      corrector.replace(loc.expression, "[#{variable.source}]")
    elsif unneeded_brackets?(node)
      corrector.replace(loc.expression, remove_brackets(variable))
    else
      corrector.remove(loc.operator)
    end
  end
end
method_argument?(node) click to toggle source
# File lib/rubocop/cop/lint/unneeded_splat_expansion.rb, line 101
def method_argument?(node)
  node.parent.send_type?
end
part_of_an_array?(node) click to toggle source
# File lib/rubocop/cop/lint/unneeded_splat_expansion.rb, line 105
def part_of_an_array?(node)
  # The parent of a splat expansion is an array that does not have
  # `begin` or `end`
  parent = node.parent
  parent.array_type? && parent.loc.begin && parent.loc.end
end
remove_brackets(array) click to toggle source
# File lib/rubocop/cop/lint/unneeded_splat_expansion.rb, line 120
def remove_brackets(array)
  array_start = array.loc.begin.source
  elements = *array
  elements = elements.map(&:source)

  if array_start.start_with?(PERCENT_W)
    "'#{elements.join("', '")}'"
  elsif array_start.start_with?(PERCENT_CAPITAL_W)
    %("#{elements.join('", "')}")
  elsif array_start.start_with?(PERCENT_I)
    ":#{elements.join(', :')}"
  elsif array_start.start_with?(PERCENT_CAPITAL_I)
    %(:"#{elements.join('", :"')}")
  else
    elements.join(', ')
  end
end
unneeded_brackets?(node) click to toggle source
# File lib/rubocop/cop/lint/unneeded_splat_expansion.rb, line 112
def unneeded_brackets?(node)
  parent = node.parent
  grandparent = node.parent.parent

  parent.when_type? || parent.send_type? || part_of_an_array?(node) ||
    (grandparent && grandparent.resbody_type?)
end