8335cccafb
* Reduce redunrant 'Return' prefix on summaries * Improve summary line to reflect the semantics of operation better
66 lines
1.3 KiB
Ruby
66 lines
1.3 KiB
Ruby
module Mutant
|
|
class Expression
|
|
|
|
# Abstract base class for methods expression
|
|
class Methods < self
|
|
include Anima.new(:scope_name, :scope_symbol)
|
|
private(*anima.attribute_names)
|
|
|
|
MATCHERS = IceNine.deep_freeze(
|
|
'.' => Matcher::Methods::Singleton,
|
|
'#' => Matcher::Methods::Instance
|
|
)
|
|
private_constant(*constants(false))
|
|
|
|
REGEXP = /\A#{SCOPE_NAME_PATTERN}#{SCOPE_SYMBOL_PATTERN}\z/.freeze
|
|
|
|
# Syntax of expression
|
|
#
|
|
# @return [String]
|
|
#
|
|
# @api private
|
|
def syntax
|
|
[scope_name, scope_symbol].join
|
|
end
|
|
memoize :syntax
|
|
|
|
# Matcher on expression
|
|
#
|
|
# @param [Env] env
|
|
#
|
|
# @return [Matcher::Method]
|
|
#
|
|
# @api private
|
|
def matcher(env)
|
|
MATCHERS.fetch(scope_symbol).new(env, scope)
|
|
end
|
|
|
|
# Length of match with other expression
|
|
#
|
|
# @param [Expression] expression
|
|
#
|
|
# @return [Fixnum]
|
|
#
|
|
# @api private
|
|
def match_length(expression)
|
|
if expression.syntax.start_with?(syntax)
|
|
syntax.length
|
|
else
|
|
0
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
# Scope object
|
|
#
|
|
# @return [Class, Method]
|
|
#
|
|
# @api private
|
|
def scope
|
|
Object.const_get(scope_name)
|
|
end
|
|
|
|
end # Method
|
|
end # Expression
|
|
end # Mutant
|