class RuboCop::Cop::Style::ModuleFunction

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

Supported styles are: module_function, extend_self.

@example EnforcedStyle: module_function (default)

# bad
module Test
  extend self
  # ...
end

# good
module Test
  module_function
  # ...
end

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

@example EnforcedStyle: module_function (default)

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

@example EnforcedStyle: extend_self

# bad
module Test
  module_function
  # ...
end

# good
module Test
  extend self
  # ...
end

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

Constants

EXTEND_SELF_MSG
MODULE_FUNCTION_MSG

Public Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/module_function.rb, line 71
def autocorrect(node)
  lambda do |corrector|
    if extend_self_node?(node)
      corrector.replace(node.source_range, 'module_function')
    else
      corrector.replace(node.source_range, 'extend self')
    end
  end
end
on_module(node) click to toggle source
# File lib/rubocop/cop/style/module_function.rb, line 63
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

Private Instance Methods

each_wrong_style(nodes) { |node| ... } click to toggle source
# File lib/rubocop/cop/style/module_function.rb, line 83
def each_wrong_style(nodes)
  case style
  when :module_function
    private_directive = nodes.any? { |node| private_directive?(node) }

    nodes.each do |node|
      yield node if extend_self_node?(node) && !private_directive
    end
  when :extend_self
    nodes.each do |node|
      yield node if module_function_node?(node)
    end
  end
end
message(_node) click to toggle source
# File lib/rubocop/cop/style/module_function.rb, line 98
def message(_node)
  style == :module_function ? MODULE_FUNCTION_MSG : EXTEND_SELF_MSG
end