class RuboCop::Cop::Style::AccessModifierDeclarations

Access modifiers should be declared to apply to a group of methods or inline before each method, depending on configuration. EnforcedStyle config covers only method definitions. Applications of visibility methods to symbols can be controlled using AllowModifiersOnSymbols config.

@safety

Autocorrection is not safe, because the visibility of dynamically
defined methods can vary depending on the state determined by
the group access modifier.

@example EnforcedStyle: group (default)

# bad
class Foo

  private def bar; end
  private def baz; end

end

# good
class Foo

  private

  def bar; end
  def baz; end

end

@example EnforcedStyle: inline

# bad
class Foo

  private

  def bar; end
  def baz; end

end

# good
class Foo

  private def bar; end
  private def baz; end

end

@example AllowModifiersOnSymbols: true (default)

# good
class Foo

  private :bar, :baz

end

@example AllowModifiersOnSymbols: false

# bad
class Foo

  private :bar, :baz

end

Constants

ALLOWED_NODE_TYPES
GROUP_STYLE_MESSAGE
INLINE_STYLE_MESSAGE
RESTRICT_ON_SEND

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 95
def on_send(node)
  return unless node.access_modifier?
  return if ALLOWED_NODE_TYPES.include?(node.parent&.type)
  return if allow_modifiers_on_symbols?(node)

  if offense?(node)
    add_offense(node.loc.selector) do |corrector|
      autocorrect(corrector, node)
    end
    opposite_style_detected
  else
    correct_style_detected
  end
end

Private Instance Methods

access_modifier_is_inlined?(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 145
def access_modifier_is_inlined?(node)
  node.arguments.any?
end
access_modifier_is_not_inlined?(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 149
def access_modifier_is_not_inlined?(node)
  !access_modifier_is_inlined?(node)
end
allow_modifiers_on_symbols?(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 127
def allow_modifiers_on_symbols?(node)
  cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node)
end
autocorrect(corrector, node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 112
def autocorrect(corrector, node)
  case style
  when :group
    def_node = find_corresponding_def_node(node)
    return unless def_node

    replace_def(corrector, node, def_node)
  when :inline
    remove_node(corrector, node)
    select_grouped_def_nodes(node).each do |grouped_def_node|
      insert_inline_modifier(corrector, grouped_def_node, node.method_name)
    end
  end
end
def_source(node, def_node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 219
def def_source(node, def_node)
  [*processed_source.ast_with_comments[node].map(&:text), def_node.source].join("\n")
end
find_argument_less_modifier_node(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 180
def find_argument_less_modifier_node(node)
  return unless (parent = node.parent)

  parent.each_child_node(:send).find do |child|
    child.method?(node.method_name) && child.arguments.empty?
  end
end
find_corresponding_def_node(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 169
def find_corresponding_def_node(node)
  if access_modifier_with_symbol?(node)
    method_name = node.arguments.first.value
    node.parent.each_child_node(:def).find do |child|
      child.method?(method_name)
    end
  else
    node.arguments.first
  end
end
group_style?() click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 137
def group_style?
  style == :group
end
inline_style?() click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 141
def inline_style?
  style == :inline
end
insert_inline_modifier(corrector, node, modifier_name) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 211
def insert_inline_modifier(corrector, node, modifier_name)
  corrector.insert_before(node, "#{modifier_name} ")
end
message(range) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 159
def message(range)
  access_modifier = range.source

  if group_style?
    format(GROUP_STYLE_MESSAGE, access_modifier: access_modifier)
  elsif inline_style?
    format(INLINE_STYLE_MESSAGE, access_modifier: access_modifier)
  end
end
offense?(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 131
def offense?(node)
  (group_style? && access_modifier_is_inlined?(node) &&
    !right_siblings_same_inline_method?(node)) ||
    (inline_style? && access_modifier_is_not_inlined?(node))
end
remove_node(corrector, node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 215
def remove_node(corrector, node)
  corrector.remove(range_with_comments_and_lines(node))
end
replace_def(corrector, node, def_node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 194
def replace_def(corrector, node, def_node)
  source = def_source(node, def_node)
  argument_less_modifier_node = find_argument_less_modifier_node(node)
  if argument_less_modifier_node
    corrector.insert_after(argument_less_modifier_node, "\n\n#{source}")
  elsif (ancestor = node.each_ancestor(:block, :class, :module).first)

    corrector.insert_before(ancestor.loc.end, "#{node.method_name}\n\n#{source}\n")
  else
    corrector.replace(node, "#{node.method_name}\n\n#{source}")
    return
  end

  remove_node(corrector, def_node)
  remove_node(corrector, node)
end
right_siblings_same_inline_method?(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 153
def right_siblings_same_inline_method?(node)
  node.right_siblings.any? do |sibling|
    sibling.send_type? && sibling.method?(node.method_name) && !sibling.arguments.empty?
  end
end
select_grouped_def_nodes(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 188
def select_grouped_def_nodes(node)
  node.right_siblings.take_while do |sibling|
    !(sibling.send_type? && sibling.bare_access_modifier_declaration?)
  end.select(&:def_type?)
end