class RuboCop::Cop::Performance::RedundantBlockCall

This cop identifies the use of a `&block` parameter and `block.call` where `yield` would do just as well.

@example

# bad
def method(&block)
  block.call
end
def another(&func)
  func.call 1, 2, 3
end

# good
def method
  yield
end
def another
  yield 1, 2, 3
end

Constants

CLOSE_PAREN
MSG
OPEN_PAREN
SPACE
YIELD

Public Instance Methods

autocorrect(node) click to toggle source

offenses are registered on the `block.call` nodes

# File lib/rubocop/cop/performance/redundant_block_call.rb, line 56
def autocorrect(node)
  _receiver, _method, *args = *node
  new_source = String.new(YIELD)
  unless args.empty?
    new_source += if parentheses?(node)
                    OPEN_PAREN
                  else
                    SPACE
                  end

    new_source << args.map(&:source).join(', ')
  end

  new_source << CLOSE_PAREN if parentheses?(node) && !args.empty?
  ->(corrector) { corrector.replace(node.source_range, new_source) }
end
on_def(node) click to toggle source
# File lib/rubocop/cop/performance/redundant_block_call.rb, line 45
def on_def(node)
  blockarg_def(node) do |argname, body|
    next unless body

    calls_to_report(argname, body).each do |blockcall|
      add_offense(blockcall, message: format(MSG, argname: argname))
    end
  end
end

Private Instance Methods

args_include_block_pass?(blockcall) click to toggle source
# File lib/rubocop/cop/performance/redundant_block_call.rb, line 85
def args_include_block_pass?(blockcall)
  _receiver, _call, *args = *blockcall

  args.any?(&:block_pass_type?)
end
calls_to_report(argname, body) click to toggle source
# File lib/rubocop/cop/performance/redundant_block_call.rb, line 75
def calls_to_report(argname, body)
  return [] if blockarg_assigned?(body, argname)

  calls = to_enum(:blockarg_calls, body, argname)

  return [] if calls.any? { |call| args_include_block_pass?(call) }

  calls
end