Class: Orthoses::Trace::Attribute

Inherits:
Object
  • Object
show all
Includes:
Targetable
Defined in:
lib/orthoses/trace/attribute.rb

Defined Under Namespace

Modules: Hook

Instance Method Summary collapse

Methods included from Targetable

#target?

Constructor Details

#initialize(loader, patterns:, sort_union_types: true) ⇒ Attribute

Returns a new instance of Attribute.



26
27
28
29
30
31
32
# File 'lib/orthoses/trace/attribute.rb', line 26

def initialize(loader, patterns:, sort_union_types: true)
  @loader = loader
  @patterns = patterns
  @sort_union_types = sort_union_types

  @captured_dict = Hash.new { |h, k| h[k] = Hash.new { |hh, kk| hh[kk] = [] } }
end

Instance Method Details

#callObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/orthoses/trace/attribute.rb', line 34

def call
  ::Module.prepend(Hook)
  store =
    build_trace_hook.enable(target: Hook.instance_method(:attr)) do
      build_trace_hook.enable(target: Hook.instance_method(:attr_accessor)) do
        build_trace_hook.enable(target: Hook.instance_method(:attr_reader)) do
          build_trace_hook.enable(target: Hook.instance_method(:attr_writer)) do
            @loader.call
          end
        end
      end
    end

  @captured_dict.each do |mod_name, captures|
    captures.each do |(kind, prefix, name), types|
      types.sort! if @sort_union_types
      injected = Utils::TypeList.new(types).inject
      store[mod_name] << "#{kind} #{prefix}#{name}: #{injected}"
    end
  end

  store
end