typeprof 0.21.11 → 0.30.0
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/README.md +15 -31
- data/bin/typeprof +5 -0
- data/doc/doc.ja.md +134 -0
- data/doc/doc.md +136 -0
- data/lib/typeprof/cli/cli.rb +180 -0
- data/lib/typeprof/cli.rb +2 -133
- data/lib/typeprof/code_range.rb +112 -0
- data/lib/typeprof/core/ast/base.rb +263 -0
- data/lib/typeprof/core/ast/call.rb +251 -0
- data/lib/typeprof/core/ast/const.rb +126 -0
- data/lib/typeprof/core/ast/control.rb +432 -0
- data/lib/typeprof/core/ast/meta.rb +150 -0
- data/lib/typeprof/core/ast/method.rb +335 -0
- data/lib/typeprof/core/ast/misc.rb +263 -0
- data/lib/typeprof/core/ast/module.rb +123 -0
- data/lib/typeprof/core/ast/pattern.rb +140 -0
- data/lib/typeprof/core/ast/sig_decl.rb +471 -0
- data/lib/typeprof/core/ast/sig_type.rb +663 -0
- data/lib/typeprof/core/ast/value.rb +319 -0
- data/lib/typeprof/core/ast/variable.rb +315 -0
- data/lib/typeprof/core/ast.rb +472 -0
- data/lib/typeprof/core/builtin.rb +146 -0
- data/lib/typeprof/core/env/method.rb +137 -0
- data/lib/typeprof/core/env/method_entity.rb +55 -0
- data/lib/typeprof/core/env/module_entity.rb +408 -0
- data/lib/typeprof/core/env/static_read.rb +155 -0
- data/lib/typeprof/core/env/type_alias_entity.rb +27 -0
- data/lib/typeprof/core/env/value_entity.rb +32 -0
- data/lib/typeprof/core/env.rb +360 -0
- data/lib/typeprof/core/graph/box.rb +991 -0
- data/lib/typeprof/core/graph/change_set.rb +224 -0
- data/lib/typeprof/core/graph/filter.rb +155 -0
- data/lib/typeprof/core/graph/vertex.rb +222 -0
- data/lib/typeprof/core/graph.rb +3 -0
- data/lib/typeprof/core/service.rb +522 -0
- data/lib/typeprof/core/type.rb +348 -0
- data/lib/typeprof/core/util.rb +81 -0
- data/lib/typeprof/core.rb +32 -0
- data/lib/typeprof/diagnostic.rb +35 -0
- data/lib/typeprof/lsp/messages.rb +430 -0
- data/lib/typeprof/lsp/server.rb +177 -0
- data/lib/typeprof/lsp/text.rb +69 -0
- data/lib/typeprof/lsp/util.rb +61 -0
- data/lib/typeprof/lsp.rb +4 -907
- data/lib/typeprof/version.rb +1 -1
- data/lib/typeprof.rb +4 -18
- data/typeprof.gemspec +5 -7
- metadata +48 -35
- data/.github/dependabot.yml +0 -6
- data/.github/workflows/main.yml +0 -39
- data/.gitignore +0 -9
- data/Gemfile +0 -17
- data/Gemfile.lock +0 -41
- data/Rakefile +0 -10
- data/exe/typeprof +0 -10
- data/lib/typeprof/analyzer.rb +0 -2598
- data/lib/typeprof/arguments.rb +0 -414
- data/lib/typeprof/block.rb +0 -176
- data/lib/typeprof/builtin.rb +0 -893
- data/lib/typeprof/code-range.rb +0 -177
- data/lib/typeprof/config.rb +0 -158
- data/lib/typeprof/container-type.rb +0 -912
- data/lib/typeprof/export.rb +0 -589
- data/lib/typeprof/import.rb +0 -852
- data/lib/typeprof/insns-def.rb +0 -65
- data/lib/typeprof/iseq.rb +0 -864
- data/lib/typeprof/method.rb +0 -355
- data/lib/typeprof/type.rb +0 -1140
- data/lib/typeprof/utils.rb +0 -212
- data/tools/coverage.rb +0 -14
- data/tools/setup-insns-def.rb +0 -30
- data/typeprof-lsp +0 -3
@@ -0,0 +1,663 @@
|
|
1
|
+
module TypeProf::Core
|
2
|
+
class AST
|
3
|
+
class SigFuncType < Node
|
4
|
+
def initialize(raw_decl, raw_type_params, raw_block, lenv)
|
5
|
+
super(raw_decl, lenv)
|
6
|
+
if raw_block
|
7
|
+
@block_required = raw_block.required
|
8
|
+
@block = AST.create_rbs_func_type(raw_block, nil, nil, lenv)
|
9
|
+
else
|
10
|
+
@block_required = false
|
11
|
+
@block = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
# TODO?: param.variance, param.unchecked, param.upper_bound
|
15
|
+
@type_params = raw_type_params ? raw_type_params.map {|param| param.name } : nil
|
16
|
+
|
17
|
+
if raw_decl.type.is_a?(RBS::Types::Function)
|
18
|
+
@req_positionals = raw_decl.type.required_positionals.map do |ty|
|
19
|
+
raise "unsupported argument type: #{ ty.class }" if !ty.is_a?(RBS::Types::Function::Param)
|
20
|
+
AST.create_rbs_type(ty.type, lenv)
|
21
|
+
end
|
22
|
+
@post_positionals = raw_decl.type.trailing_positionals.map do |ty|
|
23
|
+
raise "unsupported argument type: #{ ty.class }" if !ty.is_a?(RBS::Types::Function::Param)
|
24
|
+
AST.create_rbs_type(ty.type, lenv)
|
25
|
+
end
|
26
|
+
@opt_positionals = raw_decl.type.optional_positionals.map do |ty|
|
27
|
+
raise "unsupported argument type: #{ ty.class }" if !ty.is_a?(RBS::Types::Function::Param)
|
28
|
+
AST.create_rbs_type(ty.type, lenv)
|
29
|
+
end
|
30
|
+
param = raw_decl.type.rest_positionals
|
31
|
+
@rest_positionals = param ? AST.create_rbs_type(param.type, lenv) : nil
|
32
|
+
|
33
|
+
@req_keywords = raw_decl.type.required_keywords.to_h do |key, ty|
|
34
|
+
raise "unsupported argument type: #{ ty.class }" if !ty.is_a?(RBS::Types::Function::Param)
|
35
|
+
[key, AST.create_rbs_type(ty.type, lenv)]
|
36
|
+
end
|
37
|
+
@opt_keywords = raw_decl.type.optional_keywords.to_h do |key, ty|
|
38
|
+
raise "unsupported argument type: #{ ty.class }" if !ty.is_a?(RBS::Types::Function::Param)
|
39
|
+
[key, AST.create_rbs_type(ty.type, lenv)]
|
40
|
+
end
|
41
|
+
param = raw_decl.type.rest_keywords
|
42
|
+
@rest_keywords = param ? AST.create_rbs_type(param.type, lenv) : nil
|
43
|
+
else
|
44
|
+
# RBS::Types::UntypedFunction
|
45
|
+
@req_positionals = []
|
46
|
+
@post_positionals = []
|
47
|
+
@opt_positionals = []
|
48
|
+
@rest_positionals = SigTyBaseAnyNode.new(raw_decl, lenv)
|
49
|
+
@req_keywords = {}
|
50
|
+
@opt_keywords = {}
|
51
|
+
@rest_keywords = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
@return_type = AST.create_rbs_type(raw_decl.type.return_type, lenv)
|
55
|
+
end
|
56
|
+
|
57
|
+
attr_reader :type_params, :block, :block_required
|
58
|
+
attr_reader :req_positionals
|
59
|
+
attr_reader :post_positionals
|
60
|
+
attr_reader :opt_positionals
|
61
|
+
attr_reader :rest_positionals
|
62
|
+
attr_reader :req_keywords
|
63
|
+
attr_reader :opt_keywords
|
64
|
+
attr_reader :rest_keywords
|
65
|
+
attr_reader :return_type
|
66
|
+
|
67
|
+
def subnodes = {
|
68
|
+
block:,
|
69
|
+
req_positionals:,
|
70
|
+
post_positionals:,
|
71
|
+
opt_positionals:,
|
72
|
+
rest_positionals:,
|
73
|
+
req_keywords:,
|
74
|
+
opt_keywords:,
|
75
|
+
rest_keywords:,
|
76
|
+
return_type:,
|
77
|
+
}
|
78
|
+
def attrs = { type_params:, block_required: }
|
79
|
+
end
|
80
|
+
|
81
|
+
class SigTyNode < Node
|
82
|
+
def covariant_vertex(genv, changes, subst)
|
83
|
+
vtx = changes.new_covariant_vertex(genv, self)
|
84
|
+
covariant_vertex0(genv, changes, vtx, subst)
|
85
|
+
vtx
|
86
|
+
end
|
87
|
+
|
88
|
+
def contravariant_vertex(genv, changes, subst)
|
89
|
+
vtx = changes.new_contravariant_vertex(genv, self)
|
90
|
+
contravariant_vertex0(genv, changes, vtx, subst)
|
91
|
+
vtx
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class SigTyBaseBoolNode < SigTyNode
|
96
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
97
|
+
changes.add_edge(genv, Source.new(genv.true_type, genv.false_type), vtx)
|
98
|
+
end
|
99
|
+
|
100
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
101
|
+
changes.add_edge(genv, Source.new(genv.true_type, genv.false_type), vtx)
|
102
|
+
end
|
103
|
+
|
104
|
+
def show
|
105
|
+
"bool"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class SigTyBaseNilNode < SigTyNode
|
110
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
111
|
+
changes.add_edge(genv, Source.new(genv.nil_type), vtx)
|
112
|
+
end
|
113
|
+
|
114
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
115
|
+
changes.add_edge(genv, Source.new(genv.nil_type), vtx)
|
116
|
+
end
|
117
|
+
|
118
|
+
def show
|
119
|
+
"nil"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
class SigTyBaseSelfNode < SigTyNode
|
124
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
125
|
+
changes.add_edge(genv, subst[:"*self"], vtx)
|
126
|
+
end
|
127
|
+
|
128
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
129
|
+
changes.add_edge(genv, subst[:"*self"], vtx)
|
130
|
+
end
|
131
|
+
|
132
|
+
def show
|
133
|
+
"self"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class SigTyBaseVoidNode < SigTyNode
|
138
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
139
|
+
changes.add_edge(genv, Source.new(genv.obj_type), vtx)
|
140
|
+
end
|
141
|
+
|
142
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
143
|
+
changes.add_edge(genv, Source.new(genv.obj_type), vtx)
|
144
|
+
end
|
145
|
+
|
146
|
+
def show
|
147
|
+
"void"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class SigTyBaseAnyNode < SigTyNode
|
152
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
153
|
+
end
|
154
|
+
|
155
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
156
|
+
#Source.new(genv.obj_type).add_edge(genv, vtx) # TODO
|
157
|
+
end
|
158
|
+
|
159
|
+
def show
|
160
|
+
"untyped"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
class SigTyBaseTopNode < SigTyNode
|
165
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
166
|
+
# TODO
|
167
|
+
end
|
168
|
+
|
169
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
170
|
+
# TODO
|
171
|
+
end
|
172
|
+
|
173
|
+
def show
|
174
|
+
"top"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
class SigTyBaseBottomNode < SigTyNode
|
179
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
180
|
+
changes.add_edge(genv, Source.new(Type::Bot.new(genv)), vtx)
|
181
|
+
end
|
182
|
+
|
183
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
184
|
+
changes.add_edge(genv, Source.new(Type::Bot.new(genv)), vtx)
|
185
|
+
end
|
186
|
+
|
187
|
+
def show
|
188
|
+
"bot"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
class SigTyBaseInstanceNode < SigTyNode
|
193
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
194
|
+
changes.add_edge(genv, subst[:"*instance"], vtx)
|
195
|
+
end
|
196
|
+
|
197
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
198
|
+
changes.add_edge(genv, subst[:"*instance"], vtx)
|
199
|
+
end
|
200
|
+
|
201
|
+
def show
|
202
|
+
"instance"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class SigTyBaseClassNode < SigTyNode
|
207
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
208
|
+
changes.add_edge(genv, subst[:"*class"], vtx)
|
209
|
+
end
|
210
|
+
|
211
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
212
|
+
changes.add_edge(genv, subst[:"*class"], vtx)
|
213
|
+
end
|
214
|
+
|
215
|
+
def show
|
216
|
+
"class"
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
class SigTyAliasNode < SigTyNode
|
221
|
+
def initialize(raw_decl, lenv)
|
222
|
+
super(raw_decl, lenv)
|
223
|
+
name = raw_decl.name
|
224
|
+
@cpath = name.namespace.path
|
225
|
+
@toplevel = name.namespace.absolute?
|
226
|
+
@name = name.name
|
227
|
+
@args = raw_decl.args.map {|arg| AST.create_rbs_type(arg, lenv) }
|
228
|
+
end
|
229
|
+
|
230
|
+
attr_reader :cpath, :toplevel, :name, :args
|
231
|
+
def subnodes = { args: }
|
232
|
+
def attrs = { cpath:, toplevel:, name: }
|
233
|
+
|
234
|
+
def define0(genv)
|
235
|
+
@args.each {|arg| arg.define(genv) }
|
236
|
+
|
237
|
+
static_reads = []
|
238
|
+
if @cpath.empty?
|
239
|
+
static_reads << BaseTypeAliasRead.new(genv, @name, @toplevel ? CRef::Toplevel : @lenv.cref)
|
240
|
+
else
|
241
|
+
static_reads << BaseConstRead.new(genv, @cpath.first, @toplevel ? CRef::Toplevel : @lenv.cref)
|
242
|
+
@cpath[1..].each do |cname|
|
243
|
+
static_reads << ScopedConstRead.new(cname, static_reads.last)
|
244
|
+
end
|
245
|
+
static_reads << ScopedTypeAliasRead.new(@name, static_reads.last)
|
246
|
+
end
|
247
|
+
static_reads
|
248
|
+
end
|
249
|
+
|
250
|
+
def undefine0(genv)
|
251
|
+
@static_ret.each do |static_read|
|
252
|
+
static_read.destroy(genv)
|
253
|
+
end
|
254
|
+
@args.each {|arg| arg.undefine(genv) }
|
255
|
+
end
|
256
|
+
|
257
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
258
|
+
changes.add_depended_static_read(@static_ret.last)
|
259
|
+
tae = @static_ret.last.type_alias_entity
|
260
|
+
if tae && tae.exist?
|
261
|
+
# need to check tae decls are all consistent?
|
262
|
+
decl = tae.decls.each {|decl| break decl }
|
263
|
+
subst0 = subst.dup
|
264
|
+
# raise if decl.params.size != @args.size # ?
|
265
|
+
decl.params.zip(@args) do |param, arg|
|
266
|
+
subst0[param] = arg.covariant_vertex(genv, changes, subst0) # passing subst0 is ok?
|
267
|
+
end
|
268
|
+
tae.type.covariant_vertex0(genv, changes, vtx, subst0)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
273
|
+
changes.add_depended_static_read(@static_ret.last)
|
274
|
+
tae = @static_ret.last.type_alias_entity
|
275
|
+
if tae && tae.exist?
|
276
|
+
# need to check tae decls are all consistent?
|
277
|
+
decl = tae.decls.each {|decl| break decl }
|
278
|
+
subst0 = subst.dup
|
279
|
+
# raise if decl.params.size != @args.size # ?
|
280
|
+
decl.params.zip(@args) do |param, arg|
|
281
|
+
subst0[param] = arg.contravariant_vertex(genv, changes, subst0)
|
282
|
+
end
|
283
|
+
tae.type.contravariant_vertex0(genv, changes, vtx, subst0)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
def show
|
288
|
+
"(...alias...)"
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
class SigTyUnionNode < SigTyNode
|
293
|
+
def initialize(raw_decl, lenv)
|
294
|
+
super(raw_decl, lenv)
|
295
|
+
@types = (raw_decl.types || []).map {|type| AST.create_rbs_type(type, lenv) }
|
296
|
+
end
|
297
|
+
|
298
|
+
attr_reader :types
|
299
|
+
|
300
|
+
def subnodes = { types: }
|
301
|
+
|
302
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
303
|
+
@types.each do |type|
|
304
|
+
type.covariant_vertex0(genv, changes, vtx, subst)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
309
|
+
@types.each do |type|
|
310
|
+
type.contravariant_vertex0(genv, changes, vtx, subst)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
def show
|
315
|
+
@types.map {|ty| ty.show }.join(" | ")
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
class SigTyIntersectionNode < SigTyNode
|
320
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
321
|
+
#raise NotImplementedError
|
322
|
+
end
|
323
|
+
|
324
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
325
|
+
#raise NotImplementedError
|
326
|
+
end
|
327
|
+
|
328
|
+
def show
|
329
|
+
"(...intersection...)"
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
class SigTySingletonNode < SigTyNode
|
334
|
+
def initialize(raw_decl, lenv)
|
335
|
+
super(raw_decl, lenv)
|
336
|
+
name = raw_decl.name
|
337
|
+
@cpath = name.namespace.path + [name.name]
|
338
|
+
@toplevel = name.namespace.absolute?
|
339
|
+
end
|
340
|
+
|
341
|
+
attr_reader :cpath, :toplevel
|
342
|
+
def attrs = { cpath:, toplevel: }
|
343
|
+
|
344
|
+
def define0(genv)
|
345
|
+
const_reads = []
|
346
|
+
const_read = BaseConstRead.new(genv, @cpath.first, @toplevel ? CRef::Toplevel : @lenv.cref)
|
347
|
+
const_reads << const_read
|
348
|
+
unless @cpath.empty?
|
349
|
+
@cpath[1..].each do |cname|
|
350
|
+
const_read = ScopedConstRead.new(cname, const_read)
|
351
|
+
const_reads << const_read
|
352
|
+
end
|
353
|
+
end
|
354
|
+
const_reads
|
355
|
+
end
|
356
|
+
|
357
|
+
def undefine0(genv)
|
358
|
+
@static_ret.each do |const_read|
|
359
|
+
const_read.destroy(genv)
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
364
|
+
# TODO: type.args
|
365
|
+
changes.add_depended_static_read(@static_ret.last)
|
366
|
+
cpath = @static_ret.last.cpath
|
367
|
+
return unless cpath
|
368
|
+
mod = genv.resolve_cpath(cpath)
|
369
|
+
changes.add_edge(genv, Source.new(Type::Singleton.new(genv, mod)), vtx)
|
370
|
+
end
|
371
|
+
|
372
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
373
|
+
# TODO: type.args
|
374
|
+
changes.add_depended_static_read(@static_ret.last)
|
375
|
+
cpath = @static_ret.last.cpath
|
376
|
+
return unless cpath
|
377
|
+
mod = genv.resolve_cpath(cpath)
|
378
|
+
changes.add_edge(genv, Source.new(Type::Singleton.new(genv, mod)), vtx)
|
379
|
+
end
|
380
|
+
|
381
|
+
def show
|
382
|
+
s = "::#{ @cpath.join("::") }"
|
383
|
+
if !@args.empty?
|
384
|
+
s << "[...]"
|
385
|
+
end
|
386
|
+
"singleton(#{ s })"
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
class SigTyInstanceNode < SigTyNode
|
391
|
+
def initialize(raw_decl, lenv)
|
392
|
+
super(raw_decl, lenv)
|
393
|
+
name = raw_decl.name
|
394
|
+
@cpath = name.namespace.path + [name.name]
|
395
|
+
@toplevel = name.namespace.absolute? # "::Foo" or "Foo"
|
396
|
+
@args = raw_decl.args.map {|arg| AST.create_rbs_type(arg, lenv) }
|
397
|
+
end
|
398
|
+
|
399
|
+
attr_reader :cpath, :toplevel, :args
|
400
|
+
def subnodes = { args: }
|
401
|
+
def attrs = { cpath:, toplevel: }
|
402
|
+
|
403
|
+
def define0(genv)
|
404
|
+
@args.each {|arg| arg.define(genv) }
|
405
|
+
const_reads = []
|
406
|
+
const_read = BaseConstRead.new(genv, @cpath.first, @toplevel ? CRef::Toplevel : @lenv.cref)
|
407
|
+
const_reads << const_read
|
408
|
+
unless @cpath.empty?
|
409
|
+
@cpath[1..].each do |cname|
|
410
|
+
const_read = ScopedConstRead.new(cname, const_read)
|
411
|
+
const_reads << const_read
|
412
|
+
end
|
413
|
+
end
|
414
|
+
const_reads
|
415
|
+
end
|
416
|
+
|
417
|
+
def undefine0(genv)
|
418
|
+
@static_ret.each do |const_read|
|
419
|
+
const_read.destroy(genv)
|
420
|
+
end
|
421
|
+
@args.each {|arg| arg.undefine(genv) }
|
422
|
+
end
|
423
|
+
|
424
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
425
|
+
changes.add_depended_static_read(@static_ret.last)
|
426
|
+
cpath = @static_ret.last.cpath
|
427
|
+
return unless cpath
|
428
|
+
mod = genv.resolve_cpath(cpath)
|
429
|
+
args = @args.map {|arg| arg.covariant_vertex(genv, changes, subst) }
|
430
|
+
changes.add_edge(genv, Source.new(Type::Instance.new(genv, mod, args)), vtx)
|
431
|
+
end
|
432
|
+
|
433
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
434
|
+
changes.add_depended_static_read(@static_ret.last)
|
435
|
+
cpath = @static_ret.last.cpath
|
436
|
+
return unless cpath
|
437
|
+
mod = genv.resolve_cpath(cpath)
|
438
|
+
args = @args.map {|arg| arg.contravariant_vertex(genv, changes, subst) }
|
439
|
+
changes.add_edge(genv, Source.new(Type::Instance.new(genv, mod, args)), vtx)
|
440
|
+
end
|
441
|
+
|
442
|
+
def show
|
443
|
+
s = "::#{ @cpath.join("::") }"
|
444
|
+
if !@args.empty?
|
445
|
+
s << "[...]"
|
446
|
+
end
|
447
|
+
s
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
class SigTyTupleNode < SigTyNode
|
452
|
+
def initialize(raw_decl, lenv)
|
453
|
+
super(raw_decl, lenv)
|
454
|
+
@types = raw_decl.types.map {|type| AST.create_rbs_type(type, lenv) }
|
455
|
+
end
|
456
|
+
|
457
|
+
attr_reader :types
|
458
|
+
def subnodes = { types: }
|
459
|
+
|
460
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
461
|
+
unified_elem = changes.new_covariant_vertex(genv, [self, :Elem]) # TODO
|
462
|
+
elems = @types.map do |type|
|
463
|
+
nvtx = type.covariant_vertex(genv, changes, subst)
|
464
|
+
changes.add_edge(genv, nvtx, unified_elem)
|
465
|
+
nvtx
|
466
|
+
end
|
467
|
+
changes.add_edge(genv, Source.new(Type::Array.new(genv, elems, genv.gen_ary_type(unified_elem))), vtx)
|
468
|
+
end
|
469
|
+
|
470
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
471
|
+
unified_elem = changes.new_contravariant_vertex(genv, [self, :Elem]) # TODO
|
472
|
+
elems = @types.map do |type|
|
473
|
+
nvtx = type.contravariant_vertex(genv, changes, subst)
|
474
|
+
changes.add_edge(genv, nvtx, unified_elem)
|
475
|
+
nvtx
|
476
|
+
end
|
477
|
+
changes.add_edge(genv, Source.new(Type::Array.new(genv, elems, genv.gen_ary_type(unified_elem))), vtx)
|
478
|
+
end
|
479
|
+
|
480
|
+
def show
|
481
|
+
"[#{ @types.map {|ty| ty.show }.join(", ") }]"
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
485
|
+
class SigTyRecordNode < SigTyNode
|
486
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
487
|
+
raise NotImplementedError
|
488
|
+
end
|
489
|
+
|
490
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
491
|
+
raise NotImplementedError
|
492
|
+
end
|
493
|
+
|
494
|
+
def show
|
495
|
+
"(...record...)"
|
496
|
+
end
|
497
|
+
end
|
498
|
+
|
499
|
+
class SigTyVarNode < SigTyNode
|
500
|
+
def initialize(raw_decl, lenv)
|
501
|
+
super(raw_decl, lenv)
|
502
|
+
@var = raw_decl.name
|
503
|
+
end
|
504
|
+
|
505
|
+
attr_reader :var
|
506
|
+
|
507
|
+
def attrs = { var: }
|
508
|
+
|
509
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
510
|
+
raise "unknown type variable: #{ @var }" unless subst[@var]
|
511
|
+
changes.add_edge(genv, subst[@var], vtx)
|
512
|
+
end
|
513
|
+
|
514
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
515
|
+
raise "unknown type variable: #{ @var }" unless subst[@var]
|
516
|
+
changes.add_edge(genv, Source.new(Type::Var.new(genv, @var, subst[@var])), vtx)
|
517
|
+
end
|
518
|
+
|
519
|
+
def show
|
520
|
+
"#{ @var }"
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
524
|
+
class SigTyOptionalNode < SigTyNode
|
525
|
+
def initialize(raw_decl, lenv)
|
526
|
+
super(raw_decl, lenv)
|
527
|
+
@type = AST.create_rbs_type(raw_decl.type, lenv)
|
528
|
+
end
|
529
|
+
|
530
|
+
attr_reader :type
|
531
|
+
def subnodes = { type: }
|
532
|
+
|
533
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
534
|
+
@type.covariant_vertex0(genv, changes, vtx, subst)
|
535
|
+
changes.add_edge(genv, Source.new(genv.nil_type), vtx)
|
536
|
+
end
|
537
|
+
|
538
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
539
|
+
@type.contravariant_vertex0(genv, changes, vtx, subst)
|
540
|
+
changes.add_edge(genv, Source.new(genv.nil_type), vtx)
|
541
|
+
end
|
542
|
+
|
543
|
+
def show
|
544
|
+
s = @type.show
|
545
|
+
if @type.is_a?(SigTyIntersectionNode) || @type.is_a?(SigTyUnionNode)
|
546
|
+
s = "(#{ s })"
|
547
|
+
end
|
548
|
+
s + "?"
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
class SigTyLiteralNode < SigTyNode
|
553
|
+
def initialize(raw_decl, lenv)
|
554
|
+
super(raw_decl, lenv)
|
555
|
+
@lit = raw_decl.literal
|
556
|
+
end
|
557
|
+
|
558
|
+
attr_reader :lit
|
559
|
+
def attrs = { lit: }
|
560
|
+
|
561
|
+
def get_type(genv)
|
562
|
+
case @lit
|
563
|
+
when ::Symbol
|
564
|
+
Type::Symbol.new(genv, @lit)
|
565
|
+
when ::Integer then genv.int_type
|
566
|
+
when ::String then genv.str_type
|
567
|
+
when ::TrueClass then genv.true_type
|
568
|
+
when ::FalseClass then genv.false_type
|
569
|
+
else
|
570
|
+
raise "unknown RBS literal: #{ @lit.inspect }"
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
574
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
575
|
+
changes.add_edge(genv, Source.new(get_type(genv)), vtx)
|
576
|
+
end
|
577
|
+
|
578
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
579
|
+
changes.add_edge(genv, Source.new(get_type(genv)), vtx)
|
580
|
+
end
|
581
|
+
|
582
|
+
def show
|
583
|
+
@lit.inspect
|
584
|
+
end
|
585
|
+
end
|
586
|
+
|
587
|
+
class SigTyProcNode < SigTyNode
|
588
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
589
|
+
raise NotImplementedError
|
590
|
+
end
|
591
|
+
|
592
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
593
|
+
Source.new()
|
594
|
+
end
|
595
|
+
|
596
|
+
def show
|
597
|
+
"(...proc...)"
|
598
|
+
end
|
599
|
+
end
|
600
|
+
|
601
|
+
class SigTyInterfaceNode < SigTyNode
|
602
|
+
def initialize(raw_decl, lenv)
|
603
|
+
super(raw_decl, lenv)
|
604
|
+
name = raw_decl.name
|
605
|
+
@cpath = name.namespace.path + [name.name]
|
606
|
+
|
607
|
+
@toplevel = name.namespace.absolute? # "::Foo" or "Foo"
|
608
|
+
@args = raw_decl.args.map {|arg| AST.create_rbs_type(arg, lenv) }
|
609
|
+
end
|
610
|
+
|
611
|
+
attr_reader :cpath, :toplevel, :args
|
612
|
+
def subnodes = { args: }
|
613
|
+
def attrs = { cpath:, toplevel: }
|
614
|
+
|
615
|
+
def define0(genv)
|
616
|
+
@args.each {|arg| arg.define(genv) }
|
617
|
+
const_reads = []
|
618
|
+
const_read = BaseConstRead.new(genv, @cpath.first, @toplevel ? CRef::Toplevel : @lenv.cref)
|
619
|
+
const_reads << const_read
|
620
|
+
unless @cpath.empty?
|
621
|
+
@cpath[1..].each do |cname|
|
622
|
+
const_read = ScopedConstRead.new(cname, const_read)
|
623
|
+
const_reads << const_read
|
624
|
+
end
|
625
|
+
end
|
626
|
+
const_reads
|
627
|
+
end
|
628
|
+
|
629
|
+
def undefine0(genv)
|
630
|
+
@static_ret.each do |const_read|
|
631
|
+
const_read.destroy(genv)
|
632
|
+
end
|
633
|
+
@args.each {|arg| arg.undefine(genv) }
|
634
|
+
end
|
635
|
+
|
636
|
+
def covariant_vertex0(genv, changes, vtx, subst)
|
637
|
+
changes.add_depended_static_read(@static_ret.last)
|
638
|
+
cpath = @static_ret.last.cpath
|
639
|
+
return unless cpath
|
640
|
+
mod = genv.resolve_cpath(cpath)
|
641
|
+
args = @args.map {|arg| arg.covariant_vertex(genv, changes, subst) }
|
642
|
+
changes.add_edge(genv, Source.new(Type::Instance.new(genv, mod, args)), vtx)
|
643
|
+
end
|
644
|
+
|
645
|
+
def contravariant_vertex0(genv, changes, vtx, subst)
|
646
|
+
changes.add_depended_static_read(@static_ret.last)
|
647
|
+
cpath = @static_ret.last.cpath
|
648
|
+
return unless cpath
|
649
|
+
mod = genv.resolve_cpath(cpath)
|
650
|
+
args = @args.map {|arg| arg.contravariant_vertex(genv, changes, subst) }
|
651
|
+
changes.add_edge(genv, Source.new(Type::Instance.new(genv, mod, args)), vtx)
|
652
|
+
end
|
653
|
+
|
654
|
+
def show
|
655
|
+
s = "::#{ @cpath.join("::") }"
|
656
|
+
if !@args.empty?
|
657
|
+
s << "[...]"
|
658
|
+
end
|
659
|
+
s
|
660
|
+
end
|
661
|
+
end
|
662
|
+
end
|
663
|
+
end
|