class RuboCop::Cop::RSpec::Yield


expect(foo).to receive(:bar).and_yield(1)
# good
allow(foo).to receive(:bar) { |&block| block.call(1) }
# bad
@example
Checks for calling a block within a stub.

def autocorrect(corrector, node, range)

def autocorrect(corrector, node, range)
  corrector.replace(
    range_with_surrounding_space(range, side: :left),
    generate_replacement(node.body)
  )
end

def block_range(node)

def block_range(node)
  node.loc.begin.with(end_pos: node.loc.end.end_pos)
end

def calling_block?(node, block)

def calling_block?(node, block)
  if node.begin_type?
    node.each_child_node.all? { |child| block_call?(child, block) }
  else
    block_call?(node, block)
  end
end

def convert_block_to_yield(node)

def convert_block_to_yield(node)
  args = node.arguments
  replacement = '.and_yield'
  replacement += "(#{args.map(&:source).join(', ')})" if args.any?
  replacement
end

def generate_replacement(node)

def generate_replacement(node)
  if node.begin_type?
    node.children.map { |child| convert_block_to_yield(child) }.join
  else
    convert_block_to_yield(node)
  end
end

def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler

rubocop:disable InternalAffairs/NumblockHandler
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
  return unless method_on_stub?(node.send_node)
  block_arg(node.arguments) do |block|
    if calling_block?(node.body, block)
      range = block_range(node)
      add_offense(range) do |corrector|
        autocorrect(corrector, node, range)
      end
    end
  end
end