class RuboCop::Cop::Rake::DuplicateNamespace
end
end
task :hoge do
end
task :bar do
namespace :foo do
# good
end
end
task :hoge do
namespace :foo do
end
end
task :bar do
namespace :foo do
# bad
@example
This cop detects it.
It is redundant. You should squash them into one definition.
in definition order.
If namespaces are defined with the same name, Rake executes the both namespaces
def initialize(*)
def initialize(*) super @namespaces = {} end
def message_for_dup(previous:, current:, namespace:)
def message_for_dup(previous:, current:, namespace:) format( MSG, namespace: namespace, 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_namespace(node)
def on_namespace(node) namespaces = namespaces(node) return if namespaces.include?(nil) full_name = namespaces.reverse.join(':') if (previous = @namespaces[full_name]) message = message_for_dup(previous: previous, current: node, namespace: full_name) add_offense(node, message: message) else @namespaces[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