typeprof 0.21.11 → 0.30.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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -31
  3. data/bin/typeprof +5 -0
  4. data/doc/doc.ja.md +134 -0
  5. data/doc/doc.md +136 -0
  6. data/lib/typeprof/cli/cli.rb +178 -0
  7. data/lib/typeprof/cli.rb +3 -133
  8. data/lib/typeprof/code_range.rb +112 -0
  9. data/lib/typeprof/core/ast/base.rb +263 -0
  10. data/lib/typeprof/core/ast/call.rb +259 -0
  11. data/lib/typeprof/core/ast/const.rb +126 -0
  12. data/lib/typeprof/core/ast/control.rb +433 -0
  13. data/lib/typeprof/core/ast/meta.rb +150 -0
  14. data/lib/typeprof/core/ast/method.rb +339 -0
  15. data/lib/typeprof/core/ast/misc.rb +263 -0
  16. data/lib/typeprof/core/ast/module.rb +123 -0
  17. data/lib/typeprof/core/ast/pattern.rb +140 -0
  18. data/lib/typeprof/core/ast/sig_decl.rb +471 -0
  19. data/lib/typeprof/core/ast/sig_type.rb +663 -0
  20. data/lib/typeprof/core/ast/value.rb +319 -0
  21. data/lib/typeprof/core/ast/variable.rb +315 -0
  22. data/lib/typeprof/core/ast.rb +472 -0
  23. data/lib/typeprof/core/builtin.rb +146 -0
  24. data/lib/typeprof/core/env/method.rb +137 -0
  25. data/lib/typeprof/core/env/method_entity.rb +55 -0
  26. data/lib/typeprof/core/env/module_entity.rb +408 -0
  27. data/lib/typeprof/core/env/static_read.rb +155 -0
  28. data/lib/typeprof/core/env/type_alias_entity.rb +27 -0
  29. data/lib/typeprof/core/env/value_entity.rb +32 -0
  30. data/lib/typeprof/core/env.rb +366 -0
  31. data/lib/typeprof/core/graph/box.rb +998 -0
  32. data/lib/typeprof/core/graph/change_set.rb +224 -0
  33. data/lib/typeprof/core/graph/filter.rb +155 -0
  34. data/lib/typeprof/core/graph/vertex.rb +225 -0
  35. data/lib/typeprof/core/service.rb +514 -0
  36. data/lib/typeprof/core/type.rb +352 -0
  37. data/lib/typeprof/core/util.rb +81 -0
  38. data/lib/typeprof/core.rb +31 -0
  39. data/lib/typeprof/diagnostic.rb +35 -0
  40. data/lib/typeprof/lsp/messages.rb +415 -0
  41. data/lib/typeprof/lsp/server.rb +203 -0
  42. data/lib/typeprof/lsp/text.rb +69 -0
  43. data/lib/typeprof/lsp/util.rb +51 -0
  44. data/lib/typeprof/lsp.rb +4 -907
  45. data/lib/typeprof/version.rb +1 -1
  46. data/lib/typeprof.rb +4 -18
  47. data/typeprof.gemspec +5 -7
  48. metadata +47 -33
  49. data/.github/dependabot.yml +0 -6
  50. data/.github/workflows/main.yml +0 -39
  51. data/.gitignore +0 -9
  52. data/Gemfile +0 -17
  53. data/Gemfile.lock +0 -41
  54. data/Rakefile +0 -10
  55. data/exe/typeprof +0 -10
  56. data/lib/typeprof/analyzer.rb +0 -2598
  57. data/lib/typeprof/arguments.rb +0 -414
  58. data/lib/typeprof/block.rb +0 -176
  59. data/lib/typeprof/builtin.rb +0 -893
  60. data/lib/typeprof/code-range.rb +0 -177
  61. data/lib/typeprof/config.rb +0 -158
  62. data/lib/typeprof/container-type.rb +0 -912
  63. data/lib/typeprof/export.rb +0 -589
  64. data/lib/typeprof/import.rb +0 -852
  65. data/lib/typeprof/insns-def.rb +0 -65
  66. data/lib/typeprof/iseq.rb +0 -864
  67. data/lib/typeprof/method.rb +0 -355
  68. data/lib/typeprof/type.rb +0 -1140
  69. data/lib/typeprof/utils.rb +0 -212
  70. data/tools/coverage.rb +0 -14
  71. data/tools/setup-insns-def.rb +0 -30
  72. data/typeprof-lsp +0 -3
@@ -0,0 +1,471 @@
1
+ module TypeProf::Core
2
+ class AST
3
+ def self.resolve_rbs_name(name, lenv)
4
+ if name.namespace.absolute?
5
+ name.namespace.path + [name.name]
6
+ else
7
+ lenv.cref.cpath + name.namespace.path + [name.name]
8
+ end
9
+ end
10
+
11
+ class SigModuleBaseNode < Node
12
+ def initialize(raw_decl, lenv)
13
+ super(raw_decl, lenv)
14
+ @cpath = AST.resolve_rbs_name(raw_decl.name, lenv)
15
+ # TODO: decl.type_params
16
+ # TODO: decl.super_class.args
17
+ ncref = CRef.new(@cpath, :class, nil, lenv.cref)
18
+ nlenv = LocalEnv.new(@lenv.path, ncref, {}, [])
19
+ @members = raw_decl.members.map do |member|
20
+ AST.create_rbs_member(member, nlenv)
21
+ end.compact
22
+ # TODO?: param.variance, param.unchecked, param.upper_bound
23
+ @params = raw_decl.type_params.map {|param| param.name }
24
+ end
25
+
26
+ attr_reader :cpath, :members, :params
27
+
28
+ def subnodes = { members: }
29
+ def attrs = { cpath:, params: }
30
+
31
+ def define0(genv)
32
+ @members.each do |member|
33
+ member.define(genv)
34
+ end
35
+ mod = genv.resolve_cpath(@cpath)
36
+ { module: mod.add_module_decl(genv, self) }
37
+ end
38
+
39
+ def define_copy(genv)
40
+ mod = genv.resolve_cpath(@cpath)
41
+ mod.add_module_decl(genv, self)
42
+ mod.remove_module_decl(genv, @prev_node)
43
+ super(genv)
44
+ end
45
+
46
+ def undefine0(genv)
47
+ mod = genv.resolve_cpath(@cpath)
48
+ mod.remove_module_decl(genv, self)
49
+ @members.each do |member|
50
+ member.undefine(genv)
51
+ end
52
+ end
53
+
54
+ def install0(genv)
55
+ @mod_val = Source.new(Type::Singleton.new(genv, genv.resolve_cpath(@cpath)))
56
+ @changes.add_edge(genv, @mod_val, @static_ret[:module].vtx)
57
+ @members.each do |member|
58
+ member.install(genv)
59
+ end
60
+ Source.new
61
+ end
62
+ end
63
+
64
+ class SigModuleNode < SigModuleBaseNode
65
+ def initialize(raw_decl, lenv)
66
+ super(raw_decl, lenv)
67
+ @self_types = []
68
+ @self_type_args = []
69
+ raw_decl.self_types.each do |self_type|
70
+ name = self_type.name
71
+ cpath = name.namespace.path + [self_type.name.name]
72
+ toplevel = name.namespace.absolute?
73
+ @self_types << [cpath, toplevel]
74
+ @self_type_args << self_type.args.map {|arg| AST.create_rbs_type(arg, lenv) }
75
+ end
76
+ end
77
+
78
+ attr_reader :self_types, :self_type_args
79
+
80
+ def subnodes
81
+ super.merge!({ self_type_args: })
82
+ end
83
+ def attrs
84
+ super.merge!({ self_types: })
85
+ end
86
+
87
+ def define0(genv)
88
+ static_ret = super(genv)
89
+ static_ret[:self_types] = self_types = []
90
+ @self_types.zip(@self_type_args) do |(cpath, toplevel), args|
91
+ args.each {|arg| arg.define(genv) }
92
+ const_read = BaseConstRead.new(genv, cpath.first, toplevel ? CRef::Toplevel : @lenv.cref)
93
+ const_reads = [const_read]
94
+ cpath[1..].each do |cname|
95
+ const_read = ScopedConstRead.new(cname, const_read)
96
+ const_reads << const_read
97
+ end
98
+ mod = genv.resolve_cpath(@cpath)
99
+ const_read.followers << mod
100
+ self_types << const_reads
101
+ end
102
+ static_ret
103
+ end
104
+
105
+ def undefine0(genv)
106
+ super(genv)
107
+ if @static_ret
108
+ @static_ret[:self_types].each do |const_reads|
109
+ const_reads.each do |const_read|
110
+ const_read.destroy(genv)
111
+ end
112
+ end
113
+ end
114
+ @self_type_args.each do |args|
115
+ args.each {|arg| arg.undefine(genv) }
116
+ end
117
+ end
118
+ end
119
+
120
+ class SigInterfaceNode < SigModuleBaseNode
121
+ end
122
+
123
+ class SigClassNode < SigModuleBaseNode
124
+ def initialize(raw_decl, lenv)
125
+ super(raw_decl, lenv)
126
+ superclass = raw_decl.super_class
127
+ if superclass
128
+ name = superclass.name
129
+ @superclass_cpath = name.namespace.path + [name.name]
130
+ @superclass_toplevel = name.namespace.absolute?
131
+ @superclass_args = superclass.args.map {|arg| AST.create_rbs_type(arg, lenv) }
132
+ else
133
+ @superclass_cpath = nil
134
+ @superclass_toplevel = nil
135
+ @superclass_args = nil
136
+ end
137
+ end
138
+
139
+ attr_reader :superclass_cpath, :superclass_toplevel, :superclass_args
140
+
141
+ def subnodes
142
+ super.merge!({ superclass_args: })
143
+ end
144
+ def attrs
145
+ super.merge!({ superclass_cpath:, superclass_toplevel: })
146
+ end
147
+
148
+ def define0(genv)
149
+ static_ret = super(genv)
150
+ const_reads = []
151
+ if @superclass_cpath
152
+ @superclass_args.each {|arg| arg.define(genv) }
153
+ const_read = BaseConstRead.new(genv, @superclass_cpath.first, @superclass_toplevel ? CRef::Toplevel : @lenv.cref)
154
+ const_reads << const_read
155
+ @superclass_cpath[1..].each do |cname|
156
+ const_read = ScopedConstRead.new(cname, const_read)
157
+ const_reads << const_read
158
+ end
159
+ mod = genv.resolve_cpath(@cpath)
160
+ const_read.followers << mod
161
+ end
162
+ static_ret[:superclass_cpath] = const_reads
163
+ static_ret
164
+ end
165
+
166
+ def undefine0(genv)
167
+ super(genv)
168
+ if @static_ret
169
+ @static_ret[:superclass_cpath].each do |const_read|
170
+ const_read.destroy(genv)
171
+ end
172
+ end
173
+ if @superclass_args
174
+ @superclass_args.each {|arg| arg.undefine(genv) }
175
+ end
176
+ end
177
+ end
178
+
179
+ class SigDefNode < Node
180
+ def initialize(raw_decl, lenv)
181
+ super(raw_decl, lenv)
182
+ @mid = raw_decl.name
183
+ @singleton = raw_decl.singleton?
184
+ @instance = raw_decl.instance?
185
+ @method_types = raw_decl.overloads.map do |overload|
186
+ method_type = overload.method_type
187
+ AST.create_rbs_func_type(method_type, method_type.type_params, method_type.block, lenv)
188
+ end
189
+ @overloading = raw_decl.overloading
190
+ end
191
+
192
+ attr_reader :mid, :singleton, :instance, :method_types, :overloading
193
+
194
+ def subnodes = { method_types: }
195
+ def attrs = { mid:, singleton:, instance:, overloading: }
196
+
197
+ def install0(genv)
198
+ [[@singleton, true], [@instance, false]].each do |enabled, singleton|
199
+ next unless enabled
200
+ @changes.add_method_decl_box(genv, @lenv.cref.cpath, singleton, @mid, @method_types, @overloading)
201
+ end
202
+ Source.new
203
+ end
204
+ end
205
+
206
+ class SigIncludeNode < Node
207
+ def initialize(raw_decl, lenv)
208
+ super(raw_decl, lenv)
209
+ name = raw_decl.name
210
+ @cpath = name.namespace.path + [name.name]
211
+ @toplevel = name.namespace.absolute?
212
+ @args = raw_decl.args.map {|arg| AST.create_rbs_type(arg, lenv) }
213
+ end
214
+
215
+ attr_reader :cpath, :toplevel, :args
216
+ def subnodes = { args: }
217
+ def attrs = { cpath:, toplevel: }
218
+
219
+ def define0(genv)
220
+ @args.each {|arg| arg.define(genv) }
221
+ const_reads = []
222
+ const_read = BaseConstRead.new(genv, @cpath.first, @toplevel ? CRef::Toplevel : @lenv.cref)
223
+ const_reads << const_read
224
+ @cpath[1..].each do |cname|
225
+ const_read = ScopedConstRead.new(cname, const_read)
226
+ const_reads << const_read
227
+ end
228
+ mod = genv.resolve_cpath(@lenv.cref.cpath)
229
+ const_read.followers << mod
230
+ mod.add_include_decl(genv, self)
231
+ const_reads
232
+ end
233
+
234
+ def define_copy(genv)
235
+ mod = genv.resolve_cpath(@lenv.cref.cpath)
236
+ mod.add_include_decl(genv, self)
237
+ mod.remove_include_decl(genv, @prev_node)
238
+ super(genv)
239
+ end
240
+
241
+ def undefine0(genv)
242
+ mod = genv.resolve_cpath(@lenv.cref.cpath)
243
+ mod.remove_include_decl(genv, self)
244
+ @static_ret.each do |const_read|
245
+ const_read.destroy(genv)
246
+ end
247
+ @args.each {|arg| arg.undefine(genv) }
248
+ end
249
+
250
+ def install0(genv)
251
+ Source.new
252
+ end
253
+ end
254
+
255
+ class SigAliasNode < Node
256
+ def initialize(raw_decl, lenv)
257
+ super(raw_decl, lenv)
258
+ @new_mid = raw_decl.new_name
259
+ @old_mid = raw_decl.old_name
260
+ @singleton = raw_decl.singleton?
261
+ @instance = raw_decl.instance?
262
+ end
263
+
264
+ attr_reader :new_mid, :old_mid, :singleton, :instance
265
+ def attrs = { new_mid:, old_mid:, singleton:, instance: }
266
+
267
+ def install0(genv)
268
+ [[@singleton, true], [@instance, false]].each do |enabled, singleton|
269
+ next unless enabled
270
+ @changes.add_method_alias_box(genv, @lenv.cref.cpath, singleton, @new_mid, @old_mid)
271
+ end
272
+ Source.new
273
+ end
274
+ end
275
+
276
+ class SigAttrReaderNode < Node
277
+ def initialize(raw_decl, lenv)
278
+ super(raw_decl, lenv)
279
+ @mid = raw_decl.name
280
+ # `eval` is used to prevent TypeProf from failing to parse keyword arguments during dogfooding.
281
+ # TODO: Remove `eval` once TypeProf supports keyword arguments.
282
+ eval <<~RUBY
283
+ rbs_method_type = RBS::MethodType.new(
284
+ type: RBS::Types::Function.empty(raw_decl.type),
285
+ type_params: [],
286
+ block: nil,
287
+ location: raw_decl.type.location,
288
+ )
289
+ @method_type = AST.create_rbs_func_type(rbs_method_type, [], nil, lenv)
290
+ RUBY
291
+ end
292
+
293
+ attr_reader :mid, :method_type
294
+
295
+ def subnodes = { method_type: }
296
+ def attrs = { mid: }
297
+
298
+ def install0(genv)
299
+ @changes.add_method_decl_box(genv, @lenv.cref.cpath, false, @mid, [@method_type], false)
300
+ Source.new
301
+ end
302
+ end
303
+
304
+ class SigAttrWriterNode < Node
305
+ def initialize(raw_decl, lenv)
306
+ super(raw_decl, lenv)
307
+ @mid = :"#{raw_decl.name}="
308
+
309
+ # `eval` is used to prevent TypeProf from failing to parse keyword arguments during dogfooding.
310
+ # TODO: Remove `eval` once TypeProf supports keyword arguments.
311
+ eval <<~RUBY
312
+ # (raw_decl.type) -> raw_decl.type
313
+ rbs_method_type = RBS::MethodType.new(
314
+ type: RBS::Types::Function.new(
315
+ required_positionals: [RBS::Types::Function::Param.new(name: nil, type: raw_decl.type, location: raw_decl.type.location)],
316
+ optional_positionals: [],
317
+ rest_positionals: nil,
318
+ trailing_positionals: [],
319
+ required_keywords: {},
320
+ optional_keywords: {},
321
+ rest_keywords: nil,
322
+ return_type: raw_decl.type,
323
+ ),
324
+ type_params: [],
325
+ block: nil,
326
+ location: raw_decl.type.location,
327
+ )
328
+ @method_type = AST.create_rbs_func_type(rbs_method_type, [], nil, lenv)
329
+ RUBY
330
+ end
331
+
332
+ attr_reader :mid, :method_type
333
+
334
+ def subnodes = { method_type: }
335
+ def attrs = { mid: }
336
+
337
+ def install0(genv)
338
+ @changes.add_method_decl_box(genv, @lenv.cref.cpath, false, @mid, [@method_type], false)
339
+ Source.new
340
+ end
341
+ end
342
+
343
+ class SigAttrAccessorNode < Node
344
+ def initialize(raw_decl, lenv)
345
+ super(raw_decl, lenv)
346
+ @reader = SigAttrReaderNode.new(raw_decl, lenv)
347
+ @writer = SigAttrWriterNode.new(raw_decl, lenv)
348
+ end
349
+
350
+ attr_reader :reader, :writer
351
+
352
+ def subnodes = { reader:, writer: }
353
+
354
+ def install0(genv)
355
+ @reader.install0(genv)
356
+ @writer.install0(genv)
357
+ Source.new
358
+ end
359
+ end
360
+
361
+ class SigConstNode < Node
362
+ def initialize(raw_decl, lenv)
363
+ super(raw_decl, lenv)
364
+ @cpath = AST.resolve_rbs_name(raw_decl.name, lenv)
365
+ @type = AST.create_rbs_type(raw_decl.type, lenv)
366
+ end
367
+
368
+ attr_reader :cpath, :type
369
+ def subnodes = { type: }
370
+ def attrs = { cpath: }
371
+
372
+ def define0(genv)
373
+ @type.define(genv)
374
+ mod = genv.resolve_const(@cpath)
375
+ mod.add_decl(self)
376
+ mod
377
+ end
378
+
379
+ def define_copy(genv)
380
+ mod = genv.resolve_const(@cpath)
381
+ mod.add_decl(self)
382
+ mod.remove_decl(@prev_node)
383
+ super(genv)
384
+ end
385
+
386
+ def undefine0(genv)
387
+ genv.resolve_const(@cpath).remove_decl(self)
388
+ @type.undefine(genv)
389
+ end
390
+
391
+ def install0(genv)
392
+ box = @changes.add_type_read_box(genv, @type)
393
+ @changes.add_edge(genv, box.ret, @static_ret.vtx)
394
+ box.ret
395
+ end
396
+ end
397
+
398
+ class SigTypeAliasNode < Node
399
+ def initialize(raw_decl, lenv)
400
+ super(raw_decl, lenv)
401
+ @cpath = AST.resolve_rbs_name(raw_decl.name, lenv)
402
+ @name = @cpath.pop
403
+ @type = AST.create_rbs_type(raw_decl.type, lenv)
404
+ @params = raw_decl.type_params.map {|param| param.name }
405
+ end
406
+
407
+ attr_reader :cpath, :name, :type, :params
408
+
409
+ def define0(genv)
410
+ @type.define(genv)
411
+ tae = genv.resolve_type_alias(@cpath, @name)
412
+ tae.add_decl(self)
413
+ tae
414
+ end
415
+
416
+ def define_copy(genv)
417
+ tae = genv.resolve_type_alias(@cpath, @name)
418
+ tae.add_decl(self)
419
+ tae.remove_decl(@prev_node)
420
+ super(genv)
421
+ end
422
+
423
+ def undefine0(genv)
424
+ tae = genv.resolve_type_alias(@cpath, @name)
425
+ tae.remove_decl(self)
426
+ @type.undefine(genv)
427
+ end
428
+
429
+ def install0(genv)
430
+ Source.new
431
+ end
432
+ end
433
+
434
+ class SigGlobalVariableNode < Node
435
+ def initialize(raw_decl, lenv)
436
+ super(raw_decl, lenv)
437
+ @var = raw_decl.name
438
+ @type = AST.create_rbs_type(raw_decl.type, lenv)
439
+ end
440
+
441
+ attr_reader :cpath, :type
442
+ def subnodes = { type: }
443
+ def attrs = { cpath: }
444
+
445
+ def define0(genv)
446
+ @type.define(genv)
447
+ mod = genv.resolve_gvar(@var)
448
+ mod.add_decl(self)
449
+ mod
450
+ end
451
+
452
+ def define_copy(genv)
453
+ mod = genv.resolve_gvar(@var)
454
+ mod.add_decl(self)
455
+ mod.remove_decl(@prev_node)
456
+ super(genv)
457
+ end
458
+
459
+ def undefine0(genv)
460
+ genv.resolve_gvar(@var).remove_decl(self)
461
+ @type.undefine(genv)
462
+ end
463
+
464
+ def install0(genv)
465
+ box = @changes.add_type_read_box(genv, @type)
466
+ @changes.add_edge(genv, box.ret, @static_ret.vtx)
467
+ box.ret
468
+ end
469
+ end
470
+ end
471
+ end