typeprof 0.31.0 → 0.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af1ca7b849fb94f4a39e31b3e1b2c45b557936f68099002d69a25d09e2c76b51
4
- data.tar.gz: cf3d5e1e88614b53a354f874ed0560e6b6bd965468e3be5f024594cf633e4b8d
3
+ metadata.gz: 937e0870f11951c34a3c7903f0c6e02b2ba0b557d327999a8ce807e195409088
4
+ data.tar.gz: ab8eca2e1cbb24729bbc0274bce7ed3ddd59917accd81285069ebc0086fe0208
5
5
  SHA512:
6
- metadata.gz: 84eec1b1d33b57ba5022bacab1f194a5942789282c3e19fcb32f2b4d3168f4ff826b5d176982a5ba36b7bbe3bba9f0fef5a0cb927811cba89b759ef337ab72f6
7
- data.tar.gz: b196e236660ab1814456fd9586e122e135e7773e27c3f49151e6c7a18a015b8ac0562a08c1b740a1d8bcfcd0005c27aefa2dabbaf98085230fcff73933f8028b
6
+ metadata.gz: 40b2629987ea3feed461c74c279cabb25ad462c0e0118d3d451c12387de4cdbab39b1dd1301ee86ceb6f6f5bbb25b4c5425a72749a11eabe2485a35ea463e5a3
7
+ data.tar.gz: c8704511e6507f9e50df4b626fb9b481e945954688df4d6c26ecd233b530eb4f1e2e038589c2538f209e9f6cec15c26401d854f48d8ea346325507f29246a475
@@ -139,6 +139,63 @@ module TypeProf::Core
139
139
  end
140
140
  end
141
141
 
142
+ class MultiTargetNode < Node
143
+ def initialize(raw_node, rhs, lenv)
144
+ super(raw_node, lenv)
145
+ @rhs = rhs
146
+ @lefts = raw_node.lefts.map do |raw_lhs|
147
+ AST.create_target_node(raw_lhs, lenv)
148
+ end
149
+ if raw_node.rest
150
+ case raw_node.rest.type
151
+ when :splat_node
152
+ if raw_node.rest.expression
153
+ @rest = AST.create_target_node(raw_node.rest.expression, lenv)
154
+ end
155
+ when :implicit_rest_node
156
+ # no assignment target
157
+ else
158
+ raise "unexpected rest node in multi_target: #{raw_node.rest.type}"
159
+ end
160
+ end
161
+ @rights = raw_node.rights.map do |raw_rhs|
162
+ AST.create_target_node(raw_rhs, lenv)
163
+ end
164
+ end
165
+
166
+ attr_reader :rhs, :lefts, :rest, :rights
167
+
168
+ def subnodes = { rhs:, lefts:, rest:, rights: }
169
+
170
+ def install0(genv)
171
+ # The rhs should be installed by the parent MultiWriteNode
172
+ # Here we set up the multi-assignment box for nested destructuring
173
+ value = @rhs.install(genv)
174
+
175
+ @lefts.each {|lhs| lhs.install(genv) }
176
+ @lefts.each {|lhs| lhs.rhs.ret || raise(lhs.rhs.inspect) }
177
+ lefts = @lefts.map {|lhs| lhs.rhs.ret }
178
+
179
+ rest_elem = nil
180
+ if @rest
181
+ rest_elem = Vertex.new(self)
182
+ @rest.install(genv)
183
+ @rest.rhs.ret || raise(@rest.rhs.inspect)
184
+ @changes.add_edge(genv, Source.new(Type::Instance.new(genv, genv.mod_ary, [rest_elem])), @rest.rhs.ret)
185
+ end
186
+
187
+ rights = nil
188
+ if @rights && !@rights.empty?
189
+ @rights.each {|rhs| rhs.install(genv) }
190
+ @rights.each {|rhs| rhs.rhs.ret || raise(rhs.rhs.inspect) }
191
+ rights = @rights.map {|rhs| rhs.rhs.ret }
192
+ end
193
+
194
+ box = @changes.add_masgn_box(genv, value, lefts, rest_elem, rights)
195
+ box.ret
196
+ end
197
+ end
198
+
142
199
  class MatchWriteNode < Node
143
200
  def initialize(raw_node, lenv)
144
201
  super(raw_node, lenv)
@@ -826,7 +826,7 @@ module TypeProf::Core
826
826
  end
827
827
 
828
828
  def typecheck(genv, changes, vtx, subst)
829
- changes.add_edge(genv, vtx, subst[@var]) unless vtx == subst[@var]
829
+ changes.add_edge(genv, vtx.new_vertex(genv, self), subst[@var]) unless vtx == subst[@var]
830
830
  true
831
831
  end
832
832
 
@@ -270,6 +270,8 @@ module TypeProf::Core
270
270
  IndexWriteNode.new(raw_node, dummy_node, lenv)
271
271
  when :call_target_node
272
272
  CallWriteNode.new(raw_node, dummy_node, lenv)
273
+ when :multi_target_node
274
+ MultiTargetNode.new(raw_node, dummy_node, lenv)
273
275
  else
274
276
  pp raw_node
275
277
  raise "not supported yet: #{ raw_node.type }"
@@ -116,6 +116,10 @@ module TypeProf::Core
116
116
  base_ty.mod.type_params.zip(base_ty.args) do |param, arg|
117
117
  ty_env[param] = arg || Source.new
118
118
  end
119
+ elsif base_ty.is_a?(Type::Singleton)
120
+ base_ty.mod.type_params&.each do |param|
121
+ ty_env[param] = Source.new
122
+ end
119
123
  end
120
124
  args = mod.type_params.zip(type_args).map do |param, arg|
121
125
  arg && changes ? arg.covariant_vertex(self, changes, ty_env) : Source.new
@@ -1073,7 +1073,7 @@ module TypeProf::Core
1073
1073
  else
1074
1074
  if @lefts.size >= 1
1075
1075
  edges << [Source.new(ty), @lefts[0]]
1076
- elsif @rights.size >= 1
1076
+ elsif @rights && @rights.size >= 1
1077
1077
  edges << [Source.new(ty), @rights[0]]
1078
1078
  else
1079
1079
  edges << [Source.new(ty), @rest_elem]
@@ -1099,7 +1099,7 @@ module TypeProf::Core
1099
1099
  def run0(genv, changes)
1100
1100
  instance_tys = []
1101
1101
  @singleton_ty_vtx.each_type do |ty|
1102
- instance_tys << ty.get_instance_type(genv)
1102
+ instance_tys << ty.get_instance_type(genv) if ty.is_a?(Type::Singleton)
1103
1103
  end
1104
1104
  source_vtx = Source.new(*instance_tys)
1105
1105
  changes.add_edge(genv, source_vtx, @ret)
@@ -112,6 +112,7 @@ module TypeProf::Core
112
112
  edges = []
113
113
  state = :left
114
114
  j = nil
115
+ rights_size = rights ? rights.size : 0
115
116
  @elems.each_with_index do |elem, i|
116
117
  case state
117
118
  when :left
@@ -123,7 +124,7 @@ module TypeProf::Core
123
124
  redo
124
125
  end
125
126
  when :rest
126
- if @elems.size - i > rights.size
127
+ if @elems.size - i > rights_size
127
128
  edges << [elem, rest_elem]
128
129
  else
129
130
  state = :right
@@ -1,3 +1,3 @@
1
1
  module TypeProf
2
- VERSION = "0.31.0"
2
+ VERSION = "0.31.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typeprof
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.31.0
4
+ version: 0.31.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yusuke Endoh