class RuboCop::Cop::Lint::UnneededSplatExpansion

end
baz
else
bar
when 1, 2, 3
case foo
end
bar
rescue StandardError, ApplicationError
foo
begin
a = [‘a’]
a = *1..10
a, *b = *c
a, b = *c
a = *c
c = [1, 2, 3]
# good
@example
end
baz
else
bar
when *[1, 2, 3]
case foo
end
bar
rescue *[StandardError, ApplicationError]
foo
begin
a = *1
a = *‘a’
a = *[1, 2, 3]
# bad
@example
This cop checks for unneeded usages of splat expansion

def array_new_inside_array_literal?(array_new_node)

def array_new_inside_array_literal?(array_new_node)
  return false unless array_new?(array_new_node)
  grandparent = array_new_node.parent.parent
  grandparent.array_type? && grandparent.children.size > 1
end

def array_splat?(node)

def array_splat?(node)
  node.children.first.array_type?
end

def autocorrect(node)

def autocorrect(node)
  range, content = replacement_range_and_content(node)
  lambda do |corrector|
    corrector.replace(range, content)
  end
end

def method_argument?(node)

def method_argument?(node)
  node.parent.send_type?
end

def on_splat(node)

def on_splat(node)
  unneeded_splat_expansion(node) do
    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

def part_of_an_array?(node)

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

def remove_brackets(array)

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

def replacement_range_and_content(node)

def replacement_range_and_content(node)
  variable, = *node
  loc = node.loc
  if array_new?(variable)
    [node.parent.loc.expression, variable.source]
  elsif !variable.array_type?
    [loc.expression, "[#{variable.source}]"]
  elsif unneeded_brackets?(node)
    [loc.expression, remove_brackets(variable)]
  else
    [loc.operator, '']
  end
end

def unneeded_brackets?(node)

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

def unneeded_splat_expansion(node)

def unneeded_splat_expansion(node)
  literal_expansion(node) do |expanded_item|
    if expanded_item.send_type?
      return if array_new_inside_array_literal?(expanded_item)
      grandparent = node.parent.parent
      return if grandparent &&
                !ASSIGNMENT_TYPES.include?(grandparent.type)
    end
    yield
  end
end