class RuboCop::Cop::Lint::IneffectiveAccessModifier
end
end
end
puts ‘hi’
def method
private
class << self
class C
# good
@example
end
private_class_method :method
end
puts ‘hi’
def self.method
class C
# good
@example
end
end
puts ‘hi’
def self.method
private
class C
# bad
@example
used for that.
singleton methods private/protected. ‘private_class_method` can be
applied to a singleton method. These access modifiers do not make
This cop checks for `private` or `protected` access modifiers which are
def access_modifier?(node)
def access_modifier?(node) node.bare_access_modifier? && !node.method?(:module_function) end
def check_node(node)
def check_node(node) return unless node && node.begin_type? ignored_methods = private_class_method_names(node) ineffective_modifier(node, ignored_methods) do |defs_node, modifier| add_offense(defs_node, location: :keyword, message: format_message(modifier)) end end
def correct_visibility?(node, modifier, ignored_methods)
def correct_visibility?(node, modifier, ignored_methods) return true if modifier.nil? || modifier.method_name == :public ignored_methods.include?(node.method_name) end
def format_message(modifier)
def format_message(modifier) visibility = modifier.method_name alternative = if visibility == :private ALTERNATIVE_PRIVATE else ALTERNATIVE_PROTECTED end format(MSG, modifier: visibility, line: modifier.location.expression.line, alternative: alternative) end
def ineffective_modifier(node, ignored_methods, modifier = nil, &block)
def ineffective_modifier(node, ignored_methods, modifier = nil, &block) node.each_child_node do |child| case child.type when :send modifier = child if access_modifier?(child) when :defs next if correct_visibility?(child, modifier, ignored_methods) yield child, modifier when :kwbegin ineffective_modifier(child, ignored_methods, modifier, &block) end end end
def on_class(node)
def on_class(node) check_node(node.children[2]) # class body end
def on_module(node)
def on_module(node) check_node(node.children[1]) # module body end
def private_class_method_names(node)
def private_class_method_names(node) private_class_methods(node).to_a.flatten .select(&:basic_literal?) .map(&:value) end