free_mutant/lib/mutant/expression/method.rb
2014-05-31 01:09:27 +00:00

92 lines
1.8 KiB
Ruby

module Mutant
class Expression
# Explicit method expression
class Method < self
MATCHERS = {
'.' => Matcher::Methods::Singleton,
'#' => Matcher::Methods::Instance
}.freeze
regexp = /
\A
(?<scope_name>#{SCOPE_PATTERN})
(?<scope_symbol>[.#])
(?<method_name>#{METHOD_NAME_PATTERN})
\z
/x.freeze
register(regexp)
# Return method matcher
#
# @param [Cache] cache
#
# @return [Matcher::Method]
#
# @api private
#
def matcher(cache)
methods_matcher = MATCHERS.fetch(scope_symbol).new(cache, scope)
method = methods_matcher.methods.detect do |method|
method.name == method_name
end or raise NameError, "Cannot find method #{identifier}"
methods_matcher.matcher.build(cache, scope, method)
end
private
# Return scope name
#
# @return [String]
#
# @api private
#
def scope_name
match[__method__]
end
# Return scope
#
# @return [Class, Method]
#
# @api private
#
def scope
Mutant.constant_lookup(scope_name)
end
# Return method name
#
# @return [String]
#
# @api private
#
def method_name
match[__method__].to_sym
end
# Return scope symbol
#
# @return [Symbol]
#
# @api private
#
def scope_symbol
match[__method__]
end
# Return matcher class
#
# @return [Class:Mutant::Matcher]
#
# @api private
#
def methods_matcher(cache)
MATCHERS.fetch(scope_symbol).new(cache, scope)
end
end # Method
end # Expression
end # Mutant