Class: RuboCop::Cop::Style::ModuleFunction

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

Overview

This cop checks for use of ‘extend self` or module_function in a module.

Supported styles are: module_function, extend_self, forbidden.

In case there are private methods, the cop won’t be activated. Otherwise, it forces to change the flow of the default code.

The option forbidden prohibits the usage of both styles.

These offenses are not safe to auto-correct since there are different implications to each approach.

Examples:

EnforcedStyle: module_function (default)

# bad
module Test
  extend self
  # ...
end

# good
module Test
  module_function
  # ...
end

EnforcedStyle: module_function (default)

# good
module Test
  extend self
  # ...
  private
  # ...
end

EnforcedStyle: extend_self

# bad
module Test
  module_function
  # ...
end

# good
module Test
  extend self
  # ...
end

EnforcedStyle: forbidden

# bad
module Test
  module_function
  # ...
end

# bad
module Test
  extend self
  # ...
end

# bad
module Test
  extend self
  # ...
  private
  # ...
end

Constant Summary collapse

MODULE_FUNCTION_MSG =
'Use `module_function` instead of `extend self`.'
EXTEND_SELF_MSG =
'Use `extend self` instead of `module_function`.'
FORBIDDEN_MSG =
'Do not use `module_function` or `extend self`.'

Constants inherited from Base

Base::RESTRICT_ON_SEND

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

#add_global_offense, #add_offense, autocorrect_incompatible_with, badge, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, joining_forces, lint?, match?, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #ready, #relevant_file?, 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?, #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

#extend_self_node?(node) ⇒ Object



86
# File 'lib/rubocop/cop/style/module_function.rb', line 86

def_node_matcher :extend_self_node?, '(send nil? :extend self)'

#module_function_node?(node) ⇒ Object



83
# File 'lib/rubocop/cop/style/module_function.rb', line 83

def_node_matcher :module_function_node?, '(send nil? :module_function)'

#on_module(node) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/rubocop/cop/style/module_function.rb', line 91

def on_module(node)
  return unless node.body&.begin_type?

  each_wrong_style(node.body.children) do |child_node|
    add_offense(child_node) do |corrector|
      next if style == :forbidden

      if extend_self_node?(child_node)
        corrector.replace(child_node, 'module_function')
      else
        corrector.replace(child_node, 'extend self')
      end
    end
  end
end

#private_directive?(node) ⇒ Object



89
# File 'lib/rubocop/cop/style/module_function.rb', line 89

def_node_matcher :private_directive?, '(send nil? :private ...)'