Sha256: c359a75da1c11696f42e0354b437b7fb709aa5e864a01e54027ec2ed3112b41d

Contents?: true

Size: 1.83 KB

Versions: 10

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literal: true

module Mutant
  # An abstract context where mutations can be applied to.
  class Context
    include Adamantium, Anima.new(:scope, :source_path)
    extend AST::Sexp

    NAMESPACE_DELIMITER = '::'

    # Return root node for mutation
    #
    # @return [Parser::AST::Node]
    def root(node)
      nesting.reverse.reduce(node) do |current, scope|
        self.class.wrap(scope, current)
      end
    end

    # Identification string
    #
    # @return [String]
    def identification
      scope.name
    end

    # Wrap node into ast node
    #
    # @param [Class, Module] scope
    # @param [Parser::AST::Node] node
    #
    # @return [Parser::AST::Class]
    #   if scope is of kind Class
    #
    # @return [Parser::AST::Module]
    #   if scope is of kind module
    def self.wrap(scope, node)
      name = s(:const, nil, scope.name.split(NAMESPACE_DELIMITER).last.to_sym)
      case scope
      when Class
        s(:class, name, nil, node)
      when Module
        s(:module, name, node)
      end
    end

    # Nesting of scope
    #
    # @return [Enumerable<Class,Module>]
    def nesting
      const = Object
      name_nesting.map do |name|
        const = const.const_get(name)
      end
    end
    memoize :nesting

    # Unqualified name of scope
    #
    # @return [String]
    def unqualified_name
      name_nesting.last
    end

    # Match expressions for scope
    #
    # @return [Enumerable<Expression>]
    def match_expressions
      name_nesting.each_index.reverse_each.map do |index|
        Expression::Namespace::Recursive.new(
          scope_name: name_nesting.take(index.succ).join(NAMESPACE_DELIMITER)
        )
      end
    end
    memoize :match_expressions

  private

    def name_nesting
      scope.name.split(NAMESPACE_DELIMITER)
    end
    memoize :name_nesting

  end # Context
end # Mutant

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
mutant-0.11.28 lib/mutant/context.rb
mutant-0.11.27 lib/mutant/context.rb
mutant-0.11.26 lib/mutant/context.rb
mutant-0.11.25 lib/mutant/context.rb
mutant-0.11.24 lib/mutant/context.rb
mutant-0.11.23 lib/mutant/context.rb
mutant-0.11.22 lib/mutant/context.rb
mutant-0.11.21 lib/mutant/context.rb
mutant-0.11.20 lib/mutant/context.rb
mutant-0.11.19 lib/mutant/context.rb