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 146
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 150
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 129
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

    remove_node(corrector, def_node)
    remove_node(corrector, node)
    insert_def(corrector, node, def_node.source)
  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
find_argument_less_modifier_node(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 175
def find_argument_less_modifier_node(node)
  node.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 164
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 138
def group_style?
  style == :group
end
inline_style?() click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 142
def inline_style?
  style == :inline
end
insert_def(corrector, node, source) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 187
def insert_def(corrector, node, source)
  source = [*processed_source.ast_with_comments[node].map(&:text), source].join("\n")
  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}")
  else
    corrector.insert_before(
      node.each_ancestor(:block, :class, :module).first.location.end,
      "#{node.method_name}\n\n#{source}\n"
    )
  end
end
insert_inline_modifier(corrector, node, modifier_name) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 200
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 154
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 133
def offense?(node)
  (group_style? && access_modifier_is_inlined?(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 204
def remove_node(corrector, node)
  corrector.remove(range_with_comments_and_lines(node))
end
select_grouped_def_nodes(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 181
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