Sha256: 013df9e53fae1f0d2dff8c0f2086e658858c4bc06ac7cda2551054e67da33c00

Contents?: true

Size: 1.72 KB

Versions: 5

Compression:

Stored size: 1.72 KB

Contents

# frozen_string_literal: true

module Mutant
  class Matcher
    class Method
      # Matcher for singleton methods
      class Singleton < self

        # New singleton method matcher
        #
        # @param [Class, Module] scope
        # @param [Symbol] method_name
        #
        # @return [Matcher::Method::Singleton]
        def self.new(scope, method_name)
          super(scope, method_name, Evaluator)
        end

        # Singleton method evaluator
        class Evaluator < Evaluator
          MATCH_NODE_TYPE  = :defs
          NAME_INDEX       = 1
          RECEIVER_INDEX   = 0
          RECEIVER_WARNING = 'Can only match :defs on :self or :const got %p unable to match'
          SUBJECT_CLASS    = Subject::Method::Singleton

        private

          def match?(node)
            n_defs?(node) && line?(node) && name?(node) && receiver?(node)
          end

          def line?(node)
            node
              .location
              .line
              .equal?(source_line)
          end

          def name?(node)
            node.children.fetch(NAME_INDEX).equal?(method_name)
          end

          def receiver?(node)
            receiver = node.children.fetch(RECEIVER_INDEX)
            case receiver.type
            when :self
              true
            when :const
              receiver_name?(receiver)
            else
              env.warn(RECEIVER_WARNING % receiver.type)
              nil
            end
          end

          def receiver_name?(node)
            name = node.children.fetch(NAME_INDEX)
            name.to_s.eql?(context.unqualified_name)
          end

        end # Evaluator

        private_constant(*constants(false))
      end # Singleton
    end # Method
  end # Matcher
end # Mutant

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
mutant-0.11.18 lib/mutant/matcher/method/singleton.rb
mutant-0.11.17 lib/mutant/matcher/method/singleton.rb
mutant-0.11.16 lib/mutant/matcher/method/singleton.rb
mutant-0.11.15 lib/mutant/matcher/method/singleton.rb
mutant-0.11.14 lib/mutant/matcher/method/singleton.rb