eb6ea9a74f
Break some classes, rename stuff etc.
108 lines
2.4 KiB
Ruby
108 lines
2.4 KiB
Ruby
module Mutant
|
|
class Mutator
|
|
class Node
|
|
# Mutator for Rubinius::AST::If nodes
|
|
class If < self
|
|
|
|
handle(Rubinius::AST::If)
|
|
|
|
private
|
|
|
|
# Emit mutations on Rubinius::AST::If nodes
|
|
#
|
|
# @return [undefined]
|
|
#
|
|
# @api private
|
|
#
|
|
def dispatch
|
|
emit_attribute_mutations(:condition)
|
|
emit_attribute_mutations(:body) unless nil_literal?(:body)
|
|
emit_attribute_mutations(:else) unless nil_literal?(:else)
|
|
emit_inverted_condition
|
|
emit_deleted_if_branch
|
|
emit_deleted_else_branch
|
|
end
|
|
|
|
# Test if attribute is non nil literal
|
|
#
|
|
# @param [Symbol] name
|
|
#
|
|
# @return [true]
|
|
# if attribute value a nil literal
|
|
#
|
|
# @return [false]
|
|
# otherwise
|
|
#
|
|
# @api private
|
|
#
|
|
def nil_literal?(name)
|
|
node.public_send(name).kind_of?(Rubinius::AST::NilLiteral)
|
|
end
|
|
|
|
# Emit inverted condition
|
|
#
|
|
# Especially the same like swap branches but more universal as it also
|
|
# covers the case there is no else branch
|
|
#
|
|
# @return [undefined]
|
|
#
|
|
# @api private
|
|
#
|
|
def emit_inverted_condition
|
|
emit_self(new_send(condition, :'!'), if_branch, else_branch)
|
|
end
|
|
|
|
# Emit deleted else branch
|
|
#
|
|
# @return [undefined]
|
|
#
|
|
# @api private
|
|
#
|
|
def emit_deleted_else_branch
|
|
emit_self(condition, if_branch, nil)
|
|
end
|
|
|
|
# Emit deleted if branch
|
|
#
|
|
# @return [undefined]
|
|
#
|
|
# @api private
|
|
#
|
|
def emit_deleted_if_branch
|
|
body = else_branch || return
|
|
emit_self(condition, body, nil)
|
|
end
|
|
|
|
# Return if_branch of node
|
|
#
|
|
# @return [Rubinius::AST::Node]
|
|
#
|
|
# @api private
|
|
#
|
|
def if_branch
|
|
node.body
|
|
end
|
|
|
|
# Return condition of node
|
|
#
|
|
# @return [Rubinius::AST::Node]
|
|
#
|
|
# @api private
|
|
#
|
|
def condition
|
|
node.condition
|
|
end
|
|
|
|
# Return else body of node
|
|
#
|
|
# @return [Rubinius::AST::Node]
|
|
#
|
|
# @api private
|
|
#
|
|
def else_branch
|
|
node.else
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|