free_mutant/lib/mutant/mutator/node/block.rb
2018-12-24 00:09:36 +00:00

64 lines
1.4 KiB
Ruby

# frozen_string_literal: true
module Mutant
class Mutator
class Node
# Emitter for mutations on 19 blocks
class Block < self
handle(:block)
children :send, :arguments, :body
private
# Emit mutations
#
# @return [undefined]
def dispatch
emit_singletons
emit(send) unless n_lambda?(send)
emit_send_mutations(&method(:n_send?))
emit_arguments_mutations
mutate_body
end
# Emit body mutations
#
# @return [undefined]
def mutate_body
emit_body(nil)
emit_body(N_RAISE)
return unless body
emit(body) unless body_has_control?
emit_body_mutations
mutate_body_receiver
end
# Test if body has control structures
#
# @return [Boolean]
def body_has_control?
AST.find_last_path(body) do |node|
n_break?(node) || n_next?(node)
end.any?
end
# Mutate method send in body scope of `send`
#
# @return [undefined]
def mutate_body_receiver
return unless n_send?(body)
body_meta = AST::Meta::Send.new(body)
emit(s(:send, send, body_meta.selector, *body_meta.arguments))
end
end # Block
end # Node
end # Mutator
end # Mutant