Sha256: fc77e786c79984fc13135c3333ce376f3490cf7724cab49374c0e10f876246ff

Contents?: true

Size: 1.23 KB

Versions: 2

Compression:

Stored size: 1.23 KB

Contents

# typed: true
# frozen_string_literal: true

require "set"

module Tapioca
  # Registers a TracePoint immediately upon load to track points at which
  # classes and modules are opened for definition. This is used to track
  # correspondence between classes/modules and files, as this information isn't
  # available in the ruby runtime without extra accounting.
  module ConstantLocator
    extend Reflection

    @class_files = {}

    # Immediately activated upon load. Observes class/module definition.
    TracePoint.trace(:class) do |tp|
      unless tp.self.singleton_class?
        key = name_of(tp.self)
        file = tp.path
        if file == "(eval)"
          file = T.must(caller_locations)
            .drop_while { |loc| loc.path == "(eval)" }
            .first&.path
        end
        @class_files[key] ||= Set.new
        @class_files[key] << file
      end
    end

    # Returns the files in which this class or module was opened. Doesn't know
    # about situations where the class was opened prior to +require+ing,
    # or where metaprogramming was used via +eval+, etc.
    def self.files_for(klass)
      name = String === klass ? klass : name_of(klass)
      files = @class_files[name]
      files || Set.new
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tapioca-0.5.6 lib/tapioca/constant_locator.rb
tapioca-0.5.5 lib/tapioca/constant_locator.rb