Sha256: 76771486e95d04a952bfba28635e322674a7a7db491fd8ce69ddb7b438000444

Contents?: true

Size: 1.96 KB

Versions: 18

Compression:

Stored size: 1.96 KB

Contents

# typed: strict
# frozen_string_literal: true

return unless defined?(ActiveSupport)

module Tapioca
  module Dsl
    module Compilers
      # `Tapioca::Dsl::Compilers::MixedInClassAttributes` generates RBI files for modules that dynamically use
      # `class_attribute` on classes.
      #
      # For example, given the following concern
      #
      # ~~~rb
      # module Taggeable
      #   extend ActiveSupport::Concern
      #
      #   included do
      #     class_attribute :tag
      #   end
      # end
      # ~~~
      #
      # this compiler will produce the RBI file `taggeable.rbi` with the following content:
      #
      # ~~~rbi
      # # typed: strong
      #
      # module Taggeable
      #   include GeneratedInstanceMethods
      #
      #   mixes_in_class_methods GeneratedClassMethods
      #
      #   module GeneratedClassMethods
      #     def tag; end
      #     def tag=(value); end
      #     def tag?; end
      #   end
      #
      #   module GeneratedInstanceMethods
      #     def tag; end
      #     def tag=(value); end
      #     def tag?; end
      #   end
      # end
      # ~~~
      class MixedInClassAttributes < Compiler
        extend T::Sig

        ConstantType = type_member { { fixed: Module } }

        sig { override.void }
        def decorate
          mixin_compiler = Runtime::DynamicMixinCompiler.new(constant)
          return if mixin_compiler.empty_attributes?

          root.create_path(constant) do |mod|
            mixin_compiler.compile_class_attributes(mod)
          end
        end

        class << self
          extend T::Sig

          sig { override.returns(T::Enumerable[Module]) }
          def gather_constants
            # Select all non-anonymous modules that have overridden Module.included
            all_modules.select do |mod|
              !mod.is_a?(Class) && name_of(mod) && Runtime::Reflection.method_of(mod, :included).owner != Module
            end
          end
        end
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
tapioca-0.16.8 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.16.7 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.16.6 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.16.5 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.16.4 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.16.3 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.16.2 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.16.1 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.16.0 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.15.1 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.15.0 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.14.4 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.14.3 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.13.3 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.13.2 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.13.1 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.13.0 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb
tapioca-0.12.0 lib/tapioca/dsl/compilers/mixed_in_class_attributes.rb