Sha256: b27dcafef1894db03863bc6ebe510bf567acd63e4fb17f2e360dc485a0df902b

Contents?: true

Size: 1.77 KB

Versions: 2

Compression:

Stored size: 1.77 KB

Contents

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

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
mutant-0.5.19 lib/mutant/expression/method.rb
mutant-0.5.18 lib/mutant/expression/method.rb