steep 0.34.0 → 0.39.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/CHANGELOG.md +31 -0
- data/lib/steep.rb +6 -0
- data/lib/steep/ast/types/bot.rb +1 -1
- data/lib/steep/ast/types/factory.rb +122 -53
- data/lib/steep/ast/types/logic.rb +33 -1
- data/lib/steep/ast/types/proc.rb +32 -20
- data/lib/steep/ast/types/top.rb +1 -1
- data/lib/steep/cli.rb +2 -2
- data/lib/steep/drivers/print_project.rb +11 -0
- data/lib/steep/drivers/vendor.rb +1 -20
- data/lib/steep/errors.rb +67 -38
- data/lib/steep/index/rbs_index.rb +334 -0
- data/lib/steep/index/signature_symbol_provider.rb +154 -0
- data/lib/steep/index/source_index.rb +100 -0
- data/lib/steep/interface/block.rb +79 -0
- data/lib/steep/interface/function.rb +770 -0
- data/lib/steep/interface/method_type.rb +32 -812
- data/lib/steep/project/dsl.rb +13 -17
- data/lib/steep/project/options.rb +4 -4
- data/lib/steep/project/target.rb +21 -12
- data/lib/steep/server/master.rb +5 -1
- data/lib/steep/server/signature_worker.rb +63 -6
- data/lib/steep/signature/errors.rb +51 -5
- data/lib/steep/signature/validator.rb +28 -4
- data/lib/steep/subtyping/check.rb +72 -34
- data/lib/steep/subtyping/variable_occurrence.rb +2 -2
- data/lib/steep/subtyping/variable_variance.rb +2 -2
- data/lib/steep/type_construction.rb +308 -152
- data/lib/steep/type_inference/block_params.rb +1 -1
- data/lib/steep/type_inference/constant_env.rb +5 -1
- data/lib/steep/type_inference/logic_type_interpreter.rb +102 -26
- data/lib/steep/typing.rb +8 -2
- data/lib/steep/version.rb +1 -1
- data/smoke/tsort/Steepfile +6 -0
- data/smoke/tsort/a.rb +15 -0
- data/smoke/type_case/a.rb +1 -1
- data/steep.gemspec +1 -1
- metadata +12 -5
data/lib/steep/ast/types/top.rb
CHANGED
data/lib/steep/cli.rb
CHANGED
@@ -16,7 +16,7 @@ module Steep
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.available_commands
|
19
|
-
[:init, :check, :validate, :annotations, :version, :project, :watch, :langserver, :
|
19
|
+
[:init, :check, :validate, :annotations, :version, :project, :watch, :langserver, :stats]
|
20
20
|
end
|
21
21
|
|
22
22
|
def process_global_options
|
@@ -34,7 +34,7 @@ module Steep
|
|
34
34
|
|
35
35
|
def setup_command
|
36
36
|
@command = argv.shift&.to_sym
|
37
|
-
if CLI.available_commands.include?(@command) || @command == :worker
|
37
|
+
if CLI.available_commands.include?(@command) || @command == :worker || @command == :vendor
|
38
38
|
true
|
39
39
|
else
|
40
40
|
stderr.puts "Unknown command: #{command}"
|
@@ -47,6 +47,17 @@ module Steep
|
|
47
47
|
target.options.libraries.each do |lib|
|
48
48
|
stdout.puts " - #{lib}"
|
49
49
|
end
|
50
|
+
stdout.puts " library dirs:"
|
51
|
+
Project::Target.construct_env_loader(options: target.options).tap do |loader|
|
52
|
+
loader.each_dir do |lib, path|
|
53
|
+
case lib
|
54
|
+
when :core
|
55
|
+
stdout.puts " - core: #{path}"
|
56
|
+
else
|
57
|
+
stdout.puts " - #{lib.name}: #{path}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
50
61
|
end
|
51
62
|
|
52
63
|
0
|
data/lib/steep/drivers/vendor.rb
CHANGED
@@ -18,26 +18,7 @@ module Steep
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def run
|
21
|
-
stdout.puts "
|
22
|
-
|
23
|
-
vendorer = RBS::Vendorer.new(vendor_dir: vendor_dir)
|
24
|
-
|
25
|
-
if clean_before
|
26
|
-
stdout.puts " Cleaning directory..."
|
27
|
-
vendorer.clean!
|
28
|
-
end
|
29
|
-
|
30
|
-
stdout.puts " Vendoring standard libraries..."
|
31
|
-
vendorer.stdlib!
|
32
|
-
|
33
|
-
if defined?(Bundler)
|
34
|
-
Bundler.locked_gems.specs.each do |spec|
|
35
|
-
if RBS::EnvironmentLoader.gem_sig_path(spec.name, spec.version.to_s).directory?
|
36
|
-
stdout.puts " Vendoring rubygem: #{spec.full_name}..."
|
37
|
-
vendorer.gem! spec.name, spec.version.to_s
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
21
|
+
stdout.puts "`steep vendor` is deprecated. Use `rbs vendor` command directly"
|
41
22
|
|
42
23
|
0
|
43
24
|
end
|
data/lib/steep/errors.rb
CHANGED
@@ -8,7 +8,18 @@ module Steep
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def location_to_str
|
11
|
-
Rainbow(
|
11
|
+
file = Rainbow(node.loc.expression.source_buffer.name).cyan
|
12
|
+
line = Rainbow(node.loc.first_line).bright
|
13
|
+
column = Rainbow(node.loc.column).bright
|
14
|
+
"#{file}:#{line}:#{column}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def format_message(message, class_name: self.class.name.split("::").last)
|
18
|
+
if message.empty?
|
19
|
+
"#{location_to_str}: #{Rainbow(class_name).red}"
|
20
|
+
else
|
21
|
+
"#{location_to_str}: #{Rainbow(class_name).red}: #{message}"
|
22
|
+
end
|
12
23
|
end
|
13
24
|
|
14
25
|
def print_to(io)
|
@@ -45,7 +56,7 @@ module Steep
|
|
45
56
|
end
|
46
57
|
|
47
58
|
def to_s
|
48
|
-
"
|
59
|
+
format_message "lhs_type=#{lhs_type}, rhs_type=#{rhs_type}"
|
49
60
|
end
|
50
61
|
end
|
51
62
|
|
@@ -61,7 +72,7 @@ module Steep
|
|
61
72
|
end
|
62
73
|
|
63
74
|
def to_s
|
64
|
-
"
|
75
|
+
format_message "receiver=#{receiver_type}, method_type=#{method_type}"
|
65
76
|
end
|
66
77
|
end
|
67
78
|
|
@@ -79,7 +90,7 @@ module Steep
|
|
79
90
|
end
|
80
91
|
|
81
92
|
def to_s
|
82
|
-
"
|
93
|
+
format_message "receiver=#{receiver_type}, method_name=#{method_name}, method_types=#{method_types.join(" | ")}"
|
83
94
|
end
|
84
95
|
end
|
85
96
|
|
@@ -97,7 +108,7 @@ module Steep
|
|
97
108
|
end
|
98
109
|
|
99
110
|
def to_s
|
100
|
-
"
|
111
|
+
format_message "receiver=#{receiver_type}, expected=#{expected}, actual=#{actual}"
|
101
112
|
end
|
102
113
|
end
|
103
114
|
|
@@ -112,7 +123,7 @@ module Steep
|
|
112
123
|
end
|
113
124
|
|
114
125
|
def to_s
|
115
|
-
"
|
126
|
+
format_message "expected=#{expected}, actual=#{actual}"
|
116
127
|
end
|
117
128
|
end
|
118
129
|
|
@@ -127,7 +138,7 @@ module Steep
|
|
127
138
|
end
|
128
139
|
|
129
140
|
def to_s
|
130
|
-
"
|
141
|
+
format_message "type=#{type}, method=#{method}", class_name: "NoMethodError"
|
131
142
|
end
|
132
143
|
end
|
133
144
|
|
@@ -146,7 +157,7 @@ module Steep
|
|
146
157
|
end
|
147
158
|
|
148
159
|
def to_s
|
149
|
-
"
|
160
|
+
format_message "expected=#{expected}, actual=#{actual}"
|
150
161
|
end
|
151
162
|
end
|
152
163
|
|
@@ -159,7 +170,7 @@ module Steep
|
|
159
170
|
end
|
160
171
|
|
161
172
|
def to_s
|
162
|
-
"
|
173
|
+
format_message "method_type=#{method_type}"
|
163
174
|
end
|
164
175
|
end
|
165
176
|
|
@@ -172,7 +183,7 @@ module Steep
|
|
172
183
|
end
|
173
184
|
|
174
185
|
def to_s
|
175
|
-
"
|
186
|
+
format_message "method_type=#{method_type}"
|
176
187
|
end
|
177
188
|
end
|
178
189
|
|
@@ -191,7 +202,26 @@ module Steep
|
|
191
202
|
end
|
192
203
|
|
193
204
|
def to_s
|
194
|
-
"
|
205
|
+
format_message "expected=#{expected}, actual=#{actual}"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
class BlockBodyTypeMismatch < Base
|
210
|
+
attr_reader :expected
|
211
|
+
attr_reader :actual
|
212
|
+
attr_reader :result
|
213
|
+
|
214
|
+
include ResultPrinter
|
215
|
+
|
216
|
+
def initialize(node:, expected:, actual:, result:)
|
217
|
+
super(node: node)
|
218
|
+
@expected = expected
|
219
|
+
@actual = actual
|
220
|
+
@result = result
|
221
|
+
end
|
222
|
+
|
223
|
+
def to_s
|
224
|
+
format_message "expected=#{expected}, actual=#{actual}"
|
195
225
|
end
|
196
226
|
end
|
197
227
|
|
@@ -210,25 +240,25 @@ module Steep
|
|
210
240
|
end
|
211
241
|
|
212
242
|
def to_s
|
213
|
-
"
|
243
|
+
format_message "expected=#{expected}, actual=#{actual}"
|
214
244
|
end
|
215
245
|
end
|
216
246
|
|
217
247
|
class UnexpectedJump < Base
|
218
248
|
def to_s
|
219
|
-
|
249
|
+
format_message ""
|
220
250
|
end
|
221
251
|
end
|
222
252
|
|
223
253
|
class UnexpectedJumpValue < Base
|
224
254
|
def to_s
|
225
|
-
|
255
|
+
format_message ""
|
226
256
|
end
|
227
257
|
end
|
228
258
|
|
229
259
|
class MethodArityMismatch < Base
|
230
260
|
def to_s
|
231
|
-
"
|
261
|
+
format_message "method=#{node.children[0]}"
|
232
262
|
end
|
233
263
|
end
|
234
264
|
|
@@ -247,7 +277,7 @@ module Steep
|
|
247
277
|
end
|
248
278
|
|
249
279
|
def to_s
|
250
|
-
"
|
280
|
+
format_message "interface_method=#{interface_method.type_name}.#{interface_method.name}, annotation_method=#{annotation_method.name}"
|
251
281
|
end
|
252
282
|
end
|
253
283
|
|
@@ -260,7 +290,7 @@ module Steep
|
|
260
290
|
end
|
261
291
|
|
262
292
|
def to_s
|
263
|
-
"
|
293
|
+
format_message "method=#{method.name}, types=#{method.types.join(" | ")}"
|
264
294
|
end
|
265
295
|
end
|
266
296
|
|
@@ -279,7 +309,7 @@ module Steep
|
|
279
309
|
end
|
280
310
|
|
281
311
|
def to_s
|
282
|
-
"
|
312
|
+
format_message "method_type=#{method_type.return_type}, annotation_type=#{annotation_type}"
|
283
313
|
end
|
284
314
|
end
|
285
315
|
|
@@ -305,13 +335,13 @@ module Steep
|
|
305
335
|
prefix = node.children[0].type == :self ? "self" : "*"
|
306
336
|
"#{prefix}.#{node.children[1]}"
|
307
337
|
end
|
308
|
-
"
|
338
|
+
format_message "method=#{method}, expected=#{expected}, actual=#{actual}"
|
309
339
|
end
|
310
340
|
end
|
311
341
|
|
312
342
|
class UnexpectedYield < Base
|
313
343
|
def to_s
|
314
|
-
|
344
|
+
format_message ""
|
315
345
|
end
|
316
346
|
end
|
317
347
|
|
@@ -324,7 +354,7 @@ module Steep
|
|
324
354
|
end
|
325
355
|
|
326
356
|
def to_s
|
327
|
-
"
|
357
|
+
format_message "method=#{method}"
|
328
358
|
end
|
329
359
|
end
|
330
360
|
|
@@ -337,7 +367,7 @@ module Steep
|
|
337
367
|
end
|
338
368
|
|
339
369
|
def to_s
|
340
|
-
"
|
370
|
+
format_message "method=#{method}"
|
341
371
|
end
|
342
372
|
end
|
343
373
|
|
@@ -360,7 +390,7 @@ module Steep
|
|
360
390
|
when :module
|
361
391
|
"self.#{missing_method}"
|
362
392
|
end
|
363
|
-
"
|
393
|
+
format_message "module=#{module_name}, method=#{method}"
|
364
394
|
end
|
365
395
|
end
|
366
396
|
|
@@ -375,7 +405,7 @@ module Steep
|
|
375
405
|
end
|
376
406
|
|
377
407
|
def to_s
|
378
|
-
"
|
408
|
+
format_message "module=#{module_name}, method=#{method_name}"
|
379
409
|
end
|
380
410
|
end
|
381
411
|
|
@@ -388,7 +418,7 @@ module Steep
|
|
388
418
|
end
|
389
419
|
|
390
420
|
def to_s
|
391
|
-
"
|
421
|
+
format_message "type=#{type}"
|
392
422
|
end
|
393
423
|
end
|
394
424
|
|
@@ -398,7 +428,7 @@ module Steep
|
|
398
428
|
end
|
399
429
|
|
400
430
|
def to_s
|
401
|
-
|
431
|
+
format_message ""
|
402
432
|
end
|
403
433
|
end
|
404
434
|
|
@@ -421,7 +451,7 @@ module Steep
|
|
421
451
|
include ResultPrinter
|
422
452
|
|
423
453
|
def to_s
|
424
|
-
"
|
454
|
+
format_message "method_type=#{method_type}, constraint=#{sub_type} <: '#{var} <: #{super_type}"
|
425
455
|
end
|
426
456
|
end
|
427
457
|
|
@@ -440,7 +470,7 @@ module Steep
|
|
440
470
|
include ResultPrinter
|
441
471
|
|
442
472
|
def to_s
|
443
|
-
"
|
473
|
+
format_message "var_name=#{var_name}, #{relation}"
|
444
474
|
end
|
445
475
|
end
|
446
476
|
|
@@ -459,7 +489,7 @@ module Steep
|
|
459
489
|
include ResultPrinter
|
460
490
|
|
461
491
|
def to_s
|
462
|
-
"
|
492
|
+
format_message "var_name=#{var_name}, #{relation}"
|
463
493
|
end
|
464
494
|
end
|
465
495
|
|
@@ -472,7 +502,7 @@ module Steep
|
|
472
502
|
end
|
473
503
|
|
474
504
|
def to_s
|
475
|
-
"
|
505
|
+
format_message "type=#{type}"
|
476
506
|
end
|
477
507
|
end
|
478
508
|
|
@@ -485,7 +515,7 @@ module Steep
|
|
485
515
|
end
|
486
516
|
|
487
517
|
def to_s
|
488
|
-
"
|
518
|
+
format_message "type=#{type}"
|
489
519
|
end
|
490
520
|
end
|
491
521
|
|
@@ -500,7 +530,7 @@ module Steep
|
|
500
530
|
end
|
501
531
|
|
502
532
|
def to_s
|
503
|
-
"
|
533
|
+
format_message "expected_tuple=#{expected_tuple}"
|
504
534
|
end
|
505
535
|
end
|
506
536
|
|
@@ -513,7 +543,7 @@ module Steep
|
|
513
543
|
end
|
514
544
|
|
515
545
|
def to_s
|
516
|
-
|
546
|
+
format_message unexpected_keywords.to_a.join(", ")
|
517
547
|
end
|
518
548
|
end
|
519
549
|
|
@@ -526,7 +556,7 @@ module Steep
|
|
526
556
|
end
|
527
557
|
|
528
558
|
def to_s
|
529
|
-
|
559
|
+
format_message missing_keywords.to_a.join(", ")
|
530
560
|
end
|
531
561
|
end
|
532
562
|
|
@@ -539,8 +569,7 @@ module Steep
|
|
539
569
|
end
|
540
570
|
|
541
571
|
def to_s
|
542
|
-
|
543
|
-
"#{location_to_str}: UnsupportedSyntax: #{msg}"
|
572
|
+
format_message(message || "#{node.type} is not supported")
|
544
573
|
end
|
545
574
|
end
|
546
575
|
|
@@ -555,8 +584,8 @@ module Steep
|
|
555
584
|
end
|
556
585
|
|
557
586
|
def to_s
|
558
|
-
<<-MESSAGE
|
559
|
-
#{
|
587
|
+
format_message <<-MESSAGE
|
588
|
+
#{error.class}
|
560
589
|
>> #{message}
|
561
590
|
MESSAGE
|
562
591
|
end
|
@@ -0,0 +1,334 @@
|
|
1
|
+
module Steep
|
2
|
+
module Index
|
3
|
+
class RBSIndex
|
4
|
+
class TypeEntry
|
5
|
+
attr_reader :type_name
|
6
|
+
attr_reader :declarations
|
7
|
+
attr_reader :references
|
8
|
+
|
9
|
+
def initialize(type_name:)
|
10
|
+
@type_name = type_name
|
11
|
+
@declarations = Set[]
|
12
|
+
@references = Set[]
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_declaration(decl)
|
16
|
+
case decl
|
17
|
+
when RBS::AST::Declarations::Class, RBS::AST::Declarations::Module
|
18
|
+
declarations << decl
|
19
|
+
when RBS::AST::Declarations::Interface
|
20
|
+
declarations << decl
|
21
|
+
when RBS::AST::Declarations::Alias
|
22
|
+
declarations << decl
|
23
|
+
else
|
24
|
+
raise "Unexpected type declaration: #{decl}"
|
25
|
+
end
|
26
|
+
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_reference(ref)
|
31
|
+
case ref
|
32
|
+
when RBS::AST::Members::MethodDefinition
|
33
|
+
references << ref
|
34
|
+
when RBS::AST::Members::AttrAccessor, RBS::AST::Members::AttrReader, RBS::AST::Members::AttrWriter
|
35
|
+
references << ref
|
36
|
+
when RBS::AST::Members::InstanceVariable, RBS::AST::Members::ClassInstanceVariable, RBS::AST::Members::ClassVariable
|
37
|
+
references << ref
|
38
|
+
when RBS::AST::Members::Include, RBS::AST::Members::Extend
|
39
|
+
references << ref
|
40
|
+
when RBS::AST::Declarations::Module, RBS::AST::Declarations::Class
|
41
|
+
references << ref
|
42
|
+
when RBS::AST::Declarations::Constant, RBS::AST::Declarations::Global
|
43
|
+
references << ref
|
44
|
+
when RBS::AST::Declarations::Alias
|
45
|
+
references << ref
|
46
|
+
else
|
47
|
+
raise "Unexpected type reference: #{ref}"
|
48
|
+
end
|
49
|
+
|
50
|
+
self
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class MethodEntry
|
55
|
+
attr_reader :method_name
|
56
|
+
attr_reader :declarations
|
57
|
+
attr_reader :references
|
58
|
+
|
59
|
+
def initialize(method_name:)
|
60
|
+
@method_name = method_name
|
61
|
+
@declarations = Set[]
|
62
|
+
@references = Set[]
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_declaration(decl)
|
66
|
+
case decl
|
67
|
+
when RBS::AST::Members::MethodDefinition,
|
68
|
+
RBS::AST::Members::Alias,
|
69
|
+
RBS::AST::Members::AttrWriter,
|
70
|
+
RBS::AST::Members::AttrReader,
|
71
|
+
RBS::AST::Members::AttrAccessor
|
72
|
+
declarations << decl
|
73
|
+
else
|
74
|
+
raise "Unexpected method declaration: #{decl}"
|
75
|
+
end
|
76
|
+
|
77
|
+
self
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class ConstantEntry
|
82
|
+
attr_reader :const_name
|
83
|
+
attr_reader :declarations
|
84
|
+
|
85
|
+
def initialize(const_name:)
|
86
|
+
@const_name = const_name
|
87
|
+
@declarations = Set[]
|
88
|
+
end
|
89
|
+
|
90
|
+
def add_declaration(decl)
|
91
|
+
case decl
|
92
|
+
when RBS::AST::Declarations::Constant
|
93
|
+
declarations << decl
|
94
|
+
else
|
95
|
+
raise
|
96
|
+
end
|
97
|
+
|
98
|
+
self
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class GlobalEntry
|
103
|
+
attr_reader :global_name
|
104
|
+
attr_reader :declarations
|
105
|
+
|
106
|
+
def initialize(global_name:)
|
107
|
+
@global_name = global_name
|
108
|
+
@declarations = Set[]
|
109
|
+
end
|
110
|
+
|
111
|
+
def add_declaration(decl)
|
112
|
+
case decl
|
113
|
+
when RBS::AST::Declarations::Global
|
114
|
+
declarations << decl
|
115
|
+
else
|
116
|
+
raise
|
117
|
+
end
|
118
|
+
|
119
|
+
self
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
attr_reader :type_index
|
124
|
+
attr_reader :method_index
|
125
|
+
attr_reader :const_index
|
126
|
+
attr_reader :global_index
|
127
|
+
|
128
|
+
def initialize()
|
129
|
+
@type_index = {}
|
130
|
+
@method_index = {}
|
131
|
+
@const_index = {}
|
132
|
+
@global_index = {}
|
133
|
+
end
|
134
|
+
|
135
|
+
def entry(type_name: nil, method_name: nil, const_name: nil, global_name: nil)
|
136
|
+
case
|
137
|
+
when type_name
|
138
|
+
type_index[type_name] ||= TypeEntry.new(type_name: type_name)
|
139
|
+
when method_name
|
140
|
+
method_index[method_name] ||= MethodEntry.new(method_name: method_name)
|
141
|
+
when const_name
|
142
|
+
const_index[const_name] ||= ConstantEntry.new(const_name: const_name)
|
143
|
+
when global_name
|
144
|
+
global_index[global_name] ||= GlobalEntry.new(global_name: global_name)
|
145
|
+
else
|
146
|
+
raise
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def each_entry(&block)
|
151
|
+
if block_given?
|
152
|
+
type_index.each_value(&block)
|
153
|
+
method_index.each_value(&block)
|
154
|
+
const_index.each_value(&block)
|
155
|
+
global_index.each_value(&block)
|
156
|
+
else
|
157
|
+
enum_for(:each_entry)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def add_type_declaration(type_name, declaration)
|
162
|
+
entry(type_name: type_name).add_declaration(declaration)
|
163
|
+
end
|
164
|
+
|
165
|
+
def add_method_declaration(method_name, member)
|
166
|
+
entry(method_name: method_name).add_declaration(member)
|
167
|
+
end
|
168
|
+
|
169
|
+
def add_constant_declaration(const_name, decl)
|
170
|
+
entry(const_name: const_name).add_declaration(decl)
|
171
|
+
end
|
172
|
+
|
173
|
+
def add_global_declaration(global_name, decl)
|
174
|
+
entry(global_name: global_name).add_declaration(decl)
|
175
|
+
end
|
176
|
+
|
177
|
+
def each_declaration(type_name: nil, method_name: nil, const_name: nil, global_name: nil, &block)
|
178
|
+
if block
|
179
|
+
entry = entry(type_name: type_name, method_name: method_name, const_name: const_name, global_name: global_name)
|
180
|
+
entry.declarations.each(&block)
|
181
|
+
else
|
182
|
+
enum_for(:each_declaration, type_name: type_name, method_name: method_name, const_name: const_name, global_name: global_name)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def add_type_reference(type_name, ref)
|
187
|
+
entry(type_name: type_name).add_reference(ref)
|
188
|
+
end
|
189
|
+
|
190
|
+
def each_reference(type_name: nil, &block)
|
191
|
+
if block
|
192
|
+
entry(type_name: type_name).references.each(&block)
|
193
|
+
else
|
194
|
+
enum_for(:each_reference, type_name: type_name)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
class Builder
|
199
|
+
attr_reader :index
|
200
|
+
|
201
|
+
def initialize(index:)
|
202
|
+
@index = index
|
203
|
+
end
|
204
|
+
|
205
|
+
def member(type_name, member)
|
206
|
+
case member
|
207
|
+
when RBS::AST::Members::MethodDefinition
|
208
|
+
member.types.each do |method_type|
|
209
|
+
method_type.each_type do |type|
|
210
|
+
type_reference type, from: member
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
if member.instance?
|
215
|
+
method_name = InstanceMethodName.new(type_name: type_name, method_name: member.name)
|
216
|
+
index.add_method_declaration(method_name, member)
|
217
|
+
end
|
218
|
+
|
219
|
+
if member.singleton?
|
220
|
+
method_name = SingletonMethodName.new(type_name: type_name, method_name: member.name)
|
221
|
+
index.add_method_declaration(method_name, member)
|
222
|
+
end
|
223
|
+
|
224
|
+
when RBS::AST::Members::AttrAccessor, RBS::AST::Members::AttrReader, RBS::AST::Members::AttrWriter
|
225
|
+
type_reference member.type, from: member
|
226
|
+
|
227
|
+
if member.is_a?(RBS::AST::Members::AttrReader) || member.is_a?(RBS::AST::Members::AttrAccessor)
|
228
|
+
method_name = case member.kind
|
229
|
+
when :instance
|
230
|
+
InstanceMethodName.new(type_name: type_name, method_name: member.name)
|
231
|
+
when :singleton
|
232
|
+
SingletonMethodName.new(type_name: type_name, method_name: member.name)
|
233
|
+
end
|
234
|
+
index.add_method_declaration(method_name, member)
|
235
|
+
end
|
236
|
+
|
237
|
+
if member.is_a?(RBS::AST::Members::AttrWriter) || member.is_a?(RBS::AST::Members::AttrAccessor)
|
238
|
+
method_name = case member.kind
|
239
|
+
when :instance
|
240
|
+
InstanceMethodName.new(type_name: type_name, method_name: "#{member.name}=".to_sym)
|
241
|
+
when :singleton
|
242
|
+
SingletonMethodName.new(type_name: type_name, method_name: "#{member.name}=".to_sym)
|
243
|
+
end
|
244
|
+
index.add_method_declaration(method_name, member)
|
245
|
+
end
|
246
|
+
|
247
|
+
when RBS::AST::Members::InstanceVariable, RBS::AST::Members::ClassVariable, RBS::AST::Members::ClassInstanceVariable
|
248
|
+
type_reference member.type, from: member
|
249
|
+
|
250
|
+
when RBS::AST::Members::Include, RBS::AST::Members::Extend
|
251
|
+
index.add_type_reference member.name, member
|
252
|
+
member.args.each do |type|
|
253
|
+
type_reference type, from: member
|
254
|
+
end
|
255
|
+
|
256
|
+
when RBS::AST::Members::Alias
|
257
|
+
if member.instance?
|
258
|
+
new_name = InstanceMethodName.new(type_name: type_name, method_name: member.new_name)
|
259
|
+
index.add_method_declaration(new_name, member)
|
260
|
+
end
|
261
|
+
|
262
|
+
if member.singleton?
|
263
|
+
new_name = SingletonMethodName.new(type_name: type_name, method_name: member.new_name)
|
264
|
+
index.add_method_declaration(new_name, member)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def type_reference(type, from:)
|
270
|
+
case type
|
271
|
+
when RBS::Types::ClassInstance, RBS::Types::ClassSingleton, RBS::Types::Alias, RBS::Types::Interface
|
272
|
+
index.add_type_reference(type.name, from)
|
273
|
+
end
|
274
|
+
|
275
|
+
type.each_type do |ty|
|
276
|
+
type_reference ty, from: from
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
def env(env)
|
281
|
+
env.class_decls.each do |name, decl|
|
282
|
+
decl.decls.each do |d|
|
283
|
+
index.add_type_declaration(name, d.decl)
|
284
|
+
|
285
|
+
case d.decl
|
286
|
+
when RBS::AST::Declarations::Class
|
287
|
+
if super_class = d.decl.super_class
|
288
|
+
index.add_type_reference(super_class.name, d.decl)
|
289
|
+
super_class.args.each do |type|
|
290
|
+
type_reference(type, from: d.decl)
|
291
|
+
end
|
292
|
+
end
|
293
|
+
when RBS::AST::Declarations::Module
|
294
|
+
d.decl.self_types.each do |self_type|
|
295
|
+
index.add_type_reference(self_type.name, d.decl)
|
296
|
+
self_type.args.each do |type|
|
297
|
+
type_reference(type, from: d.decl)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
d.decl.members.each do |member|
|
303
|
+
member(name, member)
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
env.interface_decls.each do |name, decl|
|
309
|
+
index.add_type_declaration(name, decl.decl)
|
310
|
+
|
311
|
+
decl.decl.members.each do |member|
|
312
|
+
member(name, member)
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
env.alias_decls.each do |name, decl|
|
317
|
+
index.add_type_declaration(name, decl.decl)
|
318
|
+
type_reference decl.decl.type, from: decl.decl
|
319
|
+
end
|
320
|
+
|
321
|
+
env.constant_decls.each do |name, decl|
|
322
|
+
index.add_constant_declaration(name, decl.decl)
|
323
|
+
type_reference decl.decl.type, from: decl.decl
|
324
|
+
end
|
325
|
+
|
326
|
+
env.global_decls.each do |name, decl|
|
327
|
+
index.add_global_declaration(name, decl.decl)
|
328
|
+
type_reference decl.decl.type, from: decl.decl
|
329
|
+
end
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|