free_mutant/lib/mutant/subject.rb

96 lines
1.9 KiB
Ruby
Raw Normal View History

module Mutant
# Subject of a mutation
2012-08-01 18:34:03 +02:00
class Subject
2013-07-28 19:05:17 +02:00
include AbstractType, Adamantium::Flat, Enumerable
include Concord::Public.new(:context, :node)
# Mutations for this subject
#
# @return [Enumerable<Mutation>]
# @return [undefined]
def mutations
2014-07-05 23:32:07 +00:00
mutations = [neutral_mutation]
Mutator.each(node) do |mutant|
mutations << Mutation::Evil.new(self, wrap_node(mutant))
end
mutations
end
memoize :mutations
# Source path
#
# @return [Pathname]
def source_path
context.source_path
end
# Prepare subject for insertion of mutation
#
# @return [self]
def prepare
self
end
# Source line range
2014-10-05 15:04:57 +00:00
#
# @return [Range<Fixnum>]
def source_lines
expression = node.location.expression
expression.line..expression.source_buffer.decompose_position(expression.end_pos).first
end
memoize :source_lines
# First source line
#
# @return [Fixnum]
def source_line
2014-10-05 15:04:57 +00:00
source_lines.begin
end
# Identification string
#
# @return [String]
def identification
"#{expression.syntax}:#{source_path}:#{source_line}"
end
memoize :identification
# Source representation of AST
#
# @return [String]
def source
Unparser.unparse(wrap_node(node))
end
memoize :source
# Match expression
2013-01-13 22:25:49 +01:00
#
# @return [Expression]
abstract_method :expression
# Match expressions
#
# @return [Enumerable<Expression>]
abstract_method :match_expressions
private
2013-01-13 22:25:49 +01:00
# Neutral mutation
#
# @return [Mutation::Neutral]
2014-07-05 23:32:07 +00:00
def neutral_mutation
Mutation::Neutral.new(self, wrap_node(node))
end
# Wrap node into subject specific container
#
# @param [Parser::AST::Node] node
#
# @return [Parser::AST::Node]
def wrap_node(node)
node
2014-07-05 23:32:07 +00:00
end
end # Subject
end # Mutant