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

Inherits:
Cop
  • Object
show all
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 included from Util

Util::LITERAL_REGEX

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Instance Method Summary collapse

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 Cop

#add_offense, all, autocorrect_incompatible_with, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, #correct, department, #disable_uncorrectable, #duplicate_location?, #excluded_file?, #external_dependency_checksum, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #messages, #parse, qualified_cop_name, #reason_to_not_correct, #relevant_file?, #target_rails_version, #target_ruby_version

Methods included from AST::Sexp

#s

Methods included from NodePattern::Macros

#def_node_matcher, #def_node_search, #node_search, #node_search_all, #node_search_body, #node_search_first

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #correctable?, #disable_offense, #disable_uncorrectable?, #safe_autocorrect?, #support_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

begins_its_line?, comment_line?, double_quotes_required?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, parentheses?, same_line?, to_string_literal, to_supported_styles, tokens, trim_string_interporation_escape_character

Methods included from PathUtil

absolute?, chdir, hidden_dir?, hidden_file_in_not_hidden_dir?, match_path?, pwd, relative_path, reset_pwd, smart_path

Constructor Details

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

Instance Method Details

#autocorrect(node) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/rubocop/cop/style/module_function.rb', line 96

def autocorrect(node)
  return if style == :forbidden

  lambda do |corrector|
    if extend_self_node?(node)
      corrector.replace(node, 'module_function')
    else
      corrector.replace(node, 'extend self')
    end
  end
end

#on_module(node) ⇒ Object



88
89
90
91
92
93
94
# File 'lib/rubocop/cop/style/module_function.rb', line 88

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

  each_wrong_style(node.body.children) do |child_node|
    add_offense(child_node)
  end
end