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

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 93
def on_send(node)
  return unless node.access_modifier?
  return if node.parent&.pair_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 144
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 148
def access_modifier_is_not_inlined?(node)
  !access_modifier_is_inlined?(node)
end
add_range(range1, range2) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 223
def add_range(range1, range2)
  range1.with(
    begin_pos: [range1.begin_pos, range2.begin_pos].min,
    end_pos: [range1.end_pos, range2.end_pos].max
  )
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 110
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 173
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 162
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 136
def group_style?
  style == :group
end
inline_style?() click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 140
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 185
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 198
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 152
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)) ||
    (inline_style? && access_modifier_is_not_inlined?(node))
end
range_with_comments(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 211
def range_with_comments(node)
  ranges = [
    node,
    *processed_source.ast_with_comments[node]
  ].map do |element|
    element.location.expression
  end
  ranges.reduce do |result, range|
    add_range(result, range)
  end
end
remove_node(corrector, node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 202
def remove_node(corrector, node)
  corrector.remove(
    range_by_whole_lines(
      range_with_comments(node),
      include_final_newline: true
    )
  )
end
select_grouped_def_nodes(node) click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 179
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