diff --git a/lib/mutant/mutator/node.rb b/lib/mutant/mutator/node.rb index 12899c24..a1066ece 100644 --- a/lib/mutant/mutator/node.rb +++ b/lib/mutant/mutator/node.rb @@ -43,15 +43,19 @@ module Mutant # Define remaining children # - # @param [Fixnum] from_index + # @param [Array] names # # @return [undefined] # # @api private # - def self.define_remaining_children(from_index) + def self.define_remaining_children(names) + define_method(:remaining_children_with_index) do + children.each_with_index.drop(names.length) + end + define_method(:remaining_children) do - children[from_index..-1] + children.drop(names.length) end end private_class_method :define_remaining_children @@ -66,7 +70,7 @@ module Mutant names.each_with_index do |name, index| define_named_child(name, index) end - define_remaining_children(names.length) + define_remaining_children(names) end private_class_method :children diff --git a/lib/mutant/mutator/node/send.rb b/lib/mutant/mutator/node/send.rb index 2226bd93..e83d51c1 100644 --- a/lib/mutant/mutator/node/send.rb +++ b/lib/mutant/mutator/node/send.rb @@ -7,8 +7,9 @@ module Mutant handle(:send) - RECEIVER_INDEX, SELECTOR_INDEX = 0, 1 - ARGUMENTS_INDEX = 2..-1.freeze + children :receiver, :selector + + alias_method :arguments, :remaining_children private @@ -23,6 +24,16 @@ module Mutant run(Binary) return end + normal_dispatch + end + + # Perform normal, non special case dispatch + # + # @return [undefined] + # + # @api private + # + def normal_dispatch emit(receiver) if receiver mutate_receiver emit_argument_propagation @@ -52,8 +63,7 @@ module Mutant def mutate_arguments return if arguments.empty? emit_self(receiver, selector) - children.each_index do |index| - next if index <= SELECTOR_INDEX + remaining_children_with_index.each do |node, index| mutate_child(index) delete_child(index) end @@ -79,7 +89,7 @@ module Mutant def mutate_receiver return unless receiver emit_implicit_self - mutate_child(RECEIVER_INDEX) + emit_receiver_mutations end # Emit implicit self mutation @@ -90,41 +100,10 @@ module Mutant # def emit_implicit_self if receiver.type == :self and !KEYWORDS.include?(selector) - emit_child_update(RECEIVER_INDEX, nil) + emit_receiver(nil) end end - # Return receiver - # - # @return [Parser::Node::AST] - # - # @api private - # - def receiver - children[RECEIVER_INDEX] - end - - # Return selector - # - # @return [Symbol] - # - # @api private - # - def selector - children[SELECTOR_INDEX] - end - - # Return arguments - # - # @return [Array] - # - # @api private - # - def arguments - children[ARGUMENTS_INDEX] - end - memoize :arguments - end # Send end # Node end # Mutator diff --git a/lib/mutant/mutator/node/send/binary.rb b/lib/mutant/mutator/node/send/binary.rb index b263af95..2632a066 100644 --- a/lib/mutant/mutator/node/send/binary.rb +++ b/lib/mutant/mutator/node/send/binary.rb @@ -6,7 +6,7 @@ module Mutant # Mutator for sends that correspond to a binary operator class Binary < self - RIGHT_INDEX = SELECTOR_INDEX+1 + children :left, :operator, :right private @@ -17,10 +17,10 @@ module Mutant # @api private # def dispatch - emit(receiver) - mutate_child(RECEIVER_INDEX) # left - mutate_child(RIGHT_INDEX) - emit(arguments.first) + emit(left) + emit_left_mutations + emit(right) + emit_right_mutations end end # Binary