Class: Mutineer::Mutators::ReturnNil

Inherits:
Base
  • Object
show all
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

Methods inherited from Base

#heredoc?

Instance Method Details

#emit(loc) ⇒ void (private)

This method returns an undefined value.

Emits a return-nil mutation.

Parameters:

  • loc (Prism::Location) —

    source location.



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.

Parameters:

  • body (Prism::Node) —

    method body node.



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.

Parameters:

  • subject (Mutineer::Subject) —

    subject to inspect.

  • source (String) —

    full source text.

Returns:



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).

Parameters:

  • node (Prism::DefNode) —

    nested definition node.



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.

Parameters:

  • node (Prism::ReturnNode) —

    node to inspect.



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