ruby-lsp 0.23.11 → 0.23.16

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp-launcher +20 -11
  5. data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -1
  6. data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -5
  7. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +82 -116
  8. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +123 -169
  9. data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +9 -7
  10. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +92 -202
  11. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +116 -222
  12. data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
  13. data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +18 -19
  14. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +22 -45
  15. data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +47 -61
  16. data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +17 -19
  17. data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +5 -9
  18. data/lib/ruby_indexer/test/class_variables_test.rb +14 -14
  19. data/lib/ruby_indexer/test/classes_and_modules_test.rb +65 -40
  20. data/lib/ruby_indexer/test/configuration_test.rb +48 -7
  21. data/lib/ruby_indexer/test/constant_test.rb +34 -34
  22. data/lib/ruby_indexer/test/enhancements_test.rb +1 -1
  23. data/lib/ruby_indexer/test/index_test.rb +139 -135
  24. data/lib/ruby_indexer/test/instance_variables_test.rb +37 -37
  25. data/lib/ruby_indexer/test/method_test.rb +143 -117
  26. data/lib/ruby_indexer/test/prefix_tree_test.rb +13 -13
  27. data/lib/ruby_indexer/test/rbs_indexer_test.rb +65 -71
  28. data/lib/ruby_indexer/test/test_case.rb +2 -2
  29. data/lib/ruby_indexer/test/uri_test.rb +15 -2
  30. data/lib/ruby_lsp/addon.rb +44 -71
  31. data/lib/ruby_lsp/base_server.rb +29 -32
  32. data/lib/ruby_lsp/client_capabilities.rb +10 -12
  33. data/lib/ruby_lsp/document.rb +39 -45
  34. data/lib/ruby_lsp/erb_document.rb +36 -40
  35. data/lib/ruby_lsp/global_state.rb +52 -57
  36. data/lib/ruby_lsp/internal.rb +2 -0
  37. data/lib/ruby_lsp/listeners/code_lens.rb +82 -89
  38. data/lib/ruby_lsp/listeners/completion.rb +60 -66
  39. data/lib/ruby_lsp/listeners/definition.rb +38 -52
  40. data/lib/ruby_lsp/listeners/document_highlight.rb +123 -150
  41. data/lib/ruby_lsp/listeners/document_link.rb +46 -63
  42. data/lib/ruby_lsp/listeners/document_symbol.rb +38 -52
  43. data/lib/ruby_lsp/listeners/folding_ranges.rb +40 -43
  44. data/lib/ruby_lsp/listeners/hover.rb +83 -102
  45. data/lib/ruby_lsp/listeners/inlay_hints.rb +4 -11
  46. data/lib/ruby_lsp/listeners/semantic_highlighting.rb +54 -56
  47. data/lib/ruby_lsp/listeners/signature_help.rb +11 -26
  48. data/lib/ruby_lsp/listeners/spec_style.rb +155 -0
  49. data/lib/ruby_lsp/listeners/test_discovery.rb +89 -0
  50. data/lib/ruby_lsp/listeners/test_style.rb +160 -88
  51. data/lib/ruby_lsp/node_context.rb +12 -39
  52. data/lib/ruby_lsp/rbs_document.rb +8 -6
  53. data/lib/ruby_lsp/requests/code_action_resolve.rb +24 -25
  54. data/lib/ruby_lsp/requests/code_actions.rb +14 -26
  55. data/lib/ruby_lsp/requests/code_lens.rb +6 -17
  56. data/lib/ruby_lsp/requests/completion.rb +7 -20
  57. data/lib/ruby_lsp/requests/completion_resolve.rb +6 -6
  58. data/lib/ruby_lsp/requests/definition.rb +8 -17
  59. data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
  60. data/lib/ruby_lsp/requests/discover_tests.rb +18 -5
  61. data/lib/ruby_lsp/requests/document_highlight.rb +5 -15
  62. data/lib/ruby_lsp/requests/document_link.rb +6 -17
  63. data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
  64. data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
  65. data/lib/ruby_lsp/requests/formatting.rb +6 -9
  66. data/lib/ruby_lsp/requests/go_to_relevant_file.rb +87 -0
  67. data/lib/ruby_lsp/requests/hover.rb +10 -20
  68. data/lib/ruby_lsp/requests/inlay_hints.rb +6 -17
  69. data/lib/ruby_lsp/requests/on_type_formatting.rb +32 -40
  70. data/lib/ruby_lsp/requests/prepare_rename.rb +4 -9
  71. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +5 -15
  72. data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
  73. data/lib/ruby_lsp/requests/references.rb +8 -37
  74. data/lib/ruby_lsp/requests/rename.rb +19 -42
  75. data/lib/ruby_lsp/requests/request.rb +7 -19
  76. data/lib/ruby_lsp/requests/selection_ranges.rb +6 -6
  77. data/lib/ruby_lsp/requests/semantic_highlighting.rb +16 -35
  78. data/lib/ruby_lsp/requests/show_syntax_tree.rb +7 -8
  79. data/lib/ruby_lsp/requests/signature_help.rb +8 -26
  80. data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
  81. data/lib/ruby_lsp/requests/support/common.rb +16 -51
  82. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
  83. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +11 -14
  84. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +22 -34
  85. data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
  86. data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
  87. data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
  88. data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
  89. data/lib/ruby_lsp/requests/support/test_item.rb +10 -14
  90. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
  91. data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
  92. data/lib/ruby_lsp/response_builders/collection_response_builder.rb +5 -5
  93. data/lib/ruby_lsp/response_builders/document_symbol.rb +13 -18
  94. data/lib/ruby_lsp/response_builders/hover.rb +11 -14
  95. data/lib/ruby_lsp/response_builders/response_builder.rb +1 -1
  96. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +60 -88
  97. data/lib/ruby_lsp/response_builders/signature_help.rb +5 -6
  98. data/lib/ruby_lsp/response_builders/test_collection.rb +6 -10
  99. data/lib/ruby_lsp/ruby_document.rb +24 -62
  100. data/lib/ruby_lsp/scope.rb +7 -11
  101. data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
  102. data/lib/ruby_lsp/server.rb +147 -79
  103. data/lib/ruby_lsp/setup_bundler.rb +65 -60
  104. data/lib/ruby_lsp/static_docs.rb +11 -7
  105. data/lib/ruby_lsp/store.rb +24 -42
  106. data/lib/ruby_lsp/test_helper.rb +2 -12
  107. data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +164 -0
  108. data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +105 -0
  109. data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +94 -0
  110. data/lib/ruby_lsp/type_inferrer.rb +13 -14
  111. data/lib/ruby_lsp/utils.rb +49 -83
  112. metadata +9 -3
@@ -3,48 +3,34 @@
3
3
 
4
4
  module RubyIndexer
5
5
  class DeclarationListener
6
- extend T::Sig
6
+ OBJECT_NESTING = ["Object"].freeze #: Array[String]
7
+ BASIC_OBJECT_NESTING = ["BasicObject"].freeze #: Array[String]
7
8
 
8
- OBJECT_NESTING = T.let(["Object"].freeze, T::Array[String])
9
- BASIC_OBJECT_NESTING = T.let(["BasicObject"].freeze, T::Array[String])
10
-
11
- sig { returns(T::Array[String]) }
9
+ #: Array[String]
12
10
  attr_reader :indexing_errors
13
11
 
14
- sig do
15
- params(
16
- index: Index,
17
- dispatcher: Prism::Dispatcher,
18
- parse_result: Prism::ParseResult,
19
- uri: URI::Generic,
20
- collect_comments: T::Boolean,
21
- ).void
22
- end
12
+ #: (Index index, Prism::Dispatcher dispatcher, Prism::ParseResult parse_result, URI::Generic uri, ?collect_comments: bool) -> void
23
13
  def initialize(index, dispatcher, parse_result, uri, collect_comments: false)
24
14
  @index = index
25
15
  @uri = uri
26
- @enhancements = T.let(Enhancement.all(self), T::Array[Enhancement])
27
- @visibility_stack = T.let([VisibilityScope.public_scope], T::Array[VisibilityScope])
28
- @comments_by_line = T.let(
29
- parse_result.comments.to_h do |c|
30
- [c.location.start_line, c]
31
- end,
32
- T::Hash[Integer, Prism::Comment],
33
- )
34
- @inside_def = T.let(false, T::Boolean)
35
- @code_units_cache = T.let(
36
- parse_result.code_units_cache(@index.configuration.encoding),
37
- T.any(T.proc.params(arg0: Integer).returns(Integer), Prism::CodeUnitsCache),
38
- )
39
- @source_lines = T.let(parse_result.source.lines, T::Array[String])
16
+ @enhancements = Enhancement.all(self) #: Array[Enhancement]
17
+ @visibility_stack = [VisibilityScope.public_scope] #: Array[VisibilityScope]
18
+ @comments_by_line = parse_result.comments.to_h do |c|
19
+ [c.location.start_line, c]
20
+ end #: Hash[Integer, Prism::Comment]
21
+ @inside_def = false #: bool
22
+ @code_units_cache = parse_result
23
+ .code_units_cache(@index.configuration.encoding) #: (^(Integer arg0) -> Integer | Prism::CodeUnitsCache)
24
+
25
+ @source_lines = parse_result.source.lines #: Array[String]
40
26
 
41
27
  # The nesting stack we're currently inside. Used to determine the fully qualified name of constants, but only
42
28
  # stored by unresolved aliases which need the original nesting to be lazily resolved
43
- @stack = T.let([], T::Array[String])
29
+ @stack = [] #: Array[String]
44
30
 
45
31
  # A stack of namespace entries that represent where we currently are. Used to properly assign methods to an owner
46
- @owner_stack = T.let([], T::Array[Entry::Namespace])
47
- @indexing_errors = T.let([], T::Array[String])
32
+ @owner_stack = [] #: Array[Entry::Namespace]
33
+ @indexing_errors = [] #: Array[String]
48
34
  @collect_comments = collect_comments
49
35
 
50
36
  dispatcher.register(
@@ -87,7 +73,7 @@ module RubyIndexer
87
73
  )
88
74
  end
89
75
 
90
- sig { params(node: Prism::ClassNode).void }
76
+ #: (Prism::ClassNode node) -> void
91
77
  def on_class_node_enter(node)
92
78
  constant_path = node.constant_path
93
79
  superclass = node.superclass
@@ -119,23 +105,23 @@ module RubyIndexer
119
105
  )
120
106
  end
121
107
 
122
- sig { params(node: Prism::ClassNode).void }
108
+ #: (Prism::ClassNode node) -> void
123
109
  def on_class_node_leave(node)
124
110
  pop_namespace_stack
125
111
  end
126
112
 
127
- sig { params(node: Prism::ModuleNode).void }
113
+ #: (Prism::ModuleNode node) -> void
128
114
  def on_module_node_enter(node)
129
115
  constant_path = node.constant_path
130
116
  add_module(constant_path.slice, node.location, constant_path.location, comments: collect_comments(node))
131
117
  end
132
118
 
133
- sig { params(node: Prism::ModuleNode).void }
119
+ #: (Prism::ModuleNode node) -> void
134
120
  def on_module_node_leave(node)
135
121
  pop_namespace_stack
136
122
  end
137
123
 
138
- sig { params(node: Prism::SingletonClassNode).void }
124
+ #: (Prism::SingletonClassNode node) -> void
139
125
  def on_singleton_class_node_enter(node)
140
126
  @visibility_stack.push(VisibilityScope.public_scope)
141
127
 
@@ -149,7 +135,7 @@ module RubyIndexer
149
135
  existing_entries = T.cast(@index[real_nesting.join("::")], T.nilable(T::Array[Entry::SingletonClass]))
150
136
 
151
137
  if existing_entries
152
- entry = T.must(existing_entries.first)
138
+ entry = existing_entries.first #: as !nil
153
139
  entry.update_singleton_information(
154
140
  Location.from_prism_location(node.location, @code_units_cache),
155
141
  Location.from_prism_location(expression.location, @code_units_cache),
@@ -172,12 +158,12 @@ module RubyIndexer
172
158
  end
173
159
  end
174
160
 
175
- sig { params(node: Prism::SingletonClassNode).void }
161
+ #: (Prism::SingletonClassNode node) -> void
176
162
  def on_singleton_class_node_leave(node)
177
163
  pop_namespace_stack
178
164
  end
179
165
 
180
- sig { params(node: Prism::MultiWriteNode).void }
166
+ #: (Prism::MultiWriteNode node) -> void
181
167
  def on_multi_write_node_enter(node)
182
168
  value = node.value
183
169
  values = value.is_a?(Prism::ArrayNode) && value.opening_loc ? value.elements : []
@@ -197,7 +183,7 @@ module RubyIndexer
197
183
  end
198
184
  end
199
185
 
200
- sig { params(node: Prism::ConstantPathWriteNode).void }
186
+ #: (Prism::ConstantPathWriteNode node) -> void
201
187
  def on_constant_path_write_node_enter(node)
202
188
  # ignore variable constants like `var::FOO` or `self.class::FOO`
203
189
  target = node.target
@@ -207,7 +193,7 @@ module RubyIndexer
207
193
  add_constant(node, name)
208
194
  end
209
195
 
210
- sig { params(node: Prism::ConstantPathOrWriteNode).void }
196
+ #: (Prism::ConstantPathOrWriteNode node) -> void
211
197
  def on_constant_path_or_write_node_enter(node)
212
198
  # ignore variable constants like `var::FOO` or `self.class::FOO`
213
199
  target = node.target
@@ -217,7 +203,7 @@ module RubyIndexer
217
203
  add_constant(node, name)
218
204
  end
219
205
 
220
- sig { params(node: Prism::ConstantPathOperatorWriteNode).void }
206
+ #: (Prism::ConstantPathOperatorWriteNode node) -> void
221
207
  def on_constant_path_operator_write_node_enter(node)
222
208
  # ignore variable constants like `var::FOO` or `self.class::FOO`
223
209
  target = node.target
@@ -227,7 +213,7 @@ module RubyIndexer
227
213
  add_constant(node, name)
228
214
  end
229
215
 
230
- sig { params(node: Prism::ConstantPathAndWriteNode).void }
216
+ #: (Prism::ConstantPathAndWriteNode node) -> void
231
217
  def on_constant_path_and_write_node_enter(node)
232
218
  # ignore variable constants like `var::FOO` or `self.class::FOO`
233
219
  target = node.target
@@ -237,31 +223,31 @@ module RubyIndexer
237
223
  add_constant(node, name)
238
224
  end
239
225
 
240
- sig { params(node: Prism::ConstantWriteNode).void }
226
+ #: (Prism::ConstantWriteNode node) -> void
241
227
  def on_constant_write_node_enter(node)
242
228
  name = fully_qualify_name(node.name.to_s)
243
229
  add_constant(node, name)
244
230
  end
245
231
 
246
- sig { params(node: Prism::ConstantOrWriteNode).void }
232
+ #: (Prism::ConstantOrWriteNode node) -> void
247
233
  def on_constant_or_write_node_enter(node)
248
234
  name = fully_qualify_name(node.name.to_s)
249
235
  add_constant(node, name)
250
236
  end
251
237
 
252
- sig { params(node: Prism::ConstantAndWriteNode).void }
238
+ #: (Prism::ConstantAndWriteNode node) -> void
253
239
  def on_constant_and_write_node_enter(node)
254
240
  name = fully_qualify_name(node.name.to_s)
255
241
  add_constant(node, name)
256
242
  end
257
243
 
258
- sig { params(node: Prism::ConstantOperatorWriteNode).void }
244
+ #: (Prism::ConstantOperatorWriteNode node) -> void
259
245
  def on_constant_operator_write_node_enter(node)
260
246
  name = fully_qualify_name(node.name.to_s)
261
247
  add_constant(node, name)
262
248
  end
263
249
 
264
- sig { params(node: Prism::CallNode).void }
250
+ #: (Prism::CallNode node) -> void
265
251
  def on_call_node_enter(node)
266
252
  message = node.name
267
253
 
@@ -279,11 +265,11 @@ module RubyIndexer
279
265
  when :include, :prepend, :extend
280
266
  handle_module_operation(node, message)
281
267
  when :public
282
- @visibility_stack.push(VisibilityScope.public_scope)
268
+ handle_visibility_change(node, Entry::Visibility::PUBLIC)
283
269
  when :protected
284
- @visibility_stack.push(VisibilityScope.new(visibility: Entry::Visibility::PROTECTED))
270
+ handle_visibility_change(node, Entry::Visibility::PROTECTED)
285
271
  when :private
286
- @visibility_stack.push(VisibilityScope.new(visibility: Entry::Visibility::PRIVATE))
272
+ handle_visibility_change(node, Entry::Visibility::PRIVATE)
287
273
  when :module_function
288
274
  handle_module_function(node)
289
275
  when :private_class_method
@@ -299,7 +285,7 @@ module RubyIndexer
299
285
  end
300
286
  end
301
287
 
302
- sig { params(node: Prism::CallNode).void }
288
+ #: (Prism::CallNode node) -> void
303
289
  def on_call_node_leave(node)
304
290
  message = node.name
305
291
  case message
@@ -320,7 +306,7 @@ module RubyIndexer
320
306
  end
321
307
  end
322
308
 
323
- sig { params(node: Prism::DefNode).void }
309
+ #: (Prism::DefNode node) -> void
324
310
  def on_def_node_enter(node)
325
311
  owner = @owner_stack.last
326
312
  return unless owner
@@ -379,7 +365,7 @@ module RubyIndexer
379
365
  end
380
366
  end
381
367
 
382
- sig { params(node: Prism::DefNode).void }
368
+ #: (Prism::DefNode node) -> void
383
369
  def on_def_node_leave(node)
384
370
  @inside_def = false
385
371
 
@@ -388,57 +374,57 @@ module RubyIndexer
388
374
  end
389
375
  end
390
376
 
391
- sig { params(node: Prism::GlobalVariableAndWriteNode).void }
377
+ #: (Prism::GlobalVariableAndWriteNode node) -> void
392
378
  def on_global_variable_and_write_node_enter(node)
393
379
  handle_global_variable(node, node.name_loc)
394
380
  end
395
381
 
396
- sig { params(node: Prism::GlobalVariableOperatorWriteNode).void }
382
+ #: (Prism::GlobalVariableOperatorWriteNode node) -> void
397
383
  def on_global_variable_operator_write_node_enter(node)
398
384
  handle_global_variable(node, node.name_loc)
399
385
  end
400
386
 
401
- sig { params(node: Prism::GlobalVariableOrWriteNode).void }
387
+ #: (Prism::GlobalVariableOrWriteNode node) -> void
402
388
  def on_global_variable_or_write_node_enter(node)
403
389
  handle_global_variable(node, node.name_loc)
404
390
  end
405
391
 
406
- sig { params(node: Prism::GlobalVariableTargetNode).void }
392
+ #: (Prism::GlobalVariableTargetNode node) -> void
407
393
  def on_global_variable_target_node_enter(node)
408
394
  handle_global_variable(node, node.location)
409
395
  end
410
396
 
411
- sig { params(node: Prism::GlobalVariableWriteNode).void }
397
+ #: (Prism::GlobalVariableWriteNode node) -> void
412
398
  def on_global_variable_write_node_enter(node)
413
399
  handle_global_variable(node, node.name_loc)
414
400
  end
415
401
 
416
- sig { params(node: Prism::InstanceVariableWriteNode).void }
402
+ #: (Prism::InstanceVariableWriteNode node) -> void
417
403
  def on_instance_variable_write_node_enter(node)
418
404
  handle_instance_variable(node, node.name_loc)
419
405
  end
420
406
 
421
- sig { params(node: Prism::InstanceVariableAndWriteNode).void }
407
+ #: (Prism::InstanceVariableAndWriteNode node) -> void
422
408
  def on_instance_variable_and_write_node_enter(node)
423
409
  handle_instance_variable(node, node.name_loc)
424
410
  end
425
411
 
426
- sig { params(node: Prism::InstanceVariableOperatorWriteNode).void }
412
+ #: (Prism::InstanceVariableOperatorWriteNode node) -> void
427
413
  def on_instance_variable_operator_write_node_enter(node)
428
414
  handle_instance_variable(node, node.name_loc)
429
415
  end
430
416
 
431
- sig { params(node: Prism::InstanceVariableOrWriteNode).void }
417
+ #: (Prism::InstanceVariableOrWriteNode node) -> void
432
418
  def on_instance_variable_or_write_node_enter(node)
433
419
  handle_instance_variable(node, node.name_loc)
434
420
  end
435
421
 
436
- sig { params(node: Prism::InstanceVariableTargetNode).void }
422
+ #: (Prism::InstanceVariableTargetNode node) -> void
437
423
  def on_instance_variable_target_node_enter(node)
438
424
  handle_instance_variable(node, node.location)
439
425
  end
440
426
 
441
- sig { params(node: Prism::AliasMethodNode).void }
427
+ #: (Prism::AliasMethodNode node) -> void
442
428
  def on_alias_method_node_enter(node)
443
429
  method_name = node.new_name.slice
444
430
  comments = collect_comments(node)
@@ -454,40 +440,32 @@ module RubyIndexer
454
440
  )
455
441
  end
456
442
 
457
- sig { params(node: Prism::ClassVariableAndWriteNode).void }
443
+ #: (Prism::ClassVariableAndWriteNode node) -> void
458
444
  def on_class_variable_and_write_node_enter(node)
459
445
  handle_class_variable(node, node.name_loc)
460
446
  end
461
447
 
462
- sig { params(node: Prism::ClassVariableOperatorWriteNode).void }
448
+ #: (Prism::ClassVariableOperatorWriteNode node) -> void
463
449
  def on_class_variable_operator_write_node_enter(node)
464
450
  handle_class_variable(node, node.name_loc)
465
451
  end
466
452
 
467
- sig { params(node: Prism::ClassVariableOrWriteNode).void }
453
+ #: (Prism::ClassVariableOrWriteNode node) -> void
468
454
  def on_class_variable_or_write_node_enter(node)
469
455
  handle_class_variable(node, node.name_loc)
470
456
  end
471
457
 
472
- sig { params(node: Prism::ClassVariableTargetNode).void }
458
+ #: (Prism::ClassVariableTargetNode node) -> void
473
459
  def on_class_variable_target_node_enter(node)
474
460
  handle_class_variable(node, node.location)
475
461
  end
476
462
 
477
- sig { params(node: Prism::ClassVariableWriteNode).void }
463
+ #: (Prism::ClassVariableWriteNode node) -> void
478
464
  def on_class_variable_write_node_enter(node)
479
465
  handle_class_variable(node, node.name_loc)
480
466
  end
481
467
 
482
- sig do
483
- params(
484
- name: String,
485
- node_location: Prism::Location,
486
- signatures: T::Array[Entry::Signature],
487
- visibility: Entry::Visibility,
488
- comments: T.nilable(String),
489
- ).void
490
- end
468
+ #: (String name, Prism::Location node_location, Array[Entry::Signature] signatures, ?visibility: Entry::Visibility, ?comments: String?) -> void
491
469
  def add_method(name, node_location, signatures, visibility: Entry::Visibility::PUBLIC, comments: nil)
492
470
  location = Location.from_prism_location(node_location, @code_units_cache)
493
471
 
@@ -503,14 +481,7 @@ module RubyIndexer
503
481
  ))
504
482
  end
505
483
 
506
- sig do
507
- params(
508
- name: String,
509
- full_location: Prism::Location,
510
- name_location: Prism::Location,
511
- comments: T.nilable(String),
512
- ).void
513
- end
484
+ #: (String name, Prism::Location full_location, Prism::Location name_location, ?comments: String?) -> void
514
485
  def add_module(name, full_location, name_location, comments: nil)
515
486
  location = Location.from_prism_location(full_location, @code_units_cache)
516
487
  name_loc = Location.from_prism_location(name_location, @code_units_cache)
@@ -526,15 +497,7 @@ module RubyIndexer
526
497
  advance_namespace_stack(name, entry)
527
498
  end
528
499
 
529
- sig do
530
- params(
531
- name_or_nesting: T.any(String, T::Array[String]),
532
- full_location: Prism::Location,
533
- name_location: Prism::Location,
534
- parent_class_name: T.nilable(String),
535
- comments: T.nilable(String),
536
- ).void
537
- end
500
+ #: ((String | Array[String]) name_or_nesting, Prism::Location full_location, Prism::Location name_location, ?parent_class_name: String?, ?comments: String?) -> void
538
501
  def add_class(name_or_nesting, full_location, name_location, parent_class_name: nil, comments: nil)
539
502
  nesting = name_or_nesting.is_a?(Array) ? name_or_nesting : Index.actual_nesting(@stack, name_or_nesting)
540
503
  entry = Entry::Class.new(
@@ -546,10 +509,13 @@ module RubyIndexer
546
509
  parent_class_name,
547
510
  )
548
511
 
549
- advance_namespace_stack(T.must(nesting.last), entry)
512
+ advance_namespace_stack(
513
+ nesting.last, #: as !nil
514
+ entry,
515
+ )
550
516
  end
551
517
 
552
- sig { params(block: T.proc.params(index: Index, base: Entry::Namespace).void).void }
518
+ #: { (Index index, Entry::Namespace base) -> void } -> void
553
519
  def register_included_hook(&block)
554
520
  owner = @owner_stack.last
555
521
  return unless owner
@@ -559,32 +525,21 @@ module RubyIndexer
559
525
  end
560
526
  end
561
527
 
562
- sig { void }
528
+ #: -> void
563
529
  def pop_namespace_stack
564
530
  @stack.pop
565
531
  @owner_stack.pop
566
532
  @visibility_stack.pop
567
533
  end
568
534
 
569
- sig { returns(T.nilable(Entry::Namespace)) }
535
+ #: -> Entry::Namespace?
570
536
  def current_owner
571
537
  @owner_stack.last
572
538
  end
573
539
 
574
540
  private
575
541
 
576
- sig do
577
- params(
578
- node: T.any(
579
- Prism::GlobalVariableAndWriteNode,
580
- Prism::GlobalVariableOperatorWriteNode,
581
- Prism::GlobalVariableOrWriteNode,
582
- Prism::GlobalVariableTargetNode,
583
- Prism::GlobalVariableWriteNode,
584
- ),
585
- loc: Prism::Location,
586
- ).void
587
- end
542
+ #: ((Prism::GlobalVariableAndWriteNode | Prism::GlobalVariableOperatorWriteNode | Prism::GlobalVariableOrWriteNode | Prism::GlobalVariableTargetNode | Prism::GlobalVariableWriteNode) node, Prism::Location loc) -> void
588
543
  def handle_global_variable(node, loc)
589
544
  name = node.name.to_s
590
545
  comments = collect_comments(node)
@@ -597,18 +552,7 @@ module RubyIndexer
597
552
  ))
598
553
  end
599
554
 
600
- sig do
601
- params(
602
- node: T.any(
603
- Prism::ClassVariableAndWriteNode,
604
- Prism::ClassVariableOperatorWriteNode,
605
- Prism::ClassVariableOrWriteNode,
606
- Prism::ClassVariableTargetNode,
607
- Prism::ClassVariableWriteNode,
608
- ),
609
- loc: Prism::Location,
610
- ).void
611
- end
555
+ #: ((Prism::ClassVariableAndWriteNode | Prism::ClassVariableOperatorWriteNode | Prism::ClassVariableOrWriteNode | Prism::ClassVariableTargetNode | Prism::ClassVariableWriteNode) node, Prism::Location loc) -> void
612
556
  def handle_class_variable(node, loc)
613
557
  name = node.name.to_s
614
558
  # Ignore incomplete class variable names, which aren't valid Ruby syntax.
@@ -633,18 +577,7 @@ module RubyIndexer
633
577
  ))
634
578
  end
635
579
 
636
- sig do
637
- params(
638
- node: T.any(
639
- Prism::InstanceVariableAndWriteNode,
640
- Prism::InstanceVariableOperatorWriteNode,
641
- Prism::InstanceVariableOrWriteNode,
642
- Prism::InstanceVariableTargetNode,
643
- Prism::InstanceVariableWriteNode,
644
- ),
645
- loc: Prism::Location,
646
- ).void
647
- end
580
+ #: ((Prism::InstanceVariableAndWriteNode | Prism::InstanceVariableOperatorWriteNode | Prism::InstanceVariableOrWriteNode | Prism::InstanceVariableTargetNode | Prism::InstanceVariableWriteNode) node, Prism::Location loc) -> void
648
581
  def handle_instance_variable(node, loc)
649
582
  name = node.name.to_s
650
583
  return if name == "@"
@@ -666,7 +599,7 @@ module RubyIndexer
666
599
  ))
667
600
  end
668
601
 
669
- sig { params(node: Prism::CallNode).void }
602
+ #: (Prism::CallNode node) -> void
670
603
  def handle_private_constant(node)
671
604
  arguments = node.arguments&.arguments
672
605
  return unless arguments
@@ -691,7 +624,7 @@ module RubyIndexer
691
624
  entries&.each { |entry| entry.visibility = Entry::Visibility::PRIVATE }
692
625
  end
693
626
 
694
- sig { params(node: Prism::CallNode).void }
627
+ #: (Prism::CallNode node) -> void
695
628
  def handle_alias_method(node)
696
629
  arguments = node.arguments&.arguments
697
630
  return unless arguments
@@ -730,24 +663,7 @@ module RubyIndexer
730
663
  )
731
664
  end
732
665
 
733
- sig do
734
- params(
735
- node: T.any(
736
- Prism::ConstantWriteNode,
737
- Prism::ConstantOrWriteNode,
738
- Prism::ConstantAndWriteNode,
739
- Prism::ConstantOperatorWriteNode,
740
- Prism::ConstantPathWriteNode,
741
- Prism::ConstantPathOrWriteNode,
742
- Prism::ConstantPathOperatorWriteNode,
743
- Prism::ConstantPathAndWriteNode,
744
- Prism::ConstantTargetNode,
745
- Prism::ConstantPathTargetNode,
746
- ),
747
- name: String,
748
- value: T.nilable(Prism::Node),
749
- ).void
750
- end
666
+ #: ((Prism::ConstantWriteNode | Prism::ConstantOrWriteNode | Prism::ConstantAndWriteNode | Prism::ConstantOperatorWriteNode | Prism::ConstantPathWriteNode | Prism::ConstantPathOrWriteNode | Prism::ConstantPathOperatorWriteNode | Prism::ConstantPathAndWriteNode | Prism::ConstantTargetNode | Prism::ConstantPathTargetNode) node, String name, ?Prism::Node? value) -> void
751
667
  def add_constant(node, name, value = nil)
752
668
  value = node.value unless node.is_a?(Prism::ConstantTargetNode) || node.is_a?(Prism::ConstantPathTargetNode)
753
669
  comments = collect_comments(node)
@@ -798,7 +714,7 @@ module RubyIndexer
798
714
  )
799
715
  end
800
716
 
801
- sig { params(node: Prism::Node).returns(T.nilable(String)) }
717
+ #: (Prism::Node node) -> String?
802
718
  def collect_comments(node)
803
719
  return unless @collect_comments
804
720
 
@@ -826,12 +742,12 @@ module RubyIndexer
826
742
  comments
827
743
  end
828
744
 
829
- sig { params(line: Integer).returns(T::Boolean) }
745
+ #: (Integer line) -> bool
830
746
  def comment_exists_at?(line)
831
747
  @comments_by_line.key?(line) || !@source_lines[line - 1].to_s.strip.empty?
832
748
  end
833
749
 
834
- sig { params(name: String).returns(String) }
750
+ #: (String name) -> String
835
751
  def fully_qualify_name(name)
836
752
  if @stack.empty? || name.start_with?("::")
837
753
  name
@@ -840,7 +756,7 @@ module RubyIndexer
840
756
  end.delete_prefix("::")
841
757
  end
842
758
 
843
- sig { params(node: Prism::CallNode, reader: T::Boolean, writer: T::Boolean).void }
759
+ #: (Prism::CallNode node, reader: bool, writer: bool) -> void
844
760
  def handle_attribute(node, reader:, writer:)
845
761
  arguments = node.arguments&.arguments
846
762
  return unless arguments
@@ -885,7 +801,7 @@ module RubyIndexer
885
801
  end
886
802
  end
887
803
 
888
- sig { params(node: Prism::CallNode, operation: Symbol).void }
804
+ #: (Prism::CallNode node, Symbol operation) -> void
889
805
  def handle_module_operation(node, operation)
890
806
  return if @inside_def
891
807
 
@@ -919,7 +835,7 @@ module RubyIndexer
919
835
  end
920
836
  end
921
837
 
922
- sig { params(node: Prism::CallNode).void }
838
+ #: (Prism::CallNode node) -> void
923
839
  def handle_module_function(node)
924
840
  # Invoking `module_function` in a class raises
925
841
  owner = @owner_stack.last
@@ -970,7 +886,7 @@ module RubyIndexer
970
886
  end
971
887
  end
972
888
 
973
- sig { params(node: Prism::CallNode).void }
889
+ #: (Prism::CallNode node) -> void
974
890
  def handle_private_class_method(node)
975
891
  arguments = node.arguments&.arguments
976
892
  return unless arguments
@@ -1012,12 +928,12 @@ module RubyIndexer
1012
928
  end
1013
929
  end
1014
930
 
1015
- sig { returns(VisibilityScope) }
931
+ #: -> VisibilityScope
1016
932
  def current_visibility_scope
1017
- T.must(@visibility_stack.last)
933
+ @visibility_stack.last #: as !nil
1018
934
  end
1019
935
 
1020
- sig { params(parameters_node: T.nilable(Prism::ParametersNode)).returns(T::Array[Entry::Parameter]) }
936
+ #: (Prism::ParametersNode? parameters_node) -> Array[Entry::Parameter]
1021
937
  def list_params(parameters_node)
1022
938
  return [] unless parameters_node
1023
939
 
@@ -1079,7 +995,7 @@ module RubyIndexer
1079
995
  parameters
1080
996
  end
1081
997
 
1082
- sig { params(node: T.nilable(Prism::Node)).returns(T.nilable(Symbol)) }
998
+ #: (Prism::Node? node) -> Symbol?
1083
999
  def parameter_name(node)
1084
1000
  case node
1085
1001
  when Prism::RequiredParameterNode, Prism::OptionalParameterNode,
@@ -1104,7 +1020,7 @@ module RubyIndexer
1104
1020
  end
1105
1021
  end
1106
1022
 
1107
- sig { params(short_name: String, entry: Entry::Namespace).void }
1023
+ #: (String short_name, Entry::Namespace entry) -> void
1108
1024
  def advance_namespace_stack(short_name, entry)
1109
1025
  @visibility_stack.push(VisibilityScope.public_scope)
1110
1026
  @owner_stack << entry
@@ -1114,12 +1030,50 @@ module RubyIndexer
1114
1030
 
1115
1031
  # Returns the last name in the stack not as we found it, but in terms of declared constants. For example, if the
1116
1032
  # last entry in the stack is a compact namespace like `Foo::Bar`, then the last name is `Bar`
1117
- sig { returns(T.nilable(String)) }
1033
+ #: -> String?
1118
1034
  def last_name_in_stack
1119
1035
  name = @stack.last
1120
1036
  return unless name
1121
1037
 
1122
1038
  name.split("::").last
1123
1039
  end
1040
+
1041
+ #: (Prism::CallNode, Entry::Visibility) -> void
1042
+ def handle_visibility_change(node, visibility)
1043
+ owner = @owner_stack.last
1044
+ return unless owner
1045
+
1046
+ owner_name = owner.name
1047
+ method_names = string_or_symbol_argument_values(node)
1048
+
1049
+ if method_names.empty?
1050
+ @visibility_stack.push(VisibilityScope.new(visibility: visibility))
1051
+ return
1052
+ end
1053
+
1054
+ method_names.each do |method_name|
1055
+ entries = @index.resolve_method(method_name, owner_name)
1056
+ next unless entries
1057
+
1058
+ entries.each do |entry|
1059
+ entry.visibility = visibility
1060
+ end
1061
+ end
1062
+ end
1063
+
1064
+ #: (Prism::CallNode) -> Array[String]
1065
+ def string_or_symbol_argument_values(node)
1066
+ arguments = node.arguments&.arguments
1067
+ return [] unless arguments
1068
+
1069
+ arguments.filter_map do |argument|
1070
+ case argument
1071
+ when Prism::StringNode
1072
+ argument.content
1073
+ when Prism::SymbolNode
1074
+ argument.value
1075
+ end
1076
+ end
1077
+ end
1124
1078
  end
1125
1079
  end