Class: Mutineer::Mutators::OperatorAssignment

Inherits:
Base
  • Object
show all
Defined in:
lib/mutineer/mutators/operator_assignment.rb

Overview

Operator-assignment mutator (Tier-2).

Swaps the operator of a compound assignment, one mutation per occurrence: t += x -> t -= x. Prism parses t += x as its own node, not as a CallNode, so the arithmetic mutator never sees it.

The mapping is the same as for arithmetic. Other compound operators (||=, &&=, |=, <<= and the rest) are not changed.

Constant Summary collapse

REPLACEMENTS =

Token replacements for compound arithmetic operators.

{
  :+ => "-=", :- => "+=", :* => "/=", :/ => "*=", :% => "*=", :** => "*="
}.freeze

Instance Method Summary collapse

Methods inherited from Base

#heredoc?, #mutations_for

Instance Method Details

#emit(node) ⇒ void (private)

This method returns an undefined value.

Emits a mutation when the node's operator has a replacement.

Parameters:

  • node (Prism::Node) —

    a node with binary_operator and binary_operator_loc.



106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/mutineer/mutators/operator_assignment.rb', line 106

def emit(node)
  replacement = REPLACEMENTS[node.binary_operator]
  return unless replacement

  loc = node.binary_operator_loc
  @mutations << Mutation.new(
    start_offset: loc.start_offset,
    end_offset: loc.end_offset,
    replacement: replacement,
    operator: :operator_assignment
  )
end

#visit_call_operator_write_node(node) ⇒ void

This method returns an undefined value.

Visits a.b += x and a&.b += x.

Parameters:

  • node (Prism::CallOperatorWriteNode) —

    node to inspect.



79
80
81
82
# File 'lib/mutineer/mutators/operator_assignment.rb', line 79

def visit_call_operator_write_node(node)
  emit(node)
  super
end

#visit_class_variable_operator_write_node(node) ⇒ void

This method returns an undefined value.

Visits @@t += x.

Parameters:

  • node (Prism::ClassVariableOperatorWriteNode) —

    node to inspect.



43
44
45
46
# File 'lib/mutineer/mutators/operator_assignment.rb', line 43

def visit_class_variable_operator_write_node(node)
  emit(node)
  super
end

#visit_constant_operator_write_node(node) ⇒ void

This method returns an undefined value.

Visits T += x.

Parameters:

  • node (Prism::ConstantOperatorWriteNode) —

    node to inspect.



61
62
63
64
# File 'lib/mutineer/mutators/operator_assignment.rb', line 61

def visit_constant_operator_write_node(node)
  emit(node)
  super
end

#visit_constant_path_operator_write_node(node) ⇒ void

This method returns an undefined value.

Visits A::T += x and ::T += x.

Parameters:

  • node (Prism::ConstantPathOperatorWriteNode) —

    node to inspect.



70
71
72
73
# File 'lib/mutineer/mutators/operator_assignment.rb', line 70

def visit_constant_path_operator_write_node(node)
  emit(node)
  super
end

#visit_def_node(node) ⇒ void

This method returns an undefined value.

Skips a nested method definition. The project finds it as a subject of its own, so a visit here counts its compound assignments twice.

Parameters:

  • node (Prism::DefNode) —

    nested definition node.



98
# File 'lib/mutineer/mutators/operator_assignment.rb', line 98

def visit_def_node(node); end

#visit_global_variable_operator_write_node(node) ⇒ void

This method returns an undefined value.

Visits $t += x.

Parameters:

  • node (Prism::GlobalVariableOperatorWriteNode) —

    node to inspect.



52
53
54
55
# File 'lib/mutineer/mutators/operator_assignment.rb', line 52

def visit_global_variable_operator_write_node(node)
  emit(node)
  super
end

#visit_index_operator_write_node(node) ⇒ void

This method returns an undefined value.

Visits a[i] += x.

Parameters:

  • node (Prism::IndexOperatorWriteNode) —

    node to inspect.



88
89
90
91
# File 'lib/mutineer/mutators/operator_assignment.rb', line 88

def visit_index_operator_write_node(node)
  emit(node)
  super
end

#visit_instance_variable_operator_write_node(node) ⇒ void

This method returns an undefined value.

Visits @t += x.

Parameters:

  • node (Prism::InstanceVariableOperatorWriteNode) —

    node to inspect.



34
35
36
37
# File 'lib/mutineer/mutators/operator_assignment.rb', line 34

def visit_instance_variable_operator_write_node(node)
  emit(node)
  super
end

#visit_local_variable_operator_write_node(node) ⇒ void

This method returns an undefined value.

Visits t += x.

Parameters:

  • node (Prism::LocalVariableOperatorWriteNode) —

    node to inspect.



25
26
27
28
# File 'lib/mutineer/mutators/operator_assignment.rb', line 25

def visit_local_variable_operator_write_node(node)
  emit(node)
  super # the value can hold its own compound assignment
end