class RuboCop::Cop::Style::Lambda

(by default) checks for uses of the lambda literal syntax for single line lambdas, and the method call syntax for multiline lambdas. It is configurable to enforce one of the styles for both single line and multiline lambdas as well.

@example EnforcedStyle: line_count_dependent (default)

# bad
f = lambda { |x| x }
f = ->(x) do
      x
    end

# good
f = ->(x) { x }
f = lambda do |x|
      x
    end

@example EnforcedStyle: lambda

# bad
f = ->(x) { x }
f = ->(x) do
      x
    end

# good
f = lambda { |x| x }
f = lambda do |x|
      x
    end

@example EnforcedStyle: literal

# bad
f = lambda { |x| x }
f = lambda do |x|
      x
    end

# good
f = ->(x) { x }
f = ->(x) do
      x
    end

Constants

LITERAL_MESSAGE
METHOD_MESSAGE
OFFENDING_SELECTORS

Public Instance Methods

on_block(node) click to toggle source
# File lib/rubocop/cop/style/lambda.rb, line 64
def on_block(node)
  return unless node.lambda?

  selector = node.send_node.source

  return unless offending_selector?(node, selector)

  add_offense(node.send_node, message: message(node, selector)) do |corrector|
    if node.send_node.lambda_literal?
      LambdaLiteralToMethodCorrector.new(node).call(corrector)
    else
      autocorrect_method_to_literal(corrector, node)
    end
  end
end
Also aliased as: on_numblock
on_numblock(node)
Alias for: on_block

Private Instance Methods

arguments_with_whitespace(node) click to toggle source
# File lib/rubocop/cop/style/lambda.rb, line 115
def arguments_with_whitespace(node)
  node.loc.begin.end.join(node.arguments.loc.end)
end
autocorrect_method_to_literal(corrector, node) click to toggle source
# File lib/rubocop/cop/style/lambda.rb, line 104
def autocorrect_method_to_literal(corrector, node)
  corrector.replace(node.send_node, '->')

  return unless node.arguments?

  arg_str = "(#{lambda_arg_string(node.arguments)})"

  corrector.insert_after(node.send_node, arg_str)
  corrector.remove(arguments_with_whitespace(node))
end
lambda_arg_string(args) click to toggle source
# File lib/rubocop/cop/style/lambda.rb, line 119
def lambda_arg_string(args)
  args.children.map(&:source).join(', ')
end
message(node, selector) click to toggle source
# File lib/rubocop/cop/style/lambda.rb, line 89
def message(node, selector)
  message = selector == '->' ? METHOD_MESSAGE : LITERAL_MESSAGE

  format(message, modifier: message_line_modifier(node))
end
message_line_modifier(node) click to toggle source
# File lib/rubocop/cop/style/lambda.rb, line 95
def message_line_modifier(node)
  case style
  when :line_count_dependent
    node.multiline? ? 'multiline' : 'single line'
  else
    'all'
  end
end
offending_selector?(node, selector) click to toggle source
# File lib/rubocop/cop/style/lambda.rb, line 83
def offending_selector?(node, selector)
  lines = node.multiline? ? :multiline : :single_line

  selector == OFFENDING_SELECTORS[:style][style][lines]
end