free_mutant/lib/mutant/mutator/call.rb

110 lines
2.4 KiB
Ruby
Raw Normal View History

module Mutant
class Mutator
# Class for mutations where messages are send to objects
2012-08-09 17:07:22 -04:00
class Call < self
2012-08-01 08:38:12 -04:00
handle(Rubinius::AST::Send)
2012-08-01 08:38:12 -04:00
private
# Return receiver AST node
#
# @return [Rubinius::AST::Node]
#
# @api private
#
def receiver
node.receiver
end
# Return name of call
#
# @return [Symbol]
#
# @api private
#
def name
node.name
end
# Check if receiver is self
#
# @return [true]
# returns true when receiver is a Rubinius::AST::Self node
#
# @return [false]
# return false otherwise
#
2012-08-01 07:31:56 -04:00
# @api private
#
def self?
receiver.kind_of?(Rubinius::AST::Self)
end
# Emit mutation that replaces explicit send to self with implicit send to self
#
# @example:
#
# # This class does use Foo#a with explicitly specifing the receiver self.
# # But an implicit (privately) call should be used as there is no need for
# # specifing en explicit receiver.
#
# class Foo # Mutation
# def print_a # def print_a
# puts self.a # puts a
# end # end
#
# def a
# :bar
# end
# end
#
# There will not be any exception so the mutant is not killed and such calls where
# implicit receiver should be used will be spotted.
#
2012-08-01 08:59:37 -04:00
# @return [undefined]
#
# @api private
#
def emit_implicit_self_receiver
return;
2012-08-21 08:19:44 -04:00
# FIXME: Edge case that is currently not very well undestood
return if name == :block_given?
return unless self?
2012-08-01 08:38:48 -04:00
mutant = dup_node
mutant.privately = true
2012-08-01 08:38:12 -04:00
# TODO: Fix rubinius to allow this as an attr_accessor
2012-08-21 08:19:44 -04:00
mutant.instance_variable_set(:@vcall_style, true)
emit(mutant)
2012-08-01 08:38:12 -04:00
end
2012-08-01 08:38:12 -04:00
# Emit mutations
#
# @return [undefined]
#
# @api private
#
def dispatch
emit_implicit_self_receiver
end
class SendWithArguments < Call
handle(Rubinius::AST::SendWithArguments)
2012-08-01 08:38:12 -04:00
private
# Emut mutations
#
# @return [undefined]
#
# @api private
#
def dispatch
super
end
end
end
end
end