Class: RBS::AST::TypeParam
- Inherits:
-
Object
- Object
- RBS::AST::TypeParam
- Defined in:
- lib/rbs/ast/type_param.rb
Instance Attribute Summary collapse
-
#location ⇒ Object
readonly
Returns the value of attribute location.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#upper_bound ⇒ Object
readonly
Returns the value of attribute upper_bound.
-
#variance ⇒ Object
readonly
Returns the value of attribute variance.
Class Method Summary collapse
- .rename(params, new_names:) ⇒ Object
- .resolve_variables(params) ⇒ Object
- .subst_var(vars, type) ⇒ Object
Instance Method Summary collapse
- #==(other) ⇒ Object (also: #eql?)
- #hash ⇒ Object
-
#initialize(name:, variance:, upper_bound:, location:) ⇒ TypeParam
constructor
A new instance of TypeParam.
- #map_type(&block) ⇒ Object
- #rename(name) ⇒ Object
- #to_json(state = JSON::State.new) ⇒ Object
- #to_s ⇒ Object
- #unchecked!(value = true) ⇒ Object
- #unchecked? ⇒ Boolean
Constructor Details
#initialize(name:, variance:, upper_bound:, location:) ⇒ TypeParam
Returns a new instance of TypeParam.
6 7 8 9 10 11 12 |
# File 'lib/rbs/ast/type_param.rb', line 6 def initialize(name:, variance:, upper_bound:, location:) @name = name @variance = variance @upper_bound = upper_bound @location = location @unchecked = false end |
Instance Attribute Details
#location ⇒ Object (readonly)
Returns the value of attribute location.
4 5 6 |
# File 'lib/rbs/ast/type_param.rb', line 4 def location @location end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
4 5 6 |
# File 'lib/rbs/ast/type_param.rb', line 4 def name @name end |
#upper_bound ⇒ Object (readonly)
Returns the value of attribute upper_bound.
4 5 6 |
# File 'lib/rbs/ast/type_param.rb', line 4 def upper_bound @upper_bound end |
#variance ⇒ Object (readonly)
Returns the value of attribute variance.
4 5 6 |
# File 'lib/rbs/ast/type_param.rb', line 4 def variance @variance end |
Class Method Details
.rename(params, new_names:) ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/rbs/ast/type_param.rb', line 91 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) ⇒ Object
69 70 71 72 73 74 75 76 77 |
# File 'lib/rbs/ast/type_param.rb', line 69 def self.resolve_variables(params) return if params.empty? vars = Set.new(params.map(&:name)) params.map! do |param| param.map_type {|bound| _ = subst_var(vars, bound) } end end |
.subst_var(vars, type) ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/rbs/ast/type_param.rb', line 79 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 Method Details
#==(other) ⇒ Object Also known as: eql?
23 24 25 26 27 28 29 |
# File 'lib/rbs/ast/type_param.rb', line 23 def ==(other) other.is_a?(TypeParam) && other.name == name && other.variance == variance && other.upper_bound == upper_bound && other.unchecked? == unchecked? end |
#hash ⇒ Object
33 34 35 |
# File 'lib/rbs/ast/type_param.rb', line 33 def hash self.class.hash ^ name.hash ^ variance.hash ^ upper_bound.hash ^ unchecked?.hash end |
#map_type(&block) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/rbs/ast/type_param.rb', line 56 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) ⇒ Object
47 48 49 50 51 52 53 54 |
# File 'lib/rbs/ast/type_param.rb', line 47 def rename(name) TypeParam.new( name: name, variance: variance, upper_bound: upper_bound, location: location ).unchecked!(unchecked?) end |
#to_json(state = JSON::State.new) ⇒ Object
37 38 39 40 41 42 43 44 45 |
# File 'lib/rbs/ast/type_param.rb', line 37 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 ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/rbs/ast/type_param.rb', line 108 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) ⇒ Object
14 15 16 17 |
# File 'lib/rbs/ast/type_param.rb', line 14 def unchecked!(value = true) @unchecked = value ? true : false self end |
#unchecked? ⇒ Boolean
19 20 21 |
# File 'lib/rbs/ast/type_param.rb', line 19 def unchecked? @unchecked end |