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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/lib/steep.rb +6 -0
  4. data/lib/steep/ast/types/bot.rb +1 -1
  5. data/lib/steep/ast/types/factory.rb +122 -53
  6. data/lib/steep/ast/types/logic.rb +33 -1
  7. data/lib/steep/ast/types/proc.rb +32 -20
  8. data/lib/steep/ast/types/top.rb +1 -1
  9. data/lib/steep/cli.rb +2 -2
  10. data/lib/steep/drivers/print_project.rb +11 -0
  11. data/lib/steep/drivers/vendor.rb +1 -20
  12. data/lib/steep/errors.rb +67 -38
  13. data/lib/steep/index/rbs_index.rb +334 -0
  14. data/lib/steep/index/signature_symbol_provider.rb +154 -0
  15. data/lib/steep/index/source_index.rb +100 -0
  16. data/lib/steep/interface/block.rb +79 -0
  17. data/lib/steep/interface/function.rb +770 -0
  18. data/lib/steep/interface/method_type.rb +32 -812
  19. data/lib/steep/project/dsl.rb +13 -17
  20. data/lib/steep/project/options.rb +4 -4
  21. data/lib/steep/project/target.rb +21 -12
  22. data/lib/steep/server/master.rb +5 -1
  23. data/lib/steep/server/signature_worker.rb +63 -6
  24. data/lib/steep/signature/errors.rb +51 -5
  25. data/lib/steep/signature/validator.rb +28 -4
  26. data/lib/steep/subtyping/check.rb +72 -34
  27. data/lib/steep/subtyping/variable_occurrence.rb +2 -2
  28. data/lib/steep/subtyping/variable_variance.rb +2 -2
  29. data/lib/steep/type_construction.rb +308 -152
  30. data/lib/steep/type_inference/block_params.rb +1 -1
  31. data/lib/steep/type_inference/constant_env.rb +5 -1
  32. data/lib/steep/type_inference/logic_type_interpreter.rb +102 -26
  33. data/lib/steep/typing.rb +8 -2
  34. data/lib/steep/version.rb +1 -1
  35. data/smoke/tsort/Steepfile +6 -0
  36. data/smoke/tsort/a.rb +15 -0
  37. data/smoke/type_case/a.rb +1 -1
  38. data/steep.gemspec +1 -1
  39. metadata +12 -5
@@ -23,7 +23,7 @@ module Steep
23
23
  end
24
24
 
25
25
  def to_s
26
- ""
26
+ "top"
27
27
  end
28
28
 
29
29
  include Helper::NoFreeVariables
@@ -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, :vendor, :stats]
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
@@ -18,26 +18,7 @@ module Steep
18
18
  end
19
19
 
20
20
  def run
21
- stdout.puts "Vendoring into #{vendor_dir}..."
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
@@ -8,7 +8,18 @@ module Steep
8
8
  end
9
9
 
10
10
  def location_to_str
11
- Rainbow("#{node.loc.expression.source_buffer.name}:#{node.loc.first_line}:#{node.loc.column}").red
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
- "#{location_to_str}: IncompatibleAssignment: lhs_type=#{lhs_type}, rhs_type=#{rhs_type}"
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
- "#{location_to_str}: IncompatibleArguments: receiver=#{receiver_type}, method_type=#{method_type}"
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
- "#{location_to_str}: UnresolvedOverloading: receiver=#{receiver_type}, method_name=#{method_name}, method_types=#{method_types.join(" | ")}"
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
- "#{location_to_str}: ArgumentTypeMismatch: receiver=#{receiver_type}, expected=#{expected}, actual=#{actual}"
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
- "#{location_to_str}: BlockParameterTypeMismatch: expected=#{expected}, actual=#{actual}"
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
- "#{location_to_str}: NoMethodError: type=#{type}, method=#{method}"
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
- "#{location_to_str}: ReturnTypeMismatch: expected=#{expected}, actual=#{actual}"
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
- "#{location_to_str}: UnexpectedBlockGiven: method_type=#{method_type}"
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
- "#{location_to_str}: RequiredBlockMissing: method_type=#{method_type.to_s}"
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
- "#{location_to_str}: BlockTypeMismatch: expected=#{expected}, actual=#{actual}"
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
- "#{location_to_str}: BreakTypeMismatch: expected=#{expected}, actual=#{actual}"
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
- "#{location_to_str}: UnexpectedJump"
249
+ format_message ""
220
250
  end
221
251
  end
222
252
 
223
253
  class UnexpectedJumpValue < Base
224
254
  def to_s
225
- "#{location_to_str}: UnexpectedJumpValue"
255
+ format_message ""
226
256
  end
227
257
  end
228
258
 
229
259
  class MethodArityMismatch < Base
230
260
  def to_s
231
- "#{location_to_str}: MethodArityMismatch: method=#{node.children[0]}"
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
- "#{location_to_str}: IncompatibleMethodTypeAnnotation: interface_method=#{interface_method.type_name}.#{interface_method.name}, annotation_method=#{annotation_method.name}"
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
- "#{location_to_str}: MethodDefinitionWithOverloading: method=#{method.name}, types=#{method.types.join(" | ")}"
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
- "#{location_to_str}: MethodReturnTypeAnnotationMismatch: method_type=#{method_type.return_type}, annotation_type=#{annotation_type}"
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
- "#{location_to_str}: MethodBodyTypeMismatch: method=#{method}, expected=#{expected}, actual=#{actual}"
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
- "#{location_to_str}: UnexpectedYield"
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
- "#{location_to_str}: UnexpectedSuper: method=#{method}"
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
- "#{location_to_str}: IncompatibleZuper: method=#{method}"
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
- "#{location_to_str}: MethodDefinitionMissing: module=#{module_name}, method=#{method}"
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
- "#{location_to_str}: UnexpectedDynamicMethod: module=#{module_name}, method=#{method_name}"
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
- "#{location_to_str}: UnknownConstantAssigned: type=#{type}"
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
- "#{location_to_str}: FallbackAny"
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
- "#{location_to_str}: UnsatisfiableConstraint: method_type=#{method_type}, constraint=#{sub_type} <: '#{var} <: #{super_type}"
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
- "#{location_to_str}: IncompatibleAnnotation: var_name=#{var_name}, #{relation}"
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
- "#{location_to_str}: IncompatibleTypeCase: var_name=#{var_name}, #{relation}"
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
- "#{location_to_str}: ElseOnExhaustiveCase: type=#{type}"
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
- "#{location_to_str}: UnexpectedSplat: type=#{type}"
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
- "#{location_to_str}: IncompatibleTuple: expected_tuple=#{expected_tuple}"
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
- "#{location_to_str}: UnexpectedKeyword: #{unexpected_keywords.to_a.join(", ")}"
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
- "#{location_to_str}: MissingKeyword: #{missing_keywords.to_a.join(", ")}"
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
- msg = message || "#{node.type} is not supported"
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
- #{location_to_str}: UnexpectedError: #{error.class}
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