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