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 |