Class: RuboCop::Cop::Style::AccessModifierDeclarations

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
ConfigurableEnforcedStyle, RangeHelp
Defined in:
lib/rubocop/cop/style/access_modifier_declarations.rb

Overview

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. Also, the visibility of ‘attr*` methods can be controlled using AllowModifiersOnAttrs config.

In Ruby 3.0, ‘attr*` methods now return an array of defined method names as symbols. So we can write the modifier and `attr*` in inline style. AllowModifiersOnAttrs config allows `attr*` methods to be written in inline style without modifying applications that have been maintained for a long time in group style. Furthermore, developers who are not very familiar with Ruby may know that the modifier applies to `def`, but they may not know that it also applies to `attr*` methods. It would be easier to understand if we could write `attr*` methods in inline style.

Examples:

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

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

AllowModifiersOnSymbols: true (default)

# good
class Foo

  private :bar, :baz
  private *%i[qux quux]
  private *METHOD_NAMES
  private *private_methods

end

AllowModifiersOnSymbols: false

# bad
class Foo

  private :bar, :baz
  private *%i[qux quux]
  private *METHOD_NAMES
  private *private_methods

end

AllowModifiersOnAttrs: true (default)

# good
class Foo

  public attr_reader :bar
  protected attr_writer :baz
  private attr_accessor :qux
  private attr :quux

  def public_method; end

  private

  def private_method; end

end

AllowModifiersOnAttrs: false

# bad
class Foo

  public attr_reader :bar
  protected attr_writer :baz
  private attr_accessor :qux
  private attr :quux

end

Constant Summary collapse

GROUP_STYLE_MESSAGE =
[
  '`%<access_modifier>s` should not be',
  'inlined in method definitions.'
].join(' ')
INLINE_STYLE_MESSAGE =
[
  '`%<access_modifier>s` should be',
  'inlined in method definitions.'
].join(' ')
RESTRICT_ON_SEND =
%i[private protected public module_function].freeze
ALLOWED_NODE_TYPES =
%i[pair block].freeze

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods included from ConfigurableEnforcedStyle

#alternative_style, #alternative_styles, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #style, #style_configured?, #style_detected, #style_parameter_name, #supported_styles, #unexpected_style_detected

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, autocorrect_incompatible_with, badge, #begin_investigation, callbacks_needed, #callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #cop_config, cop_name, #cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #parser_engine, #ready, #relevant_file?, requires_gem, #string_literals_frozen_by_default?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#access_modifier_with_attr?(node) ⇒ Object



143
144
145
146
# File 'lib/rubocop/cop/style/access_modifier_declarations.rb', line 143

def_node_matcher :access_modifier_with_attr?, <<~PATTERN
  (send nil? {:private :protected :public :module_function}
    (send nil? {:attr :attr_reader :attr_writer :attr_accessor} _+))
PATTERN

#access_modifier_with_symbol?(node) ⇒ Object



136
137
138
139
140
# File 'lib/rubocop/cop/style/access_modifier_declarations.rb', line 136

def_node_matcher :access_modifier_with_symbol?, <<~PATTERN
  (send nil? {:private :protected :public :module_function}
    {(sym _)+ (splat {#percent_symbol_array? const send})}
  )
PATTERN

#on_send(node) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/rubocop/cop/style/access_modifier_declarations.rb', line 148

def on_send(node)
  return if allowed?(node)

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