class RuboCop::Cop::Performance::RedundantBlockCall
end
yield 1, 2, 3
def another
end
yield
def method
# good
end
func.call 1, 2, 3
def another(&func)
end
block.call
def method(&block)
# bad
@example
where ‘yield` would do just as well.
Identifies the use of a `&block` parameter and `block.call`
def args_include_block_pass?(blockcall)
def args_include_block_pass?(blockcall) _receiver, _call, *args = *blockcall args.any?(&:block_pass_type?) end
def autocorrect(corrector, node)
def autocorrect(corrector, 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.replace(node, new_source) end
def calls_to_report(argname, body)
def calls_to_report(argname, body) return [] if blockarg_assigned?(body, argname) || shadowed_block_argument?(body, argname) blockarg_calls(body, argname).map do |call| return [] if args_include_block_pass?(call) call end end
def on_def(node)
def on_def(node) blockarg_def(node) do |argname, body| next unless body calls_to_report(argname, body).each do |blockcall| next if blockcall.block_literal? add_offense(blockcall, message: format(MSG, argname: argname)) do |corrector| autocorrect(corrector, blockcall) end end end end
def shadowed_block_argument?(body, block_argument_of_method_signature)
def shadowed_block_argument?(body, block_argument_of_method_signature) return false unless body.block_type? body.arguments.map(&:source).include?(block_argument_of_method_signature.to_s) end