class RuboCop::Cop::Style::SingleLineMethods

Checks for single-line method definitions that contain a body. It will accept single-line methods with no body.

Endless methods added in Ruby 3.0 are also accepted by this cop.

If ‘Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line` or `allow_always`, single-line methods will be autocorrected to endless methods if there is only one statement in the body.

@example

# bad
def some_method; body end
def link_to(url); {:name => url}; end
def @table.columns; super; end

# good
def self.resource_class=(klass); end
def @table.columns; end
def some_method() = body

@example AllowIfMethodIsEmpty: true (default)

# good
def no_op; end

@example AllowIfMethodIsEmpty: false

# bad
def no_op; end

Constants

MSG
NOT_SUPPORTED_ENDLESS_METHOD_BODY_TYPES

Public Instance Methods

on_def(node) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 41
def on_def(node)
  return unless node.single_line?
  return if node.endless?
  return if allow_empty? && !node.body

  add_offense(node) { |corrector| autocorrect(corrector, node) }
end
Also aliased as: on_defs
on_defs(node)
Alias for: on_def

Private Instance Methods

allow_empty?() click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 60
def allow_empty?
  cop_config['AllowIfMethodIsEmpty']
end
autocorrect(corrector, node) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 52
def autocorrect(corrector, node)
  if correct_to_endless?(node.body)
    correct_to_endless(corrector, node)
  else
    correct_to_multiline(corrector, node)
  end
end
break_line_before(corrector, node, range, indent_steps: 1) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 97
def break_line_before(corrector, node, range, indent_steps: 1)
  LineBreakCorrector.break_line_before(
    range: range, node: node, corrector: corrector,
    configured_width: configured_indentation_width, indent_steps: indent_steps
  )
end
correct_to_endless(corrector, node) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 88
def correct_to_endless(corrector, node)
  self_receiver = node.self_receiver? ? 'self.' : ''
  arguments = node.arguments.any? ? node.arguments.source : '()'
  body_source = method_body_source(node.body)
  replacement = "def #{self_receiver}#{node.method_name}#{arguments} = #{body_source}"

  corrector.replace(node, replacement)
end
correct_to_endless?(body_node) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 64
def correct_to_endless?(body_node)
  return false if target_ruby_version < 3.0
  return false if disallow_endless_method_style?
  return false unless body_node
  return false if body_node.parent.assignment_method? ||
                  NOT_SUPPORTED_ENDLESS_METHOD_BODY_TYPES.include?(body_node.type)

  !(body_node.begin_type? || body_node.kwbegin_type?)
end
correct_to_multiline(corrector, node) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 74
def correct_to_multiline(corrector, node)
  if (body = node.body) && body.begin_type? && body.parenthesized_call?
    break_line_before(corrector, node, body)
  else
    each_part(body) do |part|
      break_line_before(corrector, node, part)
    end
  end

  break_line_before(corrector, node, node.loc.end, indent_steps: 0)

  move_comment(node, corrector)
end
disallow_endless_method_style?() click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 136
def disallow_endless_method_style?
  endless_method_config = config.for_cop('Style/EndlessMethod')
  return false unless endless_method_config['Enabled']

  endless_method_config['EnforcedStyle'] == 'disallow'
end
each_part(body) { |source_range| ... } click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 104
def each_part(body)
  return unless body

  if body.begin_type?
    body.each_child_node { |part| yield part.source_range }
  else
    yield body.source_range
  end
end
method_body_source(method_body) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 121
def method_body_source(method_body)
  if require_parentheses?(method_body)
    arguments_source = method_body.arguments.map(&:source).join(', ')
    body_source = "#{method_body.method_name}(#{arguments_source})"

    method_body.receiver ? "#{method_body.receiver.source}.#{body_source}" : body_source
  else
    method_body.source
  end
end
move_comment(node, corrector) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 114
def move_comment(node, corrector)
  LineBreakCorrector.move_comment(
    eol_comment: processed_source.comment_at_line(node.source_range.line),
    node: node, corrector: corrector
  )
end
require_parentheses?(method_body) click to toggle source
# File lib/rubocop/cop/style/single_line_methods.rb, line 132
def require_parentheses?(method_body)
  method_body.send_type? && !method_body.arguments.empty? && !method_body.comparison_method?
end