class RuboCop::Cop::Lint::IneffectiveAccessModifier
This cop checks for `private` or `protected` access modifiers which are applied to a singleton method. These access modifiers do not make singleton methods private/protected. `private_class_method` can be used for that.
@example
# bad class C private def self.method puts 'hi' end end
@example
# good class C def self.method puts 'hi' end private_class_method :method end
@example
# good class C class << self private def method puts 'hi' end end end
Constants
- ALTERNATIVE_PRIVATE
- ALTERNATIVE_PROTECTED
- MSG
Public Instance Methods
on_class(node)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 59 def on_class(node) check_node(node.children[2]) # class body end
on_module(node)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 63 def on_module(node) check_node(node.children[1]) # module body end
Private Instance Methods
check_child_scope(node, cur_vis)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 103 def check_child_scope(node, cur_vis) case node.type when :send cur_vis = check_send(node, cur_vis) when :defs check_defs(node, cur_vis) when :kwbegin check_scope(node, cur_vis) end cur_vis end
check_defs(node, cur_vis)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 130 def check_defs(node, cur_vis) mark_method_as_useless(node, cur_vis) if cur_vis != :public end
check_node(node)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 74 def check_node(node) return unless node && node.begin_type? clear check_scope(node) @useless.each do |_name, (defs_node, visibility, modifier)| add_offense(defs_node, location: :keyword, message: format_message(visibility, modifier)) end end
check_scope(node, cur_vis = :public)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 97 def check_scope(node, cur_vis = :public) node.children.reduce(cur_vis) do |visibility, child| check_child_scope(child, visibility) end end
check_send(node, cur_vis)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 116 def check_send(node, cur_vis) if node.access_modifier? && !node.method?(:module_function) @last_access_modifier = node return node.method_name elsif (methods = private_class_method(node)) # don't warn about defs nodes which are followed by a call to # `private_class_method :name` # obviously the programmer knows what they are doing revert_method_uselessness(methods) end cur_vis end
clear()
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 69 def clear @useless = {} @last_access_modifier = nil end
format_message(visibility, modifier)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 87 def format_message(visibility, modifier) alternative = if visibility == :private ALTERNATIVE_PRIVATE else ALTERNATIVE_PROTECTED end format(MSG, visibility, modifier.location.expression.line, visibility, alternative) end
mark_method_as_useless(node, cur_vis)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 134 def mark_method_as_useless(node, cur_vis) _, method_name, = *node @useless[method_name] = [node, cur_vis, @last_access_modifier] end
revert_method_uselessness(methods)
click to toggle source
# File lib/rubocop/cop/lint/ineffective_access_modifier.rb, line 139 def revert_method_uselessness(methods) methods.each do |sym| next unless sym.sym_type? @useless.delete(sym.children[0]) end end