ruby-lsp 0.19.0 → 0.20.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/exe/ruby-lsp-check +1 -1
  4. data/lib/core_ext/uri.rb +2 -2
  5. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +85 -36
  6. data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +5 -1
  7. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +46 -98
  8. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +7 -6
  9. data/lib/ruby_indexer/lib/ruby_indexer/location.rb +22 -0
  10. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +20 -5
  11. data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +76 -14
  12. data/lib/ruby_indexer/test/classes_and_modules_test.rb +12 -0
  13. data/lib/ruby_indexer/test/enhancements_test.rb +5 -7
  14. data/lib/ruby_indexer/test/global_variable_test.rb +49 -0
  15. data/lib/ruby_indexer/test/index_test.rb +3 -0
  16. data/lib/ruby_indexer/test/rbs_indexer_test.rb +14 -0
  17. data/lib/ruby_indexer/test/reference_finder_test.rb +162 -6
  18. data/lib/ruby_lsp/erb_document.rb +20 -2
  19. data/lib/ruby_lsp/internal.rb +3 -1
  20. data/lib/ruby_lsp/listeners/definition.rb +20 -0
  21. data/lib/ruby_lsp/listeners/folding_ranges.rb +3 -3
  22. data/lib/ruby_lsp/requests/code_action_resolve.rb +16 -4
  23. data/lib/ruby_lsp/requests/completion.rb +1 -0
  24. data/lib/ruby_lsp/requests/definition.rb +2 -0
  25. data/lib/ruby_lsp/requests/document_highlight.rb +5 -1
  26. data/lib/ruby_lsp/requests/hover.rb +1 -0
  27. data/lib/ruby_lsp/requests/range_formatting.rb +57 -0
  28. data/lib/ruby_lsp/requests/references.rb +146 -0
  29. data/lib/ruby_lsp/requests/rename.rb +16 -9
  30. data/lib/ruby_lsp/requests/semantic_highlighting.rb +1 -1
  31. data/lib/ruby_lsp/requests/signature_help.rb +6 -1
  32. data/lib/ruby_lsp/requests/support/common.rb +1 -1
  33. data/lib/ruby_lsp/requests/support/formatter.rb +3 -0
  34. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +6 -0
  35. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +6 -6
  36. data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +8 -0
  37. data/lib/ruby_lsp/response_builders/document_symbol.rb +2 -2
  38. data/lib/ruby_lsp/response_builders/hover.rb +2 -2
  39. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +14 -8
  40. data/lib/ruby_lsp/response_builders/signature_help.rb +2 -2
  41. data/lib/ruby_lsp/ruby_document.rb +44 -8
  42. data/lib/ruby_lsp/server.rb +63 -2
  43. data/lib/ruby_lsp/type_inferrer.rb +1 -1
  44. metadata +8 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1d89f4c5d5724a4b8c17002986c64d9f3ea2951282e4a35d96d50b0dd699ba9
4
- data.tar.gz: f3513888e58fbde4a85d93a2ef58ae124e02c354729693ae5e928a66548cd058
3
+ metadata.gz: d43d431cf15d817d80ebb8564f90a748b871ad3c2c278482d4b1b5c831b7bcd2
4
+ data.tar.gz: 28ab582396723d582f7909ad277300430b6e14e6a281408be21a71f4d768930f
5
5
  SHA512:
6
- metadata.gz: 57b44fec7c55b57408e042a9c40fe900c2445aa9fefa811223aa3154f5a4e1e8b1d0f11cf306548b13653f3a61877bcb8d01df7beeadb4766f2094b27786653b
7
- data.tar.gz: cf769828221a3a1cb65e906b2b9c5c0c8fac8feee265e5f31b90fb96813f10a225798da1b3746165e11fd4591f7bd0620ab177233c2214d939986e22a1e3709b
6
+ metadata.gz: 73a87212da50592a6b201a5f21ea559de74fb12ed795428e06392a4375aa73015a103aedd56734b9b05a2f0a27fcb7366b16107ea9f1a080b3459e2eff1dcd88
7
+ data.tar.gz: 7ad77f3dccbabba9cb306c73ccefca4e84e9ff480bc0594d20a1c6e03727948119f7accefc522e5ed25d6de1d21fff03b18c704c7c8908b33eb92cfc5b2c665d
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.19.0
1
+ 0.20.0
data/exe/ruby-lsp-check CHANGED
@@ -32,7 +32,7 @@ files.each_with_index do |file, index|
32
32
  })
33
33
 
34
34
  result = server.pop_response
35
- errors[file] = result.message if result.is_a?(RubyLsp::Error)
35
+ errors[file] = result if result.is_a?(RubyLsp::Error)
36
36
  ensure
37
37
  server.process_message({ method: "textDocument/didClose", params: { textDocument: { uri: uri } } })
38
38
  server.pop_response
data/lib/core_ext/uri.rb CHANGED
@@ -3,6 +3,8 @@
3
3
 
4
4
  module URI
5
5
  class Generic
6
+ extend T::Sig
7
+
6
8
  # Avoid a deprecation warning with Ruby 3.4 where the default parser was changed to RFC3986.
7
9
  # This condition must remain even after support for 3.4 has been dropped for users that have
8
10
  # `uri` in their lockfile, decoupling it from the ruby version.
@@ -27,8 +29,6 @@ module URI
27
29
  end
28
30
  end
29
31
 
30
- extend T::Sig
31
-
32
32
  sig { returns(T.nilable(String)) }
33
33
  def to_standardized_path
34
34
  parsed_path = path
@@ -33,6 +33,10 @@ module RubyIndexer
33
33
  T::Hash[Integer, Prism::Comment],
34
34
  )
35
35
  @inside_def = T.let(false, T::Boolean)
36
+ @code_units_cache = T.let(
37
+ parse_result.code_units_cache(@index.configuration.encoding),
38
+ T.any(T.proc.params(arg0: Integer).returns(Integer), Prism::CodeUnitsCache),
39
+ )
36
40
 
37
41
  # The nesting stack we're currently inside. Used to determine the fully qualified name of constants, but only
38
42
  # stored by unresolved aliases which need the original nesting to be lazily resolved
@@ -65,6 +69,11 @@ module RubyIndexer
65
69
  :on_constant_or_write_node_enter,
66
70
  :on_constant_and_write_node_enter,
67
71
  :on_constant_operator_write_node_enter,
72
+ :on_global_variable_and_write_node_enter,
73
+ :on_global_variable_operator_write_node_enter,
74
+ :on_global_variable_or_write_node_enter,
75
+ :on_global_variable_target_node_enter,
76
+ :on_global_variable_write_node_enter,
68
77
  :on_instance_variable_write_node_enter,
69
78
  :on_instance_variable_and_write_node_enter,
70
79
  :on_instance_variable_operator_write_node_enter,
@@ -106,10 +115,9 @@ module RubyIndexer
106
115
  entry = Entry::Class.new(
107
116
  nesting,
108
117
  @file_path,
109
- node.location,
110
- constant_path.location,
118
+ Location.from_prism_location(node.location, @code_units_cache),
119
+ Location.from_prism_location(constant_path.location, @code_units_cache),
111
120
  comments,
112
- @index.configuration.encoding,
113
121
  parent_class,
114
122
  )
115
123
 
@@ -136,10 +144,9 @@ module RubyIndexer
136
144
  entry = Entry::Module.new(
137
145
  actual_nesting(name),
138
146
  @file_path,
139
- node.location,
140
- constant_path.location,
147
+ Location.from_prism_location(node.location, @code_units_cache),
148
+ Location.from_prism_location(constant_path.location, @code_units_cache),
141
149
  comments,
142
- @index.configuration.encoding,
143
150
  )
144
151
 
145
152
  @owner_stack << entry
@@ -170,19 +177,17 @@ module RubyIndexer
170
177
  if existing_entries
171
178
  entry = T.must(existing_entries.first)
172
179
  entry.update_singleton_information(
173
- node.location,
174
- expression.location,
180
+ Location.from_prism_location(node.location, @code_units_cache),
181
+ Location.from_prism_location(expression.location, @code_units_cache),
175
182
  collect_comments(node),
176
- @index.configuration.encoding,
177
183
  )
178
184
  else
179
185
  entry = Entry::SingletonClass.new(
180
186
  real_nesting,
181
187
  @file_path,
182
- node.location,
183
- expression.location,
188
+ Location.from_prism_location(node.location, @code_units_cache),
189
+ Location.from_prism_location(expression.location, @code_units_cache),
184
190
  collect_comments(node),
185
- @index.configuration.encoding,
186
191
  nil,
187
192
  )
188
193
  @index.add(entry, skip_prefix_tree: true)
@@ -310,7 +315,7 @@ module RubyIndexer
310
315
  end
311
316
 
312
317
  @enhancements.each do |enhancement|
313
- enhancement.on_call_node(@index, @owner_stack.last, node, @file_path)
318
+ enhancement.on_call_node(@index, @owner_stack.last, node, @file_path, @code_units_cache)
314
319
  rescue StandardError => e
315
320
  @indexing_errors << "Indexing error in #{@file_path} with '#{enhancement.class.name}' enhancement: #{e.message}"
316
321
  end
@@ -340,10 +345,9 @@ module RubyIndexer
340
345
  @index.add(Entry::Method.new(
341
346
  method_name,
342
347
  @file_path,
343
- node.location,
344
- node.name_loc,
348
+ Location.from_prism_location(node.location, @code_units_cache),
349
+ Location.from_prism_location(node.name_loc, @code_units_cache),
345
350
  comments,
346
- @index.configuration.encoding,
347
351
  [Entry::Signature.new(list_params(node.parameters))],
348
352
  current_visibility,
349
353
  @owner_stack.last,
@@ -357,10 +361,9 @@ module RubyIndexer
357
361
  @index.add(Entry::Method.new(
358
362
  method_name,
359
363
  @file_path,
360
- node.location,
361
- node.name_loc,
364
+ Location.from_prism_location(node.location, @code_units_cache),
365
+ Location.from_prism_location(node.name_loc, @code_units_cache),
362
366
  comments,
363
- @index.configuration.encoding,
364
367
  [Entry::Signature.new(list_params(node.parameters))],
365
368
  current_visibility,
366
369
  singleton,
@@ -382,6 +385,31 @@ module RubyIndexer
382
385
  end
383
386
  end
384
387
 
388
+ sig { params(node: Prism::GlobalVariableAndWriteNode).void }
389
+ def on_global_variable_and_write_node_enter(node)
390
+ handle_global_variable(node, node.name_loc)
391
+ end
392
+
393
+ sig { params(node: Prism::GlobalVariableOperatorWriteNode).void }
394
+ def on_global_variable_operator_write_node_enter(node)
395
+ handle_global_variable(node, node.name_loc)
396
+ end
397
+
398
+ sig { params(node: Prism::GlobalVariableOrWriteNode).void }
399
+ def on_global_variable_or_write_node_enter(node)
400
+ handle_global_variable(node, node.name_loc)
401
+ end
402
+
403
+ sig { params(node: Prism::GlobalVariableTargetNode).void }
404
+ def on_global_variable_target_node_enter(node)
405
+ handle_global_variable(node, node.location)
406
+ end
407
+
408
+ sig { params(node: Prism::GlobalVariableWriteNode).void }
409
+ def on_global_variable_write_node_enter(node)
410
+ handle_global_variable(node, node.name_loc)
411
+ end
412
+
385
413
  sig { params(node: Prism::InstanceVariableWriteNode).void }
386
414
  def on_instance_variable_write_node_enter(node)
387
415
  handle_instance_variable(node, node.name_loc)
@@ -417,15 +445,38 @@ module RubyIndexer
417
445
  node.old_name.slice,
418
446
  @owner_stack.last,
419
447
  @file_path,
420
- node.new_name.location,
448
+ Location.from_prism_location(node.new_name.location, @code_units_cache),
421
449
  comments,
422
- @index.configuration.encoding,
423
450
  ),
424
451
  )
425
452
  end
426
453
 
427
454
  private
428
455
 
456
+ sig do
457
+ params(
458
+ node: T.any(
459
+ Prism::GlobalVariableAndWriteNode,
460
+ Prism::GlobalVariableOperatorWriteNode,
461
+ Prism::GlobalVariableOrWriteNode,
462
+ Prism::GlobalVariableTargetNode,
463
+ Prism::GlobalVariableWriteNode,
464
+ ),
465
+ loc: Prism::Location,
466
+ ).void
467
+ end
468
+ def handle_global_variable(node, loc)
469
+ name = node.name.to_s
470
+ comments = collect_comments(node)
471
+
472
+ @index.add(Entry::GlobalVariable.new(
473
+ name,
474
+ @file_path,
475
+ Location.from_prism_location(loc, @code_units_cache),
476
+ comments,
477
+ ))
478
+ end
479
+
429
480
  sig do
430
481
  params(
431
482
  node: T.any(
@@ -453,9 +504,8 @@ module RubyIndexer
453
504
  @index.add(Entry::InstanceVariable.new(
454
505
  name,
455
506
  @file_path,
456
- loc,
507
+ Location.from_prism_location(loc, @code_units_cache),
457
508
  collect_comments(node),
458
- @index.configuration.encoding,
459
509
  owner,
460
510
  ))
461
511
  end
@@ -518,9 +568,8 @@ module RubyIndexer
518
568
  old_name_value,
519
569
  @owner_stack.last,
520
570
  @file_path,
521
- new_name.location,
571
+ Location.from_prism_location(new_name.location, @code_units_cache),
522
572
  comments,
523
- @index.configuration.encoding,
524
573
  ),
525
574
  )
526
575
  end
@@ -555,9 +604,8 @@ module RubyIndexer
555
604
  @stack.dup,
556
605
  name,
557
606
  @file_path,
558
- node.location,
607
+ Location.from_prism_location(node.location, @code_units_cache),
559
608
  comments,
560
- @index.configuration.encoding,
561
609
  )
562
610
  when Prism::ConstantWriteNode, Prism::ConstantAndWriteNode, Prism::ConstantOrWriteNode,
563
611
  Prism::ConstantOperatorWriteNode
@@ -569,9 +617,8 @@ module RubyIndexer
569
617
  @stack.dup,
570
618
  name,
571
619
  @file_path,
572
- node.location,
620
+ Location.from_prism_location(node.location, @code_units_cache),
573
621
  comments,
574
- @index.configuration.encoding,
575
622
  )
576
623
  when Prism::ConstantPathWriteNode, Prism::ConstantPathOrWriteNode, Prism::ConstantPathOperatorWriteNode,
577
624
  Prism::ConstantPathAndWriteNode
@@ -581,12 +628,16 @@ module RubyIndexer
581
628
  @stack.dup,
582
629
  name,
583
630
  @file_path,
584
- node.location,
631
+ Location.from_prism_location(node.location, @code_units_cache),
585
632
  comments,
586
- @index.configuration.encoding,
587
633
  )
588
634
  else
589
- Entry::Constant.new(name, @file_path, node.location, comments, @index.configuration.encoding)
635
+ Entry::Constant.new(
636
+ name,
637
+ @file_path,
638
+ Location.from_prism_location(node.location, @code_units_cache),
639
+ comments,
640
+ )
590
641
  end,
591
642
  )
592
643
  end
@@ -652,9 +703,8 @@ module RubyIndexer
652
703
  @index.add(Entry::Accessor.new(
653
704
  name,
654
705
  @file_path,
655
- loc,
706
+ Location.from_prism_location(loc, @code_units_cache),
656
707
  comments,
657
- @index.configuration.encoding,
658
708
  current_visibility,
659
709
  @owner_stack.last,
660
710
  ))
@@ -665,9 +715,8 @@ module RubyIndexer
665
715
  @index.add(Entry::Accessor.new(
666
716
  "#{name}=",
667
717
  @file_path,
668
- loc,
718
+ Location.from_prism_location(loc, @code_units_cache),
669
719
  comments,
670
- @index.configuration.encoding,
671
720
  current_visibility,
672
721
  @owner_stack.last,
673
722
  ))
@@ -19,8 +19,12 @@ module RubyIndexer
19
19
  owner: T.nilable(Entry::Namespace),
20
20
  node: Prism::CallNode,
21
21
  file_path: String,
22
+ code_units_cache: T.any(
23
+ T.proc.params(arg0: Integer).returns(Integer),
24
+ Prism::CodeUnitsCache,
25
+ ),
22
26
  ).void
23
27
  end
24
- def on_call_node(index, owner, node, file_path); end
28
+ def on_call_node(index, owner, node, file_path, code_units_cache); end
25
29
  end
26
30
  end
@@ -31,30 +31,16 @@ module RubyIndexer
31
31
  params(
32
32
  name: String,
33
33
  file_path: String,
34
- location: T.any(Prism::Location, RubyIndexer::Location),
34
+ location: Location,
35
35
  comments: T.nilable(String),
36
- encoding: Encoding,
37
36
  ).void
38
37
  end
39
- def initialize(name, file_path, location, comments, encoding)
38
+ def initialize(name, file_path, location, comments)
40
39
  @name = name
41
40
  @file_path = file_path
42
41
  @comments = comments
43
42
  @visibility = T.let(Visibility::PUBLIC, Visibility)
44
-
45
- @location = T.let(
46
- if location.is_a?(Prism::Location)
47
- Location.new(
48
- location.start_line,
49
- location.end_line,
50
- location.start_code_units_column(encoding),
51
- location.end_code_units_column(encoding),
52
- )
53
- else
54
- location
55
- end,
56
- RubyIndexer::Location,
57
- )
43
+ @location = location
58
44
  end
59
45
 
60
46
  sig { returns(T::Boolean) }
@@ -110,6 +96,10 @@ module RubyIndexer
110
96
  else
111
97
  ""
112
98
  end
99
+ rescue Errno::ENOENT
100
+ # If the file was deleted, but the entry hasn't been removed yet (could happen due to concurrency), then we do
101
+ # not want to fail. Just set the comments to an empty string
102
+ ""
113
103
  end
114
104
  end
115
105
 
@@ -148,32 +138,19 @@ module RubyIndexer
148
138
  params(
149
139
  nesting: T::Array[String],
150
140
  file_path: String,
151
- location: T.any(Prism::Location, RubyIndexer::Location),
152
- name_location: T.any(Prism::Location, Location),
141
+ location: Location,
142
+ name_location: Location,
153
143
  comments: T.nilable(String),
154
- encoding: Encoding,
155
144
  ).void
156
145
  end
157
- def initialize(nesting, file_path, location, name_location, comments, encoding) # rubocop:disable Metrics/ParameterLists
146
+ def initialize(nesting, file_path, location, name_location, comments)
158
147
  @name = T.let(nesting.join("::"), String)
159
148
  # The original nesting where this namespace was discovered
160
149
  @nesting = nesting
161
150
 
162
- super(@name, file_path, location, comments, encoding)
163
-
164
- @name_location = T.let(
165
- if name_location.is_a?(Prism::Location)
166
- Location.new(
167
- name_location.start_line,
168
- name_location.end_line,
169
- name_location.start_code_units_column(encoding),
170
- name_location.end_code_units_column(encoding),
171
- )
172
- else
173
- name_location
174
- end,
175
- RubyIndexer::Location,
176
- )
151
+ super(@name, file_path, location, comments)
152
+
153
+ @name_location = name_location
177
154
  end
178
155
 
179
156
  sig { returns(T::Array[String]) }
@@ -210,15 +187,14 @@ module RubyIndexer
210
187
  params(
211
188
  nesting: T::Array[String],
212
189
  file_path: String,
213
- location: T.any(Prism::Location, RubyIndexer::Location),
214
- name_location: T.any(Prism::Location, Location),
190
+ location: Location,
191
+ name_location: Location,
215
192
  comments: T.nilable(String),
216
- encoding: Encoding,
217
193
  parent_class: T.nilable(String),
218
194
  ).void
219
195
  end
220
- def initialize(nesting, file_path, location, name_location, comments, encoding, parent_class) # rubocop:disable Metrics/ParameterLists
221
- super(nesting, file_path, location, name_location, comments, encoding)
196
+ def initialize(nesting, file_path, location, name_location, comments, parent_class) # rubocop:disable Metrics/ParameterLists
197
+ super(nesting, file_path, location, name_location, comments)
222
198
  @parent_class = parent_class
223
199
  end
224
200
 
@@ -233,26 +209,14 @@ module RubyIndexer
233
209
 
234
210
  sig do
235
211
  params(
236
- location: Prism::Location,
237
- name_location: Prism::Location,
212
+ location: Location,
213
+ name_location: Location,
238
214
  comments: T.nilable(String),
239
- encoding: Encoding,
240
215
  ).void
241
216
  end
242
- def update_singleton_information(location, name_location, comments, encoding)
243
- # Create a new RubyIndexer::Location object from the Prism location
244
- @location = Location.new(
245
- location.start_line,
246
- location.end_line,
247
- location.start_code_units_column(encoding),
248
- location.end_code_units_column(encoding),
249
- )
250
- @name_location = Location.new(
251
- name_location.start_line,
252
- name_location.end_line,
253
- name_location.start_code_units_column(encoding),
254
- name_location.end_code_units_column(encoding),
255
- )
217
+ def update_singleton_information(location, name_location, comments)
218
+ @location = location
219
+ @name_location = name_location
256
220
  (@comments ||= +"") << comments if comments
257
221
  end
258
222
  end
@@ -369,15 +333,14 @@ module RubyIndexer
369
333
  params(
370
334
  name: String,
371
335
  file_path: String,
372
- location: T.any(Prism::Location, RubyIndexer::Location),
336
+ location: Location,
373
337
  comments: T.nilable(String),
374
- encoding: Encoding,
375
338
  visibility: Visibility,
376
339
  owner: T.nilable(Entry::Namespace),
377
340
  ).void
378
341
  end
379
- def initialize(name, file_path, location, comments, encoding, visibility, owner) # rubocop:disable Metrics/ParameterLists
380
- super(name, file_path, location, comments, encoding)
342
+ def initialize(name, file_path, location, comments, visibility, owner) # rubocop:disable Metrics/ParameterLists
343
+ super(name, file_path, location, comments)
381
344
  @visibility = visibility
382
345
  @owner = owner
383
346
  end
@@ -437,31 +400,18 @@ module RubyIndexer
437
400
  params(
438
401
  name: String,
439
402
  file_path: String,
440
- location: T.any(Prism::Location, RubyIndexer::Location),
441
- name_location: T.any(Prism::Location, Location),
403
+ location: Location,
404
+ name_location: Location,
442
405
  comments: T.nilable(String),
443
- encoding: Encoding,
444
406
  signatures: T::Array[Signature],
445
407
  visibility: Visibility,
446
408
  owner: T.nilable(Entry::Namespace),
447
409
  ).void
448
410
  end
449
- def initialize(name, file_path, location, name_location, comments, encoding, signatures, visibility, owner) # rubocop:disable Metrics/ParameterLists
450
- super(name, file_path, location, comments, encoding, visibility, owner)
411
+ def initialize(name, file_path, location, name_location, comments, signatures, visibility, owner) # rubocop:disable Metrics/ParameterLists
412
+ super(name, file_path, location, comments, visibility, owner)
451
413
  @signatures = signatures
452
- @name_location = T.let(
453
- if name_location.is_a?(Prism::Location)
454
- Location.new(
455
- name_location.start_line,
456
- name_location.end_line,
457
- name_location.start_code_units_column(encoding),
458
- name_location.end_code_units_column(encoding),
459
- )
460
- else
461
- name_location
462
- end,
463
- RubyIndexer::Location,
464
- )
414
+ @name_location = name_location
465
415
  end
466
416
  end
467
417
 
@@ -490,13 +440,12 @@ module RubyIndexer
490
440
  nesting: T::Array[String],
491
441
  name: String,
492
442
  file_path: String,
493
- location: T.any(Prism::Location, RubyIndexer::Location),
443
+ location: Location,
494
444
  comments: T.nilable(String),
495
- encoding: Encoding,
496
445
  ).void
497
446
  end
498
- def initialize(target, nesting, name, file_path, location, comments, encoding) # rubocop:disable Metrics/ParameterLists
499
- super(name, file_path, location, comments, encoding)
447
+ def initialize(target, nesting, name, file_path, location, comments) # rubocop:disable Metrics/ParameterLists
448
+ super(name, file_path, location, comments)
500
449
 
501
450
  @target = target
502
451
  @nesting = nesting
@@ -510,14 +459,13 @@ module RubyIndexer
510
459
  sig { returns(String) }
511
460
  attr_reader :target
512
461
 
513
- sig { params(target: String, unresolved_alias: UnresolvedConstantAlias, encoding: Encoding).void }
514
- def initialize(target, unresolved_alias, encoding)
462
+ sig { params(target: String, unresolved_alias: UnresolvedConstantAlias).void }
463
+ def initialize(target, unresolved_alias)
515
464
  super(
516
465
  unresolved_alias.name,
517
466
  unresolved_alias.file_path,
518
467
  unresolved_alias.location,
519
468
  unresolved_alias.comments,
520
- encoding
521
469
  )
522
470
 
523
471
  @visibility = unresolved_alias.visibility
@@ -525,6 +473,9 @@ module RubyIndexer
525
473
  end
526
474
  end
527
475
 
476
+ # Represents a global variable e.g.: $DEBUG
477
+ class GlobalVariable < Entry; end
478
+
528
479
  # Represents an instance variable e.g.: @a = 1
529
480
  class InstanceVariable < Entry
530
481
  sig { returns(T.nilable(Entry::Namespace)) }
@@ -534,14 +485,13 @@ module RubyIndexer
534
485
  params(
535
486
  name: String,
536
487
  file_path: String,
537
- location: T.any(Prism::Location, RubyIndexer::Location),
488
+ location: Location,
538
489
  comments: T.nilable(String),
539
- encoding: Encoding,
540
490
  owner: T.nilable(Entry::Namespace),
541
491
  ).void
542
492
  end
543
- def initialize(name, file_path, location, comments, encoding, owner) # rubocop:disable Metrics/ParameterLists
544
- super(name, file_path, location, comments, encoding)
493
+ def initialize(name, file_path, location, comments, owner)
494
+ super(name, file_path, location, comments)
545
495
  @owner = owner
546
496
  end
547
497
  end
@@ -564,13 +514,12 @@ module RubyIndexer
564
514
  old_name: String,
565
515
  owner: T.nilable(Entry::Namespace),
566
516
  file_path: String,
567
- location: T.any(Prism::Location, RubyIndexer::Location),
517
+ location: Location,
568
518
  comments: T.nilable(String),
569
- encoding: Encoding,
570
519
  ).void
571
520
  end
572
- def initialize(new_name, old_name, owner, file_path, location, comments, encoding) # rubocop:disable Metrics/ParameterLists
573
- super(new_name, file_path, location, comments, encoding)
521
+ def initialize(new_name, old_name, owner, file_path, location, comments) # rubocop:disable Metrics/ParameterLists
522
+ super(new_name, file_path, location, comments)
574
523
 
575
524
  @new_name = new_name
576
525
  @old_name = old_name
@@ -589,9 +538,9 @@ module RubyIndexer
589
538
  attr_reader :owner
590
539
 
591
540
  sig do
592
- params(target: T.any(Member, MethodAlias), unresolved_alias: UnresolvedMethodAlias, encoding: Encoding).void
541
+ params(target: T.any(Member, MethodAlias), unresolved_alias: UnresolvedMethodAlias).void
593
542
  end
594
- def initialize(target, unresolved_alias, encoding)
543
+ def initialize(target, unresolved_alias)
595
544
  full_comments = +"Alias for #{target.name}\n"
596
545
  full_comments << "#{unresolved_alias.comments}\n"
597
546
  full_comments << target.comments
@@ -601,7 +550,6 @@ module RubyIndexer
601
550
  unresolved_alias.file_path,
602
551
  unresolved_alias.location,
603
552
  full_comments,
604
- encoding
605
553
  )
606
554
 
607
555
  @target = target
@@ -665,7 +665,6 @@ module RubyIndexer
665
665
  attached_ancestor.location,
666
666
  attached_ancestor.name_location,
667
667
  nil,
668
- @configuration.encoding,
669
668
  nil,
670
669
  )
671
670
  add(singleton, skip_prefix_tree: true)
@@ -677,11 +676,13 @@ module RubyIndexer
677
676
  sig do
678
677
  type_parameters(:T).params(
679
678
  path: String,
680
- type: T::Class[T.all(T.type_parameter(:T), Entry)],
681
- ).returns(T.nilable(T::Array[T.type_parameter(:T)]))
679
+ type: T.nilable(T::Class[T.all(T.type_parameter(:T), Entry)]),
680
+ ).returns(T.nilable(T.any(T::Array[Entry], T::Array[T.type_parameter(:T)])))
682
681
  end
683
- def entries_for(path, type)
682
+ def entries_for(path, type = nil)
684
683
  entries = @files_to_entries[path]
684
+ return entries unless type
685
+
685
686
  entries&.grep(type)
686
687
  end
687
688
 
@@ -857,7 +858,7 @@ module RubyIndexer
857
858
  return entry unless target
858
859
 
859
860
  target_name = T.must(target.first).name
860
- resolved_alias = Entry::ConstantAlias.new(target_name, entry, @configuration.encoding)
861
+ resolved_alias = Entry::ConstantAlias.new(target_name, entry)
861
862
 
862
863
  # Replace the UnresolvedAlias by a resolved one so that we don't have to do this again later
863
864
  original_entries = T.must(@entries[alias_name])
@@ -1048,7 +1049,7 @@ module RubyIndexer
1048
1049
  target_method_entries = resolve_method(entry.old_name, receiver_name, seen_names)
1049
1050
  return entry unless target_method_entries
1050
1051
 
1051
- resolved_alias = Entry::MethodAlias.new(T.must(target_method_entries.first), entry, @configuration.encoding)
1052
+ resolved_alias = Entry::MethodAlias.new(T.must(target_method_entries.first), entry)
1052
1053
  original_entries = T.must(@entries[new_name])
1053
1054
  original_entries.delete(entry)
1054
1055
  original_entries << resolved_alias
@@ -5,6 +5,28 @@ module RubyIndexer
5
5
  class Location
6
6
  extend T::Sig
7
7
 
8
+ class << self
9
+ extend T::Sig
10
+
11
+ sig do
12
+ params(
13
+ prism_location: Prism::Location,
14
+ code_units_cache: T.any(
15
+ T.proc.params(arg0: Integer).returns(Integer),
16
+ Prism::CodeUnitsCache,
17
+ ),
18
+ ).returns(T.attached_class)
19
+ end
20
+ def from_prism_location(prism_location, code_units_cache)
21
+ new(
22
+ prism_location.start_line,
23
+ prism_location.end_line,
24
+ prism_location.cached_start_code_units_column(code_units_cache),
25
+ prism_location.cached_end_code_units_column(code_units_cache),
26
+ )
27
+ end
28
+ end
29
+
8
30
  sig { returns(Integer) }
9
31
  attr_reader :start_line, :end_line, :start_column, :end_column
10
32