Class: RBS::AST::TypeParam
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/rbs/ast/type_param.rb |
Class Method Summary
Instance Attribute Summary
- #location readonly
- #name readonly
- #unchecked? ⇒ Boolean readonly
- #upper_bound readonly
- #variance readonly
Instance Method Summary
- #==(other) (also: #eql?)
-
#eql?(other)
Alias for #==.
- #hash
- #map_type(&block)
- #rename(name)
- #to_json(state = JSON::State.new)
- #to_s
- #unchecked!(value = true)
Constructor Details
.new(name:, variance:, upper_bound:, location:) ⇒ TypeParam
# File 'lib/rbs/ast/type_param.rb', line 8
def initialize(name:, variance:, upper_bound:, location:) @name = name @variance = variance @upper_bound = upper_bound @location = location @unchecked = false end
Class Method Details
.rename(params, new_names:)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 93
def self.rename(params, new_names:) raise unless params.size == new_names.size subst = Substitution.build(new_names, Types::Variable.build(new_names)) params.map.with_index do |param, index| new_name = new_names[index] TypeParam.new( name: new_name, variance: param.variance, upper_bound: param.upper_bound&.map_type {|type| type.sub(subst) }, location: param.location ).unchecked!(param.unchecked?) end end
.resolve_variables(params)
[ GitHub ].subst_var(vars, type)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 81
def self.subst_var(vars, type) case type when Types::ClassInstance namespace = type.name.namespace if namespace.relative? && namespace.empty? && vars.member?(type.name.name) return Types::Variable.new(name: type.name.name, location: type.location) end end type.map_type {|t| subst_var(vars, t) } end
Instance Attribute Details
#location (readonly)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 6
attr_reader :name, :variance, :location, :upper_bound
#name (readonly)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 6
attr_reader :name, :variance, :location, :upper_bound
#unchecked? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'lib/rbs/ast/type_param.rb', line 21
def unchecked? @unchecked end
#upper_bound (readonly)
[ GitHub ]#variance (readonly)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 6
attr_reader :name, :variance, :location, :upper_bound
Instance Method Details
#==(other) Also known as: #eql?
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 25
def ==(other) other.is_a?(TypeParam) && other.name == name && other.variance == variance && other.upper_bound == upper_bound && other.unchecked? == unchecked? end
#eql?(other)
Alias for #==.
# File 'lib/rbs/ast/type_param.rb', line 33
alias eql? ==
#hash
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 35
def hash self.class.hash ^ name.hash ^ variance.hash ^ upper_bound.hash ^ unchecked?.hash end
#map_type(&block)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 58
def map_type(&block) if b = upper_bound _upper_bound = yield(b) end TypeParam.new( name: name, variance: variance, upper_bound: _upper_bound, location: location ).unchecked!(unchecked?) end
#rename(name)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 49
def rename(name) TypeParam.new( name: name, variance: variance, upper_bound: upper_bound, location: location ).unchecked!(unchecked?) end
#to_json(state = JSON::State.new)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 39
def to_json(state = JSON::State.new) { name: name, variance: variance, unchecked: unchecked?, location: location, upper_bound: upper_bound }.to_json(state) end
#to_s
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 110
def to_s s = +"" if unchecked? s << "unchecked " end case variance when :invariant # nop when :covariant s << "out " when :contravariant s << "in " end s << name.to_s if type = upper_bound s << " < #{type}" end s end
#unchecked!(value = true)
[ GitHub ]# File 'lib/rbs/ast/type_param.rb', line 16
def unchecked!(value = true) @unchecked = value ? true : false self end