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
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