Sha256: 2479f1c11ebf9004e8b5fa9c3a1cf8f2ca03c29eaea056d3778f755d82502b0e
Contents?: true
Size: 1.87 KB
Versions: 1
Compression:
Stored size: 1.87 KB
Contents
# frozen_string_literal: true module RaaP class TypeSubstitution def initialize(type_params, type_args) @type_params = type_params @type_args = type_args end def build bound_map = @type_params.zip(@type_args).to_h do |(bound, arg)| if arg [bound.name, arg] elsif bound.upper_bound [bound.name, bound.upper_bound] else [bound.name, ::RBS::Types::Variable.new(name: bound.name, location: nil)] end end ::RBS::Substitution.build(bound_map.keys, bound_map.values) end def method_type_sub(method_type, self_type: nil, instance_type: nil, class_type: nil) self_type = self_type.is_a?(::String) ? RBS.parse_type(self_type) : self_type instance_type = instance_type.is_a?(::String) ? RBS.parse_type(instance_type) : instance_type class_type = class_type.is_a?(::String) ? RBS.parse_type(class_type) : class_type sub = build ::RBS::MethodType.new( type_params: [], type: method_type.type.sub(sub).then { |ty| sub(ty, self_type: self_type, instance_type: instance_type, class_type: class_type) }, block: method_type.block&.sub(sub)&.then { |bl| sub(bl, self_type: self_type, instance_type: instance_type, class_type: class_type) }, location: method_type.location ) end private def sub(search, self_type:, instance_type:, class_type:) if self_type.nil? && instance_type.nil? && class_type.nil? return search end search.map_type do |ty| case ty when ::RBS::Types::Bases::Self self_type || ty when ::RBS::Types::Bases::Instance instance_type || ty when ::RBS::Types::Bases::Class class_type || ty else sub(ty, self_type: self_type, instance_type: instance_type, class_type: class_type) end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
raap-0.6.0 | lib/raap/type_substitution.rb |