mutant 0.8.10 → 0.8.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -4
  3. data/Changelog.md +8 -0
  4. data/README.md +112 -43
  5. data/Rakefile +2 -16
  6. data/circle.yml +1 -1
  7. data/config/flay.yml +2 -2
  8. data/config/flog.yml +1 -1
  9. data/config/reek.yml +3 -4
  10. data/config/rubocop.yml +53 -16
  11. data/lib/mutant.rb +27 -6
  12. data/lib/mutant/ast/meta/const.rb +2 -0
  13. data/lib/mutant/ast/meta/optarg.rb +2 -0
  14. data/lib/mutant/ast/meta/resbody.rb +2 -0
  15. data/lib/mutant/ast/meta/restarg.rb +2 -0
  16. data/lib/mutant/ast/meta/send.rb +4 -0
  17. data/lib/mutant/ast/meta/symbol.rb +2 -0
  18. data/lib/mutant/ast/named_children.rb +14 -4
  19. data/lib/mutant/ast/nodes.rb +3 -1
  20. data/lib/mutant/ast/regexp.rb +53 -0
  21. data/lib/mutant/ast/regexp/transformer.rb +185 -0
  22. data/lib/mutant/ast/regexp/transformer/alternative.rb +39 -0
  23. data/lib/mutant/ast/regexp/transformer/character_set.rb +46 -0
  24. data/lib/mutant/ast/regexp/transformer/direct.rb +99 -0
  25. data/lib/mutant/ast/regexp/transformer/options_group.rb +66 -0
  26. data/lib/mutant/ast/regexp/transformer/quantifier.rb +112 -0
  27. data/lib/mutant/ast/regexp/transformer/recursive.rb +50 -0
  28. data/lib/mutant/ast/regexp/transformer/root.rb +29 -0
  29. data/lib/mutant/ast/regexp/transformer/text.rb +55 -0
  30. data/lib/mutant/ast/types.rb +92 -5
  31. data/lib/mutant/cli.rb +2 -14
  32. data/lib/mutant/color.rb +1 -1
  33. data/lib/mutant/config.rb +1 -3
  34. data/lib/mutant/expression/methods.rb +1 -1
  35. data/lib/mutant/expression/namespace.rb +2 -2
  36. data/lib/mutant/expression/parser.rb +1 -1
  37. data/lib/mutant/integration.rb +10 -28
  38. data/lib/mutant/isolation.rb +9 -60
  39. data/lib/mutant/isolation/fork.rb +72 -0
  40. data/lib/mutant/isolation/none.rb +25 -0
  41. data/lib/mutant/matcher/config.rb +2 -0
  42. data/lib/mutant/matcher/method/singleton.rb +5 -4
  43. data/lib/mutant/meta.rb +11 -4
  44. data/lib/mutant/meta/example.rb +2 -116
  45. data/lib/mutant/meta/example/dsl.rb +22 -19
  46. data/lib/mutant/meta/example/verification.rb +86 -0
  47. data/lib/mutant/mutator.rb +22 -49
  48. data/lib/mutant/mutator/node.rb +15 -19
  49. data/lib/mutant/mutator/node/and_asgn.rb +1 -1
  50. data/lib/mutant/mutator/node/argument.rb +10 -5
  51. data/lib/mutant/mutator/node/arguments.rb +5 -9
  52. data/lib/mutant/mutator/node/begin.rb +4 -17
  53. data/lib/mutant/mutator/node/block.rb +1 -1
  54. data/lib/mutant/mutator/node/break.rb +1 -1
  55. data/lib/mutant/mutator/node/class.rb +21 -0
  56. data/lib/mutant/mutator/node/conditional_loop.rb +1 -1
  57. data/lib/mutant/mutator/node/define.rb +1 -1
  58. data/lib/mutant/mutator/node/defined.rb +1 -1
  59. data/lib/mutant/mutator/node/dstr.rb +1 -1
  60. data/lib/mutant/mutator/node/dsym.rb +1 -1
  61. data/lib/mutant/mutator/node/generic.rb +3 -3
  62. data/lib/mutant/mutator/node/kwbegin.rb +1 -1
  63. data/lib/mutant/mutator/node/literal.rb +9 -0
  64. data/lib/mutant/mutator/node/literal/boolean.rb +1 -1
  65. data/lib/mutant/mutator/node/literal/fixnum.rb +2 -2
  66. data/lib/mutant/mutator/node/literal/float.rb +4 -6
  67. data/lib/mutant/mutator/node/literal/hash.rb +1 -1
  68. data/lib/mutant/mutator/node/literal/nil.rb +1 -1
  69. data/lib/mutant/mutator/node/literal/range.rb +2 -19
  70. data/lib/mutant/mutator/node/literal/regex.rb +43 -3
  71. data/lib/mutant/mutator/node/literal/string.rb +1 -1
  72. data/lib/mutant/mutator/node/literal/symbol.rb +2 -4
  73. data/lib/mutant/mutator/node/masgn.rb +1 -1
  74. data/lib/mutant/mutator/node/match_current_line.rb +1 -1
  75. data/lib/mutant/mutator/node/mlhs.rb +2 -3
  76. data/lib/mutant/mutator/node/named_value/access.rb +2 -2
  77. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +4 -3
  78. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +4 -4
  79. data/lib/mutant/mutator/node/next.rb +1 -1
  80. data/lib/mutant/mutator/node/nthref.rb +1 -1
  81. data/lib/mutant/mutator/node/or_asgn.rb +1 -1
  82. data/lib/mutant/mutator/node/regexp.rb +44 -0
  83. data/lib/mutant/mutator/node/regopt.rb +31 -0
  84. data/lib/mutant/mutator/node/resbody.rb +1 -1
  85. data/lib/mutant/mutator/node/rescue.rb +1 -3
  86. data/lib/mutant/mutator/node/return.rb +1 -1
  87. data/lib/mutant/mutator/node/send.rb +43 -3
  88. data/lib/mutant/mutator/node/send/attribute_assignment.rb +4 -1
  89. data/lib/mutant/mutator/node/send/conditional.rb +23 -0
  90. data/lib/mutant/mutator/node/send/index.rb +1 -1
  91. data/lib/mutant/mutator/node/splat.rb +1 -1
  92. data/lib/mutant/mutator/node/when.rb +1 -1
  93. data/lib/mutant/mutator/node/yield.rb +1 -1
  94. data/lib/mutant/mutator/util.rb +0 -30
  95. data/lib/mutant/mutator/util/array.rb +4 -16
  96. data/lib/mutant/parallel.rb +1 -1
  97. data/lib/mutant/parallel/worker.rb +1 -1
  98. data/lib/mutant/registry.rb +44 -0
  99. data/lib/mutant/reporter/cli/format.rb +2 -0
  100. data/lib/mutant/reporter/cli/printer.rb +2 -2
  101. data/lib/mutant/reporter/cli/printer/config.rb +0 -1
  102. data/lib/mutant/reporter/cli/printer/env_progress.rb +1 -11
  103. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +1 -1
  104. data/lib/mutant/reporter/cli/printer/mutation_result.rb +2 -0
  105. data/lib/mutant/reporter/cli/tput.rb +1 -1
  106. data/lib/mutant/reporter/sequence.rb +3 -0
  107. data/lib/mutant/require_highjack.rb +6 -2
  108. data/lib/mutant/result.rb +1 -1
  109. data/lib/mutant/subject.rb +5 -5
  110. data/lib/mutant/subject/method/instance.rb +1 -2
  111. data/lib/mutant/util.rb +18 -0
  112. data/lib/mutant/version.rb +1 -1
  113. data/lib/mutant/zombifier.rb +5 -3
  114. data/meta/and.rb +1 -1
  115. data/meta/and_asgn.rb +1 -1
  116. data/meta/array.rb +2 -2
  117. data/meta/begin.rb +2 -2
  118. data/meta/block.rb +7 -7
  119. data/meta/block_pass.rb +1 -1
  120. data/meta/blockarg.rb +1 -1
  121. data/meta/break.rb +1 -1
  122. data/meta/case.rb +2 -2
  123. data/meta/casgn.rb +11 -2
  124. data/meta/cbase.rb +1 -1
  125. data/meta/class.rb +10 -0
  126. data/meta/const.rb +9 -1
  127. data/meta/csend.rb +8 -0
  128. data/meta/cvar.rb +1 -1
  129. data/meta/cvasgn.rb +1 -1
  130. data/meta/date.rb +4 -4
  131. data/meta/def.rb +14 -14
  132. data/meta/defined.rb +1 -1
  133. data/meta/dstr.rb +1 -1
  134. data/meta/dsym.rb +1 -1
  135. data/meta/ensure.rb +1 -1
  136. data/meta/false.rb +1 -1
  137. data/meta/float.rb +3 -3
  138. data/meta/gvar.rb +1 -1
  139. data/meta/gvasgn.rb +1 -1
  140. data/meta/hash.rb +1 -1
  141. data/meta/if.rb +17 -3
  142. data/meta/int.rb +1 -1
  143. data/meta/ivar.rb +1 -1
  144. data/meta/ivasgn.rb +14 -1
  145. data/meta/kwarg.rb +8 -0
  146. data/meta/kwbegin.rb +1 -1
  147. data/meta/kwoptarg.rb +11 -0
  148. data/meta/lvar.rb +1 -1
  149. data/meta/lvasgn.rb +1 -1
  150. data/meta/masgn.rb +1 -1
  151. data/meta/match_current_line.rb +2 -2
  152. data/meta/next.rb +1 -1
  153. data/meta/nil.rb +1 -1
  154. data/meta/nthref.rb +5 -5
  155. data/meta/op_assgn.rb +1 -1
  156. data/meta/or.rb +1 -1
  157. data/meta/or_asgn.rb +5 -5
  158. data/meta/range.rb +2 -8
  159. data/meta/redo.rb +1 -1
  160. data/meta/regexp.rb +106 -0
  161. data/meta/regexp/regexp_bol_anchor.rb +13 -0
  162. data/meta/regexp/regexp_bos_anchor.rb +26 -0
  163. data/meta/regexp/regexp_root_expression.rb +13 -0
  164. data/meta/regopt.rb +8 -0
  165. data/meta/rescue.rb +49 -4
  166. data/meta/restarg.rb +6 -9
  167. data/meta/return.rb +2 -2
  168. data/meta/self.rb +1 -1
  169. data/meta/send.rb +228 -55
  170. data/meta/str.rb +1 -1
  171. data/meta/super.rb +3 -3
  172. data/meta/{symbol.rb → sym.rb} +1 -1
  173. data/meta/true.rb +1 -1
  174. data/meta/until.rb +1 -1
  175. data/meta/while.rb +2 -2
  176. data/meta/yield.rb +1 -1
  177. data/mutant-rspec.gemspec +2 -2
  178. data/mutant.gemspec +6 -5
  179. data/spec/integration/mutant/isolation/fork_spec.rb +8 -0
  180. data/spec/integration/mutant/rspec_spec.rb +1 -1
  181. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +1 -2
  182. data/spec/integrations.yml +93 -24
  183. data/spec/spec_helper.rb +12 -7
  184. data/spec/support/compress_helper.rb +1 -1
  185. data/spec/support/corpus.rb +115 -50
  186. data/spec/support/fake_actor.rb +5 -5
  187. data/spec/support/file_system.rb +1 -1
  188. data/spec/support/ice_nine_config.rb +3 -3
  189. data/spec/support/ruby_vm.rb +11 -12
  190. data/spec/support/shared_context.rb +22 -13
  191. data/spec/support/test_app.rb +1 -1
  192. data/spec/support/warning.rb +64 -0
  193. data/spec/support/warnings.yml +4 -0
  194. data/spec/support/xspec.rb +177 -0
  195. data/spec/unit/mutant/actor/env_spec.rb +2 -2
  196. data/spec/unit/mutant/actor/sender_spec.rb +1 -1
  197. data/spec/unit/mutant/ast/meta/send_spec.rb +1 -1
  198. data/spec/unit/mutant/ast/named_children_spec.rb +26 -0
  199. data/spec/unit/mutant/ast/regexp/parse_spec.rb +7 -0
  200. data/spec/unit/mutant/ast/regexp/supported_predicate_spec.rb +14 -0
  201. data/spec/unit/mutant/ast/regexp/transformer/lookup_table/table_spec.rb +19 -0
  202. data/spec/unit/mutant/ast/regexp/transformer/lookup_table_spec.rb +33 -0
  203. data/spec/unit/mutant/ast/regexp/transformer_spec.rb +19 -0
  204. data/spec/unit/mutant/ast/regexp_spec.rb +617 -0
  205. data/spec/unit/mutant/cli_spec.rb +7 -45
  206. data/spec/unit/mutant/context_spec.rb +4 -7
  207. data/spec/unit/mutant/env/{boostrap_spec.rb → bootstrap_spec.rb} +2 -2
  208. data/spec/unit/mutant/env_spec.rb +13 -16
  209. data/spec/unit/mutant/expression/namespace/{flat_spec.rb → exact_spec.rb} +0 -0
  210. data/spec/unit/mutant/integration/rspec_spec.rb +2 -2
  211. data/spec/unit/mutant/integration_spec.rb +14 -0
  212. data/spec/unit/mutant/isolation/fork_spec.rb +155 -0
  213. data/spec/unit/mutant/isolation/none_spec.rb +16 -0
  214. data/spec/unit/mutant/loader_spec.rb +1 -1
  215. data/spec/unit/mutant/matcher/methods/instance_spec.rb +2 -4
  216. data/spec/unit/mutant/meta/example/dsl_spec.rb +106 -0
  217. data/spec/unit/mutant/meta/example/verification_spec.rb +120 -0
  218. data/spec/unit/mutant/meta/example_spec.rb +32 -0
  219. data/spec/unit/mutant/mutator/node_spec.rb +37 -4
  220. data/spec/unit/mutant/mutator_spec.rb +21 -0
  221. data/spec/unit/mutant/{runner → parallel}/driver_spec.rb +0 -0
  222. data/spec/unit/mutant/parallel/master_spec.rb +13 -13
  223. data/spec/unit/mutant/registry_spec.rb +47 -0
  224. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -4
  225. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -8
  226. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -2
  227. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -8
  228. data/spec/unit/mutant/reporter/cli/printer/status_spec.rb +0 -34
  229. data/spec/unit/mutant/reporter/cli_spec.rb +0 -22
  230. data/spec/unit/mutant/repository/diff_spec.rb +6 -6
  231. data/spec/unit/mutant/require_highjack_spec.rb +38 -14
  232. data/spec/unit/mutant/result/env_spec.rb +1 -4
  233. data/spec/unit/mutant/runner_spec.rb +1 -1
  234. data/spec/unit/mutant/subject/method/instance_spec.rb +1 -1
  235. data/spec/unit/mutant/subject_spec.rb +3 -3
  236. data/spec/unit/mutant/util/one_spec.rb +20 -0
  237. data/spec/unit/mutant/zombifier_spec.rb +18 -18
  238. data/test_app/{Gemfile.rspec3.3 → Gemfile.rspec3.5} +2 -2
  239. metadata +94 -24
  240. data/TODO +0 -21
  241. data/lib/mutant/mutator/node/blockarg.rb +0 -13
  242. data/lib/mutant/mutator/node/restarg.rb +0 -13
  243. data/lib/mutant/mutator/registry.rb +0 -49
  244. data/meta/boolean.rb +0 -13
  245. data/meta/regex.rb +0 -19
  246. data/spec/unit/mutant/isolation_spec.rb +0 -104
  247. data/spec/unit/mutant/mutator/registry_spec.rb +0 -57
@@ -20,11 +20,11 @@ module Mutant
20
20
  def self.define_named_child(name, index)
21
21
  super
22
22
 
23
- define_method("emit_#{name}_mutations") do |&block|
23
+ define_method(:"emit_#{name}_mutations") do |&block|
24
24
  mutate_child(index, &block)
25
25
  end
26
26
 
27
- define_method("emit_#{name}") do |node|
27
+ define_method(:"emit_#{name}") do |node|
28
28
  emit_child_update(index, node)
29
29
  end
30
30
  end
@@ -54,10 +54,9 @@ module Mutant
54
54
  # @param [Fixnum] index
55
55
  #
56
56
  # @return [undefined]
57
- def mutate_child(index, mutator = Mutator, &block)
57
+ def mutate_child(index, &block)
58
58
  block ||= TAUTOLOGY
59
- child = children.at(index)
60
- mutator.each(child, self) do |mutation|
59
+ Mutator.mutate(children.fetch(index), self).each do |mutation|
61
60
  next unless block.call(mutation)
62
61
  emit_child_update(index, mutation)
63
62
  end
@@ -117,17 +116,6 @@ module Mutant
117
116
  emit(N_NIL) unless asgn_left?
118
117
  end
119
118
 
120
- # Emit values
121
- #
122
- # @param [Array<Object>] values
123
- #
124
- # @return [undefined]
125
- def emit_values(values)
126
- values.each do |value|
127
- emit_type(value)
128
- end
129
- end
130
-
131
119
  # Parent node
132
120
  #
133
121
  # @return [Parser::AST::Node] node
@@ -163,9 +151,17 @@ module Mutant
163
151
  #
164
152
  # @return [Enumerable<Fixnum>]
165
153
  def children_indices(range)
166
- range_end = range.end
167
- last_index = range_end >= 0 ? range_end : children.length + range_end
168
- range.begin.upto(last_index)
154
+ range.begin.upto(children.length + range.end)
155
+ end
156
+
157
+ # Emit single child mutation
158
+ #
159
+ # @return [undefined]
160
+ def mutate_single_child
161
+ children.each_with_index do |child, index|
162
+ mutate_child(index)
163
+ yield child, index unless children.one?
164
+ end
169
165
  end
170
166
 
171
167
  end # Node
@@ -2,7 +2,7 @@ module Mutant
2
2
  class Mutator
3
3
  class Node
4
4
 
5
- # OpAsgn mutator
5
+ # AndAsgn mutator
6
6
  class AndAsgn < self
7
7
 
8
8
  handle(:and_asgn)
@@ -4,7 +4,7 @@ module Mutant
4
4
 
5
5
  # Mutator for required arguments
6
6
  class Argument < self
7
- handle(:arg)
7
+ handle(:arg, :kwarg)
8
8
 
9
9
  UNDERSCORE = '_'.freeze
10
10
 
@@ -12,7 +12,7 @@ module Mutant
12
12
 
13
13
  private
14
14
 
15
- # Perform dispatch
15
+ # Emit mutations
16
16
  #
17
17
  # @return [undefined]
18
18
  def dispatch
@@ -37,13 +37,18 @@ module Mutant
37
37
  # Mutator for optional arguments
38
38
  class Optional < self
39
39
 
40
- handle(:optarg)
40
+ TYPE_MAP = IceNine.deep_freeze(
41
+ optarg: :arg,
42
+ kwoptarg: :kwarg
43
+ )
44
+
45
+ handle(:optarg, :kwoptarg)
41
46
 
42
47
  children :name, :default
43
48
 
44
49
  private
45
50
 
46
- # Perform dispatch
51
+ # Emit mutations
47
52
  #
48
53
  # @return [undefined]
49
54
  def dispatch
@@ -56,7 +61,7 @@ module Mutant
56
61
  #
57
62
  # @return [undefined]
58
63
  def emit_required_mutation
59
- emit(s(:arg, name))
64
+ emit(s(TYPE_MAP.fetch(node.type), name))
60
65
  end
61
66
 
62
67
  end # Optional
@@ -8,7 +8,7 @@ module Mutant
8
8
 
9
9
  private
10
10
 
11
- # Perform dispatch
11
+ # Emit mutations
12
12
  #
13
13
  # @return [undefined]
14
14
  def dispatch
@@ -22,7 +22,7 @@ module Mutant
22
22
  # @return [undefined]
23
23
  def emit_argument_presence
24
24
  emit_type
25
- Mutator::Util::Array::Presence.each(children, self) do |children|
25
+ Util::Array::Presence.call(children).each do |children|
26
26
  emit_type(*children)
27
27
  end
28
28
  end
@@ -32,7 +32,7 @@ module Mutant
32
32
  # @return [undefined]
33
33
  def emit_argument_mutations
34
34
  children.each_with_index do |child, index|
35
- Mutator.each(child) do |mutant|
35
+ Mutator.mutate(child).each do |mutant|
36
36
  next if invalid_argument_replacement?(mutant, index)
37
37
  emit_child_update(index, mutant)
38
38
  end
@@ -45,11 +45,7 @@ module Mutant
45
45
  #
46
46
  # @return [Boolean]
47
47
  def invalid_argument_replacement?(mutant, index)
48
- original = children.fetch(index)
49
-
50
- n_optarg?(original) &&
51
- n_arg?(mutant) &&
52
- children[0...index].any?(&method(:n_optarg?))
48
+ n_arg?(mutant) && children[0...index].any?(&method(:n_optarg?))
53
49
  end
54
50
 
55
51
  # Emit mlhs expansions
@@ -59,7 +55,7 @@ module Mutant
59
55
  mlhs_childs_with_index.each do |child, index|
60
56
  dup_children = children.dup
61
57
  dup_children.delete_at(index)
62
- dup_children.insert(index, *child.children)
58
+ dup_children.insert(index, *child)
63
59
  emit_type(*dup_children)
64
60
  end
65
61
  end
@@ -9,28 +9,15 @@ module Mutant
9
9
 
10
10
  private
11
11
 
12
- # Emit mutants
12
+ # Emit mutations
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
16
- Util::Array.each(children, self, &method(:emit_child_subset))
17
- children.each_with_index do |child, index|
18
- mutate_child(index)
19
- emit(child) unless children.eql?([child])
16
+ mutate_single_child do |child|
17
+ emit(child)
20
18
  end
21
19
  end
22
-
23
- # Emit child subset
24
- #
25
- # @param [Array<Parser::AST::Node>] children
26
- #
27
- # @return [undefined]
28
- def emit_child_subset(children)
29
- return if children.length < 2
30
- emit_type(*children)
31
- end
32
-
33
- end # Block
20
+ end # Begin
34
21
  end # Node
35
22
  end # Mutator
36
23
  end # Mutant
@@ -10,7 +10,7 @@ module Mutant
10
10
 
11
11
  private
12
12
 
13
- # Emit mutants
13
+ # Emit mutations
14
14
  #
15
15
  # @return [undefined]
16
16
  def dispatch
@@ -13,7 +13,7 @@ module Mutant
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
16
- super
16
+ super()
17
17
  emit_singletons
18
18
  children.each_index(&method(:delete_child))
19
19
  end
@@ -0,0 +1,21 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ # Namespace for class mutations
5
+ class Class < self
6
+ handle :class
7
+
8
+ children :klass, :parent, :body
9
+
10
+ private
11
+
12
+ # Emit mutations only for class body
13
+ #
14
+ # @return [undefined]
15
+ def dispatch
16
+ emit_body_mutations if body
17
+ end
18
+ end # Class
19
+ end # Node
20
+ end # Mutator
21
+ end # Mutant
@@ -22,7 +22,7 @@ module Mutant
22
22
  emit_body(N_RAISE)
23
23
  end
24
24
 
25
- end # While
25
+ end # ConditionalLoop
26
26
  end # Node
27
27
  end # Mutator
28
28
  end # Mutant
@@ -83,7 +83,7 @@ module Mutant
83
83
 
84
84
  children :subject, :name, :arguments, :body
85
85
 
86
- end # Singelton
86
+ end # Singleton
87
87
 
88
88
  end # Define
89
89
  end # Node
@@ -1,7 +1,7 @@
1
1
  module Mutant
2
2
  class Mutator
3
3
  class Node
4
- # Namespace for define mutations
4
+ # Namespace for `defined?` mutations
5
5
  class Defined < self
6
6
 
7
7
  handle(:defined?)
@@ -13,7 +13,7 @@ module Mutant
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
16
- super
16
+ super()
17
17
  emit_singletons
18
18
  end
19
19
 
@@ -13,7 +13,7 @@ module Mutant
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
16
- super
16
+ super()
17
17
  emit_singletons
18
18
  end
19
19
 
@@ -8,9 +8,9 @@ module Mutant
8
8
  # These nodes still need a dedicated mutator,
9
9
  # your contribution is that close!
10
10
  handle(
11
- :csend, :ensure, :redo, :regopt, :retry, :arg_expr,
12
- :kwrestarg, :kwoptarg, :kwarg, :undef, :module, :empty,
13
- :alias, :for, :xstr, :back_ref, :class,
11
+ :ensure, :redo, :retry, :arg_expr, :blockarg,
12
+ :kwrestarg, :undef, :module, :empty,
13
+ :alias, :for, :xstr, :back_ref, :restarg,
14
14
  :sclass, :match_with_lvasgn, :while_post,
15
15
  :until_post, :preexe, :postexe, :iflipflop, :eflipflop, :kwsplat,
16
16
  :shadowarg, :rational, :complex, :__FILE__, :__LINE__
@@ -13,7 +13,7 @@ module Mutant
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
16
- super
16
+ super()
17
17
  emit_singletons
18
18
  end
19
19
 
@@ -4,6 +4,15 @@ module Mutant
4
4
  # Abstract mutator for literal AST nodes
5
5
  class Literal < self
6
6
  include AbstractType
7
+
8
+ private
9
+
10
+ # Emit values
11
+ #
12
+ # @return [undefined]
13
+ def emit_values
14
+ values.each(&method(:emit_type))
15
+ end
7
16
  end # Literal
8
17
  end # Node
9
18
  end # Mutator
@@ -14,7 +14,7 @@ module Mutant
14
14
 
15
15
  handle(*MAP.keys)
16
16
 
17
- # Emit mutants
17
+ # Emit mutations
18
18
  #
19
19
  # @return [undefined]
20
20
  def dispatch
@@ -9,12 +9,12 @@ module Mutant
9
9
 
10
10
  private
11
11
 
12
- # Emit mutants
12
+ # Emit mutations
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
16
16
  emit_singletons
17
- emit_values(values)
17
+ emit_values
18
18
  end
19
19
 
20
20
  # Values to mutate to
@@ -9,12 +9,12 @@ module Mutant
9
9
 
10
10
  private
11
11
 
12
- # Emit mutants
12
+ # Emit mutations
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
16
16
  emit_singletons
17
- emit_values(values)
17
+ emit_values
18
18
  emit_special_cases
19
19
  end
20
20
 
@@ -36,10 +36,8 @@ module Mutant
36
36
  # @return [Array]
37
37
  def values
38
38
  original = children.first
39
- # Work around a bug in RBX/MRI or JRUBY:
40
- [0.0, 1.0, -original].delete_if do |value|
41
- value.eql?(original)
42
- end
39
+
40
+ [0.0, 1.0, -original]
43
41
  end
44
42
 
45
43
  end # Float
@@ -39,7 +39,7 @@ module Mutant
39
39
 
40
40
  private
41
41
 
42
- # Perform dispatch
42
+ # Emit mutations
43
43
  #
44
44
  # @return [undefined]
45
45
  def dispatch
@@ -9,7 +9,7 @@ module Mutant
9
9
 
10
10
  private
11
11
 
12
- # Emit mutants
12
+ # Emit mutations
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
@@ -11,13 +11,13 @@ module Mutant
11
11
  erange: :irange
12
12
  }.freeze
13
13
 
14
- children :start, :_end
14
+ children :lower_bound, :upper_bound
15
15
 
16
16
  handle(*MAP.keys)
17
17
 
18
18
  private
19
19
 
20
- # Emit mutants
20
+ # Emit mutations
21
21
  #
22
22
  # @return [undefined]
23
23
  def dispatch
@@ -34,23 +34,6 @@ module Mutant
34
34
  emit(s(MAP.fetch(node.type), *children))
35
35
  end
36
36
 
37
- # Emit range start mutations
38
- #
39
- # @return [undefined]
40
- def emit_upper_bound_mutations
41
- emit__end_mutations
42
- emit_type(N_NAN, _end)
43
- end
44
-
45
- # Emit start mutations
46
- #
47
- # @return [undefined]
48
- def emit_lower_bound_mutations
49
- emit_start_mutations
50
- emit_type(start, N_INFINITY)
51
- emit_type(start, N_NAN)
52
- end
53
-
54
37
  end # Range
55
38
  end # Literal
56
39
  end # Node