Class: RuboCop::Cop::Style::Lambda

Inherits:
Cop
  • Object
show all
Includes:
ConfigurableEnforcedStyle
Defined in:
lib/rubocop/cop/style/lambda.rb

Overview

This cop (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.

Examples:

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

EnforcedStyle: lambda

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

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

EnforcedStyle: literal

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

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

Constant Summary collapse

LITERAL_MESSAGE =
'Use the `-> { ... }` lambda literal syntax for ' \
'%<modifier>s lambdas.'.freeze
METHOD_MESSAGE =
'Use the `lambda` method for %<modifier>s ' \
'lambdas.'.freeze
OFFENDING_SELECTORS =
{
  style: {
    lambda: { single_line: '->', multiline: '->' },
    literal: { single_line: 'lambda', multiline: 'lambda' },
    line_count_dependent: { single_line: 'lambda', multiline: '->' }
  }
}.freeze

Constants included from Util

Util::ASGN_NODES, Util::CONDITIONAL_NODES, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::LOGICAL_OPERATOR_NODES, Util::MODIFIER_NODES, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES

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_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, #duplicate_location?, #excluded_file?, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #messages, non_rails, #parse, qualified_cop_name, #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?, #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, operator?, parentheses?, same_line?, to_string_literal, to_supported_styles, tokens

Methods included from PathUtil

absolute?, 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



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/rubocop/cop/style/lambda.rb', line 79

def autocorrect(node)
  block_method, _args = *node
  selector = block_method.source

  # Don't autocorrect if this would change the meaning of the code
  return if selector == '->' && arg_to_unparenthesized_call?(node)

  lambda do |corrector|
    if selector == 'lambda'
      autocorrect_method_to_literal(corrector, node)
    else
      autocorrect_literal_to_method(corrector, node)
    end
  end
end

#on_block(node) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/rubocop/cop/style/lambda.rb', line 67

def on_block(node)
  return unless node.lambda?

  selector = node.send_node.source

  return unless offending_selector?(node, selector)

  add_offense(node,
              location: node.send_node.source_range,
              message: message(node, selector))
end