ruby-lsp 0.22.0 → 0.23.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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/exe/ruby-lsp +10 -9
  4. data/exe/ruby-lsp-check +5 -5
  5. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +26 -20
  6. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +131 -23
  7. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +60 -30
  8. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +73 -55
  9. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +16 -14
  10. data/lib/{core_ext → ruby_indexer/lib/ruby_indexer}/uri.rb +29 -3
  11. data/lib/ruby_indexer/ruby_indexer.rb +1 -1
  12. data/lib/ruby_indexer/test/class_variables_test.rb +140 -0
  13. data/lib/ruby_indexer/test/classes_and_modules_test.rb +11 -6
  14. data/lib/ruby_indexer/test/configuration_test.rb +116 -51
  15. data/lib/ruby_indexer/test/enhancements_test.rb +2 -2
  16. data/lib/ruby_indexer/test/index_test.rb +72 -43
  17. data/lib/ruby_indexer/test/method_test.rb +80 -0
  18. data/lib/ruby_indexer/test/rbs_indexer_test.rb +1 -1
  19. data/lib/ruby_indexer/test/reference_finder_test.rb +1 -1
  20. data/lib/ruby_indexer/test/test_case.rb +2 -2
  21. data/lib/ruby_indexer/test/uri_test.rb +72 -0
  22. data/lib/ruby_lsp/addon.rb +9 -0
  23. data/lib/ruby_lsp/base_server.rb +15 -6
  24. data/lib/ruby_lsp/document.rb +10 -1
  25. data/lib/ruby_lsp/global_state.rb +1 -1
  26. data/lib/ruby_lsp/internal.rb +1 -1
  27. data/lib/ruby_lsp/listeners/code_lens.rb +8 -4
  28. data/lib/ruby_lsp/listeners/completion.rb +73 -4
  29. data/lib/ruby_lsp/listeners/definition.rb +73 -17
  30. data/lib/ruby_lsp/listeners/document_symbol.rb +49 -5
  31. data/lib/ruby_lsp/listeners/folding_ranges.rb +1 -1
  32. data/lib/ruby_lsp/listeners/hover.rb +57 -0
  33. data/lib/ruby_lsp/requests/completion.rb +6 -0
  34. data/lib/ruby_lsp/requests/completion_resolve.rb +2 -1
  35. data/lib/ruby_lsp/requests/definition.rb +6 -0
  36. data/lib/ruby_lsp/requests/prepare_rename.rb +51 -0
  37. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +1 -1
  38. data/lib/ruby_lsp/requests/rename.rb +14 -4
  39. data/lib/ruby_lsp/requests/support/common.rb +1 -5
  40. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +1 -1
  41. data/lib/ruby_lsp/requests/workspace_symbol.rb +3 -2
  42. data/lib/ruby_lsp/scripts/compose_bundle.rb +1 -1
  43. data/lib/ruby_lsp/server.rb +42 -7
  44. data/lib/ruby_lsp/setup_bundler.rb +54 -46
  45. data/lib/ruby_lsp/test_helper.rb +45 -11
  46. data/lib/ruby_lsp/type_inferrer.rb +22 -0
  47. data/lib/ruby_lsp/utils.rb +3 -0
  48. metadata +7 -8
  49. data/lib/ruby_indexer/lib/ruby_indexer/indexable_path.rb +0 -29
@@ -71,6 +71,8 @@ module RubyLsp
71
71
  text_document_prepare_type_hierarchy(message)
72
72
  when "textDocument/rename"
73
73
  text_document_rename(message)
74
+ when "textDocument/prepareRename"
75
+ text_document_prepare_rename(message)
74
76
  when "textDocument/references"
75
77
  text_document_references(message)
76
78
  when "typeHierarchy/supertypes"
@@ -117,12 +119,24 @@ module RubyLsp
117
119
  # If a document is deleted before we are able to process all of its enqueued requests, we will try to read it
118
120
  # from disk and it raise this error. This is expected, so we don't include the `data` attribute to avoid
119
121
  # reporting these to our telemetry
120
- if e.is_a?(Store::NonExistingDocumentError)
122
+ case e
123
+ when Store::NonExistingDocumentError
121
124
  send_message(Error.new(
122
125
  id: message[:id],
123
126
  code: Constant::ErrorCodes::INVALID_PARAMS,
124
127
  message: e.full_message,
125
128
  ))
129
+ when Document::LocationNotFoundError
130
+ send_message(Error.new(
131
+ id: message[:id],
132
+ code: Constant::ErrorCodes::REQUEST_FAILED,
133
+ message: <<~MESSAGE,
134
+ Request #{message[:method]} failed to find the target position.
135
+ The file might have been modified while the server was in the middle of searching for the target.
136
+ If you experience this regularly, please report any findings and extra information on
137
+ https://github.com/Shopify/ruby-lsp/issues/2446
138
+ MESSAGE
139
+ ))
126
140
  else
127
141
  send_message(Error.new(
128
142
  id: message[:id],
@@ -237,6 +251,7 @@ module RubyLsp
237
251
  completion_provider = Requests::Completion.provider if enabled_features["completion"]
238
252
  signature_help_provider = Requests::SignatureHelp.provider if enabled_features["signatureHelp"]
239
253
  type_hierarchy_provider = Requests::PrepareTypeHierarchy.provider if enabled_features["typeHierarchy"]
254
+ rename_provider = Requests::Rename.provider unless @global_state.has_type_checker
240
255
 
241
256
  response = {
242
257
  capabilities: Interface::ServerCapabilities.new(
@@ -263,7 +278,7 @@ module RubyLsp
263
278
  workspace_symbol_provider: enabled_features["workspaceSymbol"] && !@global_state.has_type_checker,
264
279
  signature_help_provider: signature_help_provider,
265
280
  type_hierarchy_provider: type_hierarchy_provider,
266
- rename_provider: !@global_state.has_type_checker,
281
+ rename_provider: rename_provider,
267
282
  references_provider: !@global_state.has_type_checker,
268
283
  document_range_formatting_provider: true,
269
284
  experimental: {
@@ -727,6 +742,24 @@ module RubyLsp
727
742
  send_message(Error.new(id: message[:id], code: Constant::ErrorCodes::REQUEST_FAILED, message: e.message))
728
743
  end
729
744
 
745
+ sig { params(message: T::Hash[Symbol, T.untyped]).void }
746
+ def text_document_prepare_rename(message)
747
+ params = message[:params]
748
+ document = @store.get(params.dig(:textDocument, :uri))
749
+
750
+ unless document.is_a?(RubyDocument)
751
+ send_empty_response(message[:id])
752
+ return
753
+ end
754
+
755
+ send_message(
756
+ Result.new(
757
+ id: message[:id],
758
+ response: Requests::PrepareRename.new(document, params[:position]).perform,
759
+ ),
760
+ )
761
+ end
762
+
730
763
  sig { params(message: T::Hash[Symbol, T.untyped]).void }
731
764
  def text_document_references(message)
732
765
  params = message[:params]
@@ -981,15 +1014,17 @@ module RubyLsp
981
1014
  next unless file_path.end_with?(".rb")
982
1015
 
983
1016
  load_path_entry = $LOAD_PATH.find { |load_path| file_path.start_with?(load_path) }
984
- indexable = RubyIndexer::IndexablePath.new(load_path_entry, file_path)
1017
+ uri.add_require_path_from_load_entry(load_path_entry) if load_path_entry
1018
+
1019
+ content = File.read(file_path)
985
1020
 
986
1021
  case change[:type]
987
1022
  when Constant::FileChangeType::CREATED
988
- index.index_single(indexable)
1023
+ index.index_single(uri, content)
989
1024
  when Constant::FileChangeType::CHANGED
990
- index.handle_change(indexable)
1025
+ index.handle_change(uri, content)
991
1026
  when Constant::FileChangeType::DELETED
992
- index.delete(indexable)
1027
+ index.delete(uri)
993
1028
  end
994
1029
  end
995
1030
 
@@ -1088,7 +1123,7 @@ module RubyLsp
1088
1123
 
1089
1124
  sig { override.void }
1090
1125
  def shutdown
1091
- Addon.addons.each(&:deactivate)
1126
+ Addon.unload_addons
1092
1127
  end
1093
1128
 
1094
1129
  sig { void }
@@ -45,6 +45,9 @@ module RubyLsp
45
45
  )
46
46
  @lockfile = T.let(@gemfile ? Bundler.default_lockfile : nil, T.nilable(Pathname))
47
47
 
48
+ @gemfile_hash = T.let(@gemfile ? Digest::SHA256.hexdigest(@gemfile.read) : nil, T.nilable(String))
49
+ @lockfile_hash = T.let(@lockfile&.exist? ? Digest::SHA256.hexdigest(@lockfile.read) : nil, T.nilable(String))
50
+
48
51
  @gemfile_name = T.let(@gemfile&.basename&.to_s || "Gemfile", String)
49
52
 
50
53
  # Custom bundle paths
@@ -91,10 +94,8 @@ module RubyLsp
91
94
  return run_bundle_install(@custom_gemfile)
92
95
  end
93
96
 
94
- lockfile_contents = @lockfile.read
95
- current_lockfile_hash = Digest::SHA256.hexdigest(lockfile_contents)
96
-
97
- if @custom_lockfile.exist? && @lockfile_hash_path.exist? && @lockfile_hash_path.read == current_lockfile_hash
97
+ if @lockfile_hash && @custom_lockfile.exist? && @lockfile_hash_path.exist? &&
98
+ @lockfile_hash_path.read == @lockfile_hash
98
99
  $stderr.puts(
99
100
  "Ruby LSP> Skipping composed bundle setup since #{@custom_lockfile} already exists and is up to date",
100
101
  )
@@ -103,7 +104,7 @@ module RubyLsp
103
104
 
104
105
  FileUtils.cp(@lockfile.to_s, @custom_lockfile.to_s)
105
106
  correct_relative_remote_paths
106
- @lockfile_hash_path.write(current_lockfile_hash)
107
+ @lockfile_hash_path.write(@lockfile_hash)
107
108
  run_bundle_install(@custom_gemfile)
108
109
  end
109
110
 
@@ -151,7 +152,13 @@ module RubyLsp
151
152
  end
152
153
 
153
154
  unless @dependencies["debug"]
154
- parts << 'gem "debug", require: false, group: :development, platforms: :mri'
155
+ # The `mri` platform excludes Windows. We want to install the debug gem only on MRI for any operating system,
156
+ # but that constraint doesn't yet exist in Bundler. On Windows, we are manually checking if the engine is MRI
157
+ parts << if Gem.win_platform?
158
+ 'gem "debug", require: false, group: :development, install_if: -> { RUBY_ENGINE == "ruby" }'
159
+ else
160
+ 'gem "debug", require: false, group: :development, platforms: :mri'
161
+ end
155
162
  end
156
163
 
157
164
  if @rails_app && !@dependencies["ruby-lsp-rails"]
@@ -195,15 +202,15 @@ module RubyLsp
195
202
  env["BUNDLE_PATH"] = File.expand_path(env["BUNDLE_PATH"], @project_path)
196
203
  end
197
204
 
198
- return run_bundle_install_through_command(env) unless @launcher
199
-
200
- # This same check happens conditionally when running through the command. For invoking the CLI directly, it's
201
- # important that we ensure the Bundler version is set to avoid restarts
205
+ # Set the specific Bundler version used by the main app. This avoids issues with Bundler restarts, which clean the
206
+ # environment and lead to the `ruby-lsp` executable not being found
202
207
  if @bundler_version
203
208
  env["BUNDLER_VERSION"] = @bundler_version.to_s
204
209
  install_bundler_if_needed
205
210
  end
206
211
 
212
+ return run_bundle_install_through_command(env) unless @launcher
213
+
207
214
  begin
208
215
  run_bundle_install_directly(env)
209
216
  # If no error occurred, then clear previous errors
@@ -214,15 +221,36 @@ module RubyLsp
214
221
  @error_path.write(Marshal.dump(e))
215
222
  end
216
223
 
224
+ # If either the Gemfile or the lockfile have been modified during the process of setting up the bundle, retry
225
+ # composing the bundle from scratch
226
+
227
+ if @gemfile && @lockfile
228
+ current_gemfile_hash = Digest::SHA256.hexdigest(@gemfile.read)
229
+ current_lockfile_hash = Digest::SHA256.hexdigest(@lockfile.read)
230
+
231
+ if !@retry && (current_gemfile_hash != @gemfile_hash || current_lockfile_hash != @lockfile_hash)
232
+ @gemfile_hash = current_gemfile_hash
233
+ @lockfile_hash = current_lockfile_hash
234
+ @retry = true
235
+ @custom_dir.rmtree
236
+ $stderr.puts("Ruby LSP> Bundle was modified during setup. Retrying from scratch...")
237
+ return setup!
238
+ end
239
+ end
240
+
217
241
  env
218
242
  end
219
243
 
220
- sig { params(env: T::Hash[String, String]).returns(T::Hash[String, String]) }
221
- def run_bundle_install_directly(env)
244
+ sig { params(env: T::Hash[String, String], force_install: T::Boolean).returns(T::Hash[String, String]) }
245
+ def run_bundle_install_directly(env, force_install: false)
222
246
  RubyVM::YJIT.enable if defined?(RubyVM::YJIT.enable)
247
+
248
+ # The ENV can only be merged after checking if an update is required because we depend on the original value of
249
+ # ENV["BUNDLE_GEMFILE"], which gets overridden after the merge
250
+ should_update = should_bundle_update?
223
251
  T.unsafe(ENV).merge!(env)
224
252
 
225
- unless should_bundle_update?
253
+ unless should_update && !force_install
226
254
  Bundler::CLI::Install.new({}).run
227
255
  correct_relative_remote_paths if @custom_lockfile.exist?
228
256
  return env
@@ -237,12 +265,13 @@ module RubyLsp
237
265
  correct_relative_remote_paths if @custom_lockfile.exist?
238
266
  @last_updated_path.write(Time.now.iso8601)
239
267
  env
268
+ rescue Bundler::GemNotFound, Bundler::GitError
269
+ # If a gem is not installed, skip the upgrade and try to install it with a single retry
270
+ @retry ? env : run_bundle_install_directly(env, force_install: true)
240
271
  end
241
272
 
242
273
  sig { params(env: T::Hash[String, String]).returns(T::Hash[String, String]) }
243
274
  def run_bundle_install_through_command(env)
244
- base_bundle = base_bundle_command(env)
245
-
246
275
  # If `ruby-lsp` and `debug` (and potentially `ruby-lsp-rails`) are already in the Gemfile, then we shouldn't try
247
276
  # to upgrade them or else we'll produce undesired source control changes. If the composed bundle was just created
248
277
  # and any of `ruby-lsp`, `ruby-lsp-rails` or `debug` weren't a part of the Gemfile, then we need to run `bundle
@@ -251,13 +280,20 @@ module RubyLsp
251
280
 
252
281
  # When not updating, we run `(bundle check || bundle install)`
253
282
  # When updating, we run `((bundle check && bundle update ruby-lsp debug) || bundle install)`
254
- command = +"(#{base_bundle} check"
283
+ bundler_path = File.join(Gem.default_bindir, "bundle")
284
+ base_command = (File.exist?(bundler_path) ? "#{Gem.ruby} #{bundler_path}" : "bundle").dup
285
+
286
+ if env["BUNDLER_VERSION"]
287
+ base_command << " _#{env["BUNDLER_VERSION"]}_"
288
+ end
289
+
290
+ command = +"(#{base_command} check"
255
291
 
256
292
  if should_bundle_update?
257
293
  # If any of `ruby-lsp`, `ruby-lsp-rails` or `debug` are not in the Gemfile, try to update them to the latest
258
294
  # version
259
295
  command.prepend("(")
260
- command << " && #{base_bundle} update "
296
+ command << " && #{base_command} update "
261
297
  command << "ruby-lsp " unless @dependencies["ruby-lsp"]
262
298
  command << "debug " unless @dependencies["debug"]
263
299
  command << "ruby-lsp-rails " if @rails_app && !@dependencies["ruby-lsp-rails"]
@@ -267,7 +303,7 @@ module RubyLsp
267
303
  @last_updated_path.write(Time.now.iso8601)
268
304
  end
269
305
 
270
- command << " || #{base_bundle} install) "
306
+ command << " || #{base_command} install) "
271
307
 
272
308
  # Redirect stdout to stderr to prevent going into an infinite loop. The extension might confuse stdout output with
273
309
  # responses
@@ -377,34 +413,6 @@ module RubyLsp
377
413
  /class .* < (::)?Rails::Application/.match?(application_contents)
378
414
  end
379
415
 
380
- # Returns the base bundle command we should use for this project, which will be:
381
- # - `bundle` if there's no locked Bundler version and no `bin/bundle` binstub in the $PATH
382
- # - `bundle _<version>_` if there's a locked Bundler version
383
- # - `bin/bundle` if there's a `bin/bundle` binstub in the $PATH
384
- sig { params(env: T::Hash[String, String]).returns(String) }
385
- def base_bundle_command(env)
386
- path_parts = if Gem.win_platform?
387
- ENV["Path"] || ENV["PATH"] || ENV["path"] || ""
388
- else
389
- ENV["PATH"] || ""
390
- end.split(File::PATH_SEPARATOR)
391
-
392
- bin_dir = File.expand_path("bin", @project_path)
393
- bundle_binstub = File.join(@project_path, "bin", "bundle")
394
-
395
- if File.exist?(bundle_binstub) && path_parts.any? { |path| File.expand_path(path, @project_path) == bin_dir }
396
- return bundle_binstub
397
- end
398
-
399
- if @bundler_version
400
- env["BUNDLER_VERSION"] = @bundler_version.to_s
401
- install_bundler_if_needed
402
- return "bundle _#{@bundler_version}_"
403
- end
404
-
405
- "bundle"
406
- end
407
-
408
416
  sig { void }
409
417
  def patch_thor_to_print_progress_to_stderr!
410
418
  return unless defined?(Bundler::Thor::Shell::Basic)
@@ -1,11 +1,16 @@
1
- # typed: strict
1
+ # typed: true
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # NOTE: This module is intended to be used by addons for writing their own tests, so keep that in mind if changing.
5
5
 
6
6
  module RubyLsp
7
7
  module TestHelper
8
+ class TestError < StandardError; end
9
+
8
10
  extend T::Sig
11
+ extend T::Helpers
12
+
13
+ requires_ancestor { Kernel }
9
14
 
10
15
  sig do
11
16
  type_parameters(:T)
@@ -36,20 +41,49 @@ module RubyLsp
36
41
  },
37
42
  },
38
43
  })
44
+
45
+ server.global_state.index.index_single(uri, source)
39
46
  end
40
47
 
41
- server.global_state.index.index_single(
42
- RubyIndexer::IndexablePath.new(nil, T.must(uri.to_standardized_path)),
43
- source,
44
- )
45
48
  server.load_addons(include_project_addons: false) if load_addons
46
- block.call(server, uri)
47
- ensure
48
- if load_addons
49
- RubyLsp::Addon.addons.each(&:deactivate)
50
- RubyLsp::Addon.addons.clear
49
+
50
+ begin
51
+ block.call(server, uri)
52
+ ensure
53
+ if load_addons
54
+ RubyLsp::Addon.addons.each(&:deactivate)
55
+ RubyLsp::Addon.addons.clear
56
+ end
57
+ server.run_shutdown
58
+ end
59
+ end
60
+
61
+ sig { params(server: RubyLsp::Server).returns(RubyLsp::Result) }
62
+ def pop_result(server)
63
+ result = server.pop_response
64
+ result = server.pop_response until result.is_a?(RubyLsp::Result) || result.is_a?(RubyLsp::Error)
65
+
66
+ if result.is_a?(RubyLsp::Error)
67
+ raise TestError, "Failed to execute request #{result.message}"
68
+ else
69
+ result
51
70
  end
52
- T.must(server).run_shutdown
71
+ end
72
+
73
+ def pop_log_notification(message_queue, type)
74
+ log = message_queue.pop
75
+ return log if log.params.type == type
76
+
77
+ log = message_queue.pop until log.params.type == type
78
+ log
79
+ end
80
+
81
+ def pop_message(outgoing_queue, &block)
82
+ message = outgoing_queue.pop
83
+ return message if block.call(message)
84
+
85
+ message = outgoing_queue.pop until block.call(message)
86
+ message
53
87
  end
54
88
  end
55
89
  end
@@ -23,6 +23,9 @@ module RubyLsp
23
23
  Prism::InstanceVariableOperatorWriteNode, Prism::InstanceVariableOrWriteNode, Prism::InstanceVariableTargetNode,
24
24
  Prism::SuperNode, Prism::ForwardingSuperNode
25
25
  self_receiver_handling(node_context)
26
+ when Prism::ClassVariableAndWriteNode, Prism::ClassVariableWriteNode, Prism::ClassVariableOperatorWriteNode,
27
+ Prism::ClassVariableOrWriteNode, Prism::ClassVariableReadNode, Prism::ClassVariableTargetNode
28
+ infer_receiver_for_class_variables(node_context)
26
29
  end
27
30
  end
28
31
 
@@ -143,6 +146,25 @@ module RubyLsp
143
146
  nil
144
147
  end
145
148
 
149
+ sig { params(node_context: NodeContext).returns(T.nilable(Type)) }
150
+ def infer_receiver_for_class_variables(node_context)
151
+ nesting_parts = node_context.nesting.dup
152
+
153
+ return Type.new("Object") if nesting_parts.empty?
154
+
155
+ nesting_parts.reverse_each do |part|
156
+ break unless part.include?("<Class:")
157
+
158
+ nesting_parts.pop
159
+ end
160
+
161
+ receiver_name = nesting_parts.join("::")
162
+ resolved_receiver = @index.resolve(receiver_name, node_context.nesting)&.first
163
+ return unless resolved_receiver&.name
164
+
165
+ Type.new(resolved_receiver.name)
166
+ end
167
+
146
168
  # A known type
147
169
  class Type
148
170
  extend T::Sig
@@ -173,6 +173,9 @@ module RubyLsp
173
173
  sig { returns(String) }
174
174
  attr_reader :message
175
175
 
176
+ sig { returns(Integer) }
177
+ attr_reader :code
178
+
176
179
  sig { params(id: Integer, code: Integer, message: String, data: T.nilable(T::Hash[Symbol, T.untyped])).void }
177
180
  def initialize(id:, code:, message:, data: nil)
178
181
  @id = id
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.0
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-11-20 00:00:00.000000000 Z
10
+ date: 2025-01-06 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: language_server-protocol
@@ -94,7 +93,6 @@ files:
94
93
  - exe/ruby-lsp
95
94
  - exe/ruby-lsp-check
96
95
  - exe/ruby-lsp-launcher
97
- - lib/core_ext/uri.rb
98
96
  - lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb
99
97
  - lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb
100
98
  - lib/ruby-lsp.rb
@@ -103,12 +101,13 @@ files:
103
101
  - lib/ruby_indexer/lib/ruby_indexer/enhancement.rb
104
102
  - lib/ruby_indexer/lib/ruby_indexer/entry.rb
105
103
  - lib/ruby_indexer/lib/ruby_indexer/index.rb
106
- - lib/ruby_indexer/lib/ruby_indexer/indexable_path.rb
107
104
  - lib/ruby_indexer/lib/ruby_indexer/location.rb
108
105
  - lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb
109
106
  - lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb
110
107
  - lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb
108
+ - lib/ruby_indexer/lib/ruby_indexer/uri.rb
111
109
  - lib/ruby_indexer/ruby_indexer.rb
110
+ - lib/ruby_indexer/test/class_variables_test.rb
112
111
  - lib/ruby_indexer/test/classes_and_modules_test.rb
113
112
  - lib/ruby_indexer/test/configuration_test.rb
114
113
  - lib/ruby_indexer/test/constant_test.rb
@@ -121,6 +120,7 @@ files:
121
120
  - lib/ruby_indexer/test/rbs_indexer_test.rb
122
121
  - lib/ruby_indexer/test/reference_finder_test.rb
123
122
  - lib/ruby_indexer/test/test_case.rb
123
+ - lib/ruby_indexer/test/uri_test.rb
124
124
  - lib/ruby_lsp/addon.rb
125
125
  - lib/ruby_lsp/base_server.rb
126
126
  - lib/ruby_lsp/client_capabilities.rb
@@ -157,6 +157,7 @@ files:
157
157
  - lib/ruby_lsp/requests/hover.rb
158
158
  - lib/ruby_lsp/requests/inlay_hints.rb
159
159
  - lib/ruby_lsp/requests/on_type_formatting.rb
160
+ - lib/ruby_lsp/requests/prepare_rename.rb
160
161
  - lib/ruby_lsp/requests/prepare_type_hierarchy.rb
161
162
  - lib/ruby_lsp/requests/range_formatting.rb
162
163
  - lib/ruby_lsp/requests/references.rb
@@ -202,7 +203,6 @@ licenses:
202
203
  metadata:
203
204
  allowed_push_host: https://rubygems.org
204
205
  documentation_uri: https://shopify.github.io/ruby-lsp/
205
- post_install_message:
206
206
  rdoc_options: []
207
207
  require_paths:
208
208
  - lib
@@ -217,8 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
217
217
  - !ruby/object:Gem::Version
218
218
  version: '0'
219
219
  requirements: []
220
- rubygems_version: 3.5.23
221
- signing_key:
220
+ rubygems_version: 3.6.2
222
221
  specification_version: 4
223
222
  summary: An opinionated language server for Ruby
224
223
  test_files: []
@@ -1,29 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module RubyIndexer
5
- class IndexablePath
6
- extend T::Sig
7
-
8
- sig { returns(T.nilable(String)) }
9
- attr_reader :require_path
10
-
11
- sig { returns(String) }
12
- attr_reader :full_path
13
-
14
- # An IndexablePath is instantiated with a load_path_entry and a full_path. The load_path_entry is where the file can
15
- # be found in the $LOAD_PATH, which we use to determine the require_path. The load_path_entry may be `nil` if the
16
- # indexer is configured to go through files that do not belong in the $LOAD_PATH. For example,
17
- # `sorbet/tapioca/require.rb` ends up being a part of the paths to be indexed because it's a Ruby file inside the
18
- # project, but the `sorbet` folder is not a part of the $LOAD_PATH. That means that both its load_path_entry and
19
- # require_path will be `nil`, since it cannot be required by the project
20
- sig { params(load_path_entry: T.nilable(String), full_path: String).void }
21
- def initialize(load_path_entry, full_path)
22
- @full_path = full_path
23
- @require_path = T.let(
24
- load_path_entry ? full_path.delete_prefix("#{load_path_entry}/").delete_suffix(".rb") : nil,
25
- T.nilable(String),
26
- )
27
- end
28
- end
29
- end