Class: Mutant::Context::Scope

Inherits:
Mutant::Context show all
Extended by:
AST::Sexp
Includes:
Adamantium::Flat
Defined in:
lib/mutant/context/scope.rb

Overview

Scope context for mutation (Class or Module)

Constant Summary collapse

NAMESPACE_DELIMITER =
'::'.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#scope::Module|::Class (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Scope wrapped by context

Returns:

  • (::Module|::Class)


96
97
98
# File 'lib/mutant/context/scope.rb', line 96

def scope
  @scope
end

Class Method Details

.wrap(scope, node) ⇒ Parser::AST::Class, Parser::AST::Module

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Wrap node into ast node

Parameters:

  • scope (Class, Module)
  • node (Parser::AST::Node)

Returns:

  • (Parser::AST::Class)

    if scope is of kind Class

  • (Parser::AST::Module)

    if scope is of kind module



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/mutant/context/scope.rb', line 42

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)
  else
    fail "Cannot wrap scope: #{scope.inspect}"
  end
end

Instance Method Details

#identificationString

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Identification string

Returns:

  • (String)


26
27
28
# File 'lib/mutant/context/scope.rb', line 26

def identification
  scope.name
end

#match_expressionsEnumerable<Expression>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Match expressions for scope

Returns:



82
83
84
85
86
87
88
# File 'lib/mutant/context/scope.rb', line 82

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

#nestingEnumerable<Class,Module>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Nesting of scope

Returns:

  • (Enumerable<Class,Module>)


59
60
61
62
63
64
65
# File 'lib/mutant/context/scope.rb', line 59

def nesting
  const = ::Object
  name_nesting.each_with_object([]) do |name, nesting|
    const = const.const_get(name)
    nesting << const
  end
end

#root(node) ⇒ Parser::AST::Node

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Return root node for mutation

Returns:

  • (Parser::AST::Node)


15
16
17
18
19
# File 'lib/mutant/context/scope.rb', line 15

def root(node)
  nesting.reverse.reduce(node) do |current, scope|
    self.class.wrap(scope, current)
  end
end

#unqualified_nameString

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Unqualified name of scope

Returns:

  • (String)


73
74
75
# File 'lib/mutant/context/scope.rb', line 73

def unqualified_name
  name_nesting.last
end