class RuboCop::Cop::Style::Lambda
end
x
f = ->(x) do
f = ->(x) { x }
# good
end
x
f = lambda do |x|
f = lambda { |x| x }
# bad
@example EnforcedStyle: literal
end
x
f = lambda do |x|
f = lambda { |x| x }
# good
end
x
f = ->(x) do
f = ->(x) { x }
# bad
@example EnforcedStyle: lambda
end
x
f = lambda do |x|
f = ->(x) { x }
# good
end
x
f = ->(x) do
f = lambda { |x| x }
# bad
@example EnforcedStyle: line_count_dependent (default)
and multiline lambdas as well.
It is configurable to enforce one of the styles for both single line
single line lambdas, and the method call syntax for multiline lambdas.
This cop (by default) checks for uses of the lambda literal syntax for
def arguments_with_whitespace(node)
def arguments_with_whitespace(node) node.loc.begin.end.join(node.arguments.loc.end) end
def autocorrect_method_to_literal(corrector, node)
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
def lambda_arg_string(args)
def lambda_arg_string(args) args.children.map(&:source).join(', ') end
def message(node, selector)
def message(node, selector) message = selector == '->' ? METHOD_MESSAGE : LITERAL_MESSAGE format(message, modifier: message_line_modifier(node)) end
def message_line_modifier(node)
def message_line_modifier(node) case style when :line_count_dependent node.multiline? ? 'multiline' : 'single line' else 'all' end end
def offending_selector?(node, selector)
def offending_selector?(node, selector) lines = node.multiline? ? :multiline : :single_line selector == OFFENDING_SELECTORS[:style][style][lines] end
def on_block(node)
def on_block(node) return unless node.lambda? selector = node.send_node.source return unless offending_selector?(node, selector) add_offense(node.send_node.source_range, message: message(node, selector)) do |corrector| if node.send_node.source == 'lambda' autocorrect_method_to_literal(corrector, node) else LambdaLiteralToMethodCorrector.new(node).call(corrector) end end end