Class: Mutineer::Mutators::ReturnNil
- Defined in:
- lib/mutineer/mutators/return_nil.rb
Overview
Return-nil mutator.
Replaces explicit return values and final expressions with nil.
Instance Method Summary collapse
-
#emit(loc) ⇒ void
private
Emits a return-nil mutation.
-
#final_expression_nil(body) ⇒ void
private
Mutates a method's final expression to nil when eligible.
-
#mutations_for(subject, source) ⇒ Array<Mutineer::Mutation>
Collects return-nil mutations for a subject.
-
#visit_def_node(node) ⇒ void
Nested method definitions are discovered as their own subjects; do not recurse into them (prevents double-counting their statements).
-
#visit_return_node(node) ⇒ void
Visits return nodes.
Methods inherited from Base
Instance Method Details
#emit(loc) ⇒ void (private)
This method returns an undefined value.
Emits a return-nil mutation.
68 69 70 71 72 73 74 75 |
# File 'lib/mutineer/mutators/return_nil.rb', line 68 def emit(loc) @mutations << Mutation.new( start_offset: loc.start_offset, end_offset: loc.end_offset, replacement: "nil", operator: :return_nil ) end |
#final_expression_nil(body) ⇒ void (private)
This method returns an undefined value.
Mutates a method's final expression to nil when eligible.
55 56 57 58 59 60 61 62 |
# File 'lib/mutineer/mutators/return_nil.rb', line 55 def final_expression_nil(body) return unless body.is_a?(Prism::StatementsNode) last = body.body.last return if last.nil? || last.is_a?(Prism::ReturnNode) || last.is_a?(Prism::NilNode) emit(last.location) end |
#mutations_for(subject, source) ⇒ Array<Mutineer::Mutation>
Collects return-nil mutations for a subject.
16 17 18 19 20 21 22 23 24 25 |
# File 'lib/mutineer/mutators/return_nil.rb', line 16 def mutations_for(subject, source) @source = source @mutations = [] body = subject.def_node.body if body body.accept(self) # rule 1 (explicit return nodes in this body) final_expression_nil(body) # rule 2 (method's final expression) end @mutations end |
#visit_def_node(node) ⇒ void
This method returns an undefined value.
Nested method definitions are discovered as their own subjects; do not recurse into them (prevents double-counting their statements).
47 |
# File 'lib/mutineer/mutators/return_nil.rb', line 47 def visit_def_node(node); end |
#visit_return_node(node) ⇒ void
This method returns an undefined value.
Visits return nodes.
31 32 33 34 35 36 37 38 39 40 |
# File 'lib/mutineer/mutators/return_nil.rb', line 31 def visit_return_node(node) args = node.arguments if args values = args.arguments unless values.size == 1 && values.first.is_a?(Prism::NilNode) emit(args.location) end end super end |