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