Sha256: f8ad9080e3f46b5d0819f5f0701f1429914adb3b1d1d50af9a48c26eb168f225

Contents?: true

Size: 1.3 KB

Versions: 4

Compression:

Stored size: 1.3 KB

Contents

# frozen_string_literal: true

module Orthoses
  module ActiveSupport
    class Concern
      def initialize(loader)
        @loader = loader
      end

      def call
        lazy_tracer = Orthoses::CallTracer::Lazy.new

        store = lazy_tracer.trace('ActiveSupport::Concern#class_methods') do
          @loader.call
        end

        lazy_tracer.captures.each do |capture|
          receiver_name = Orthoses::Utils.module_name(capture.method.receiver)
          next unless receiver_name

          class_methods_name = "#{receiver_name}::ClassMethods"
          members = members_prototype_of(class_methods_name)

          writer = ::RBS::Writer.new(out: StringIO.new)
          members.each do |member|
            writer.write_member(member)
          end
          out = writer.out
          # NOTE: Should I remove the method that is accidentally added in prototype rb?
          store[class_methods_name].concat(out.string.each_line.to_a)
        end

        store
      end

      def members_prototype_of(mod_name)
        mod = Object.const_get(mod_name)
        runtime = ::RBS::Prototype::Runtime.new(patterns: nil, env: nil, merge: false)
        type_name = TypeName(mod_name)
        [].tap do |members|
          runtime.generate_methods(mod, type_name, members)
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
orthoses-rails-1.7.0 lib/orthoses/active_support/concern.rb
orthoses-rails-1.6.0 lib/orthoses/active_support/concern.rb
orthoses-rails-1.5.0 lib/orthoses/active_support/concern.rb
orthoses-rails-1.4.0 lib/orthoses/active_support/concern.rb