class RuboCop::Cop::Rake::DuplicateTask


end
p ‘foo 2’
p ‘foo 1’
task :foo do
# good
end
p ‘foo 2’
task :foo do
end
p ‘foo 1’
task :foo do
# bad
@example
This cop detects it.
It is misleading sometimes. You should squash them into one definition.
in definition order.
If tasks are defined with the same name, Rake executes the both tasks

def initialize(*)

def initialize(*)
  super
  @tasks = {}
end

def message_for_dup(previous:, current:, task_name:)

def message_for_dup(previous:, current:, task_name:)
  format(
    MSG,
    task: task_name,
    previous: source_location(previous),
    current: source_location(current),
  )
end

def namespaces(node)

def namespaces(node)
  ns = []
  node.each_ancestor(:block) do |block_node|
    send_node = block_node.send_node
    next unless send_node.method?(:namespace)
    name = Helper::TaskName.task_name(send_node)
    ns << name
  end
  ns
end

def on_task(node)

def on_task(node)
  namespaces = namespaces(node)
  return if namespaces.include?(nil)
  task_name = Helper::TaskName.task_name(node)
  return unless task_name
  full_name = [*namespaces.reverse, task_name].join(':')
  if (previous = @tasks[full_name])
    message = message_for_dup(previous: previous, current: node, task_name: full_name)
    add_offense(node, message: message)
  else
    @tasks[full_name] = node
  end
end

def source_location(node)

def source_location(node)
  range = node.source_range
  path = smart_path(range.source_buffer.name)
  "#{path}:#{range.line}"
end