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 +4 -4
- data/lib/typeprof/core/ast/misc.rb +57 -0
- data/lib/typeprof/core/ast/sig_type.rb +1 -1
- data/lib/typeprof/core/ast.rb +2 -0
- data/lib/typeprof/core/env.rb +4 -0
- data/lib/typeprof/core/graph/box.rb +2 -2
- data/lib/typeprof/core/type.rb +2 -1
- data/lib/typeprof/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 937e0870f11951c34a3c7903f0c6e02b2ba0b557d327999a8ce807e195409088
|
|
4
|
+
data.tar.gz: ab8eca2e1cbb24729bbc0274bce7ed3ddd59917accd81285069ebc0086fe0208
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
data/lib/typeprof/core/ast.rb
CHANGED
|
@@ -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 }"
|
data/lib/typeprof/core/env.rb
CHANGED
|
@@ -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)
|
data/lib/typeprof/core/type.rb
CHANGED
|
@@ -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 >
|
|
127
|
+
if @elems.size - i > rights_size
|
|
127
128
|
edges << [elem, rest_elem]
|
|
128
129
|
else
|
|
129
130
|
state = :right
|
data/lib/typeprof/version.rb
CHANGED