Sha256: cc82d2d8e021a1e4faf3b9374e1fe96b1862105fa56307de66d04fe0bee73eed

Contents?: true

Size: 1.33 KB

Versions: 4

Compression:

Stored size: 1.33 KB

Contents

# frozen_string_literal: true

module RaaP
  module Value
    module Intersection
      # Build an object to realize an intersection.
      def self.new(type, size: 3)
        type = type.is_a?(::String) ? RBS.parse_type(type) : type
        unless type.instance_of?(::RBS::Types::Intersection)
          ::Kernel.raise ::TypeError, "not an intersection type: #{type}"
        end
        instances = type.types.filter_map do |t|
          t.instance_of?(::RBS::Types::ClassInstance) && Object.const_get(t.name.absolute!.to_s)
        end
        instances.uniq!
        unless instances.count { |c| c.is_a?(::Class) } <= 1
          raise ArgumentError, "intersection type must have at least one class instance type in `#{instances}`"
        end

        base = instances.find { |c| c.is_a?(::Class) } || Object

        c = Class.new(base) do
          instances.select { |i| !i.is_a?(::Class) }.each do |m|
            include(m)
          end

          type.types.each do |t|
            case t
            when ::RBS::Types::Interface
              Interface.define_method_from_interface(self, t, size: size)
            end
          end
        end
        type = ::RBS::Types::ClassInstance.new(name: TypeName(base.name), args: [], location: nil)
        SymbolicCaller.new(Type.call_new_from(c, type, size: size)).eval
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
raap-1.0.0 lib/raap/value/intersection.rb
raap-0.10.0 lib/raap/value/intersection.rb
raap-0.9.0 lib/raap/value/intersection.rb
raap-0.8.0 lib/raap/value/intersection.rb