ruby-lsp 0.17.3 → 0.17.5

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/VERSION +1 -1
  4. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +251 -100
  5. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +173 -114
  6. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +337 -77
  7. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +43 -14
  8. data/lib/ruby_indexer/test/classes_and_modules_test.rb +79 -3
  9. data/lib/ruby_indexer/test/index_test.rb +563 -29
  10. data/lib/ruby_indexer/test/instance_variables_test.rb +84 -7
  11. data/lib/ruby_indexer/test/method_test.rb +75 -25
  12. data/lib/ruby_indexer/test/rbs_indexer_test.rb +38 -2
  13. data/lib/ruby_indexer/test/test_case.rb +1 -5
  14. data/lib/ruby_lsp/addon.rb +13 -1
  15. data/lib/ruby_lsp/document.rb +50 -23
  16. data/lib/ruby_lsp/erb_document.rb +125 -0
  17. data/lib/ruby_lsp/global_state.rb +11 -4
  18. data/lib/ruby_lsp/internal.rb +3 -0
  19. data/lib/ruby_lsp/listeners/completion.rb +69 -34
  20. data/lib/ruby_lsp/listeners/definition.rb +34 -23
  21. data/lib/ruby_lsp/listeners/hover.rb +14 -7
  22. data/lib/ruby_lsp/listeners/signature_help.rb +5 -2
  23. data/lib/ruby_lsp/node_context.rb +6 -1
  24. data/lib/ruby_lsp/requests/code_action_resolve.rb +2 -2
  25. data/lib/ruby_lsp/requests/completion.rb +6 -5
  26. data/lib/ruby_lsp/requests/completion_resolve.rb +7 -4
  27. data/lib/ruby_lsp/requests/definition.rb +4 -3
  28. data/lib/ruby_lsp/requests/formatting.rb +2 -0
  29. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +88 -0
  30. data/lib/ruby_lsp/requests/selection_ranges.rb +1 -1
  31. data/lib/ruby_lsp/requests/show_syntax_tree.rb +3 -2
  32. data/lib/ruby_lsp/requests/support/common.rb +19 -1
  33. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +12 -4
  34. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +87 -0
  35. data/lib/ruby_lsp/requests/workspace_symbol.rb +1 -21
  36. data/lib/ruby_lsp/requests.rb +2 -0
  37. data/lib/ruby_lsp/ruby_document.rb +10 -0
  38. data/lib/ruby_lsp/server.rb +95 -26
  39. data/lib/ruby_lsp/store.rb +23 -8
  40. data/lib/ruby_lsp/test_helper.rb +3 -1
  41. data/lib/ruby_lsp/type_inferrer.rb +86 -0
  42. metadata +10 -6
@@ -68,6 +68,12 @@ module RubyLsp
68
68
  text_document_signature_help(message)
69
69
  when "textDocument/definition"
70
70
  text_document_definition(message)
71
+ when "textDocument/prepareTypeHierarchy"
72
+ text_document_prepare_type_hierarchy(message)
73
+ when "typeHierarchy/supertypes"
74
+ type_hierarchy_supertypes(message)
75
+ when "typeHierarchy/subtypes"
76
+ type_hierarchy_subtypes(message)
71
77
  when "workspace/didChangeWatchedFiles"
72
78
  workspace_did_change_watched_files(message)
73
79
  when "workspace/symbol"
@@ -76,13 +82,32 @@ module RubyLsp
76
82
  text_document_show_syntax_tree(message)
77
83
  when "rubyLsp/workspace/dependencies"
78
84
  workspace_dependencies(message)
85
+ when "rubyLsp/workspace/addons"
86
+ send_message(
87
+ Result.new(
88
+ id: message[:id],
89
+ response:
90
+ Addon.addons.map do |addon|
91
+ { name: addon.name, errored: addon.error? }
92
+ end,
93
+ ),
94
+ )
79
95
  when "$/cancelRequest"
80
96
  @mutex.synchronize { @cancelled_requests << message[:params][:id] }
81
97
  end
82
98
  rescue StandardError, LoadError => e
83
99
  # If an error occurred in a request, we have to return an error response or else the editor will hang
84
100
  if message[:id]
85
- send_message(Error.new(id: message[:id], code: Constant::ErrorCodes::INTERNAL_ERROR, message: e.full_message))
101
+ send_message(Error.new(
102
+ id: message[:id],
103
+ code: Constant::ErrorCodes::INTERNAL_ERROR,
104
+ message: e.full_message,
105
+ data: {
106
+ errorClass: e.class.name,
107
+ errorMessage: e.message,
108
+ backtrace: e.backtrace&.join("\n"),
109
+ },
110
+ ))
86
111
  end
87
112
 
88
113
  $stderr.puts("Error processing #{message[:method]}: #{e.full_message}")
@@ -104,7 +129,7 @@ module RubyLsp
104
129
  ),
105
130
  )
106
131
 
107
- $stderr.puts(errored_addons.map(&:errors_details).join("\n\n"))
132
+ $stderr.puts(errored_addons.map(&:errors_details).join("\n\n")) unless @test_mode
108
133
  end
109
134
  end
110
135
 
@@ -121,7 +146,6 @@ module RubyLsp
121
146
  progress = options.dig(:capabilities, :window, :workDoneProgress)
122
147
  @store.supports_progress = progress.nil? ? true : progress
123
148
  configured_features = options.dig(:initializationOptions, :enabledFeatures)
124
- @store.experimental_features = options.dig(:initializationOptions, :experimentalFeaturesEnabled) || false
125
149
 
126
150
  configured_hints = options.dig(:initializationOptions, :featuresConfiguration, :inlayHint)
127
151
  T.must(@store.features_configuration.dig(:inlayHint)).configuration.merge!(configured_hints) if configured_hints
@@ -152,6 +176,7 @@ module RubyLsp
152
176
  inlay_hint_provider = Requests::InlayHints.provider if enabled_features["inlayHint"]
153
177
  completion_provider = Requests::Completion.provider if enabled_features["completion"]
154
178
  signature_help_provider = Requests::SignatureHelp.provider if enabled_features["signatureHelp"]
179
+ type_hierarchy_provider = Requests::PrepareTypeHierarchy.provider if enabled_features["typeHierarchy"]
155
180
 
156
181
  response = {
157
182
  capabilities: Interface::ServerCapabilities.new(
@@ -175,8 +200,12 @@ module RubyLsp
175
200
  completion_provider: completion_provider,
176
201
  code_lens_provider: code_lens_provider,
177
202
  definition_provider: enabled_features["definition"],
178
- workspace_symbol_provider: enabled_features["workspaceSymbol"] && !@global_state.typechecker,
203
+ workspace_symbol_provider: enabled_features["workspaceSymbol"] && !@global_state.has_type_checker,
179
204
  signature_help_provider: signature_help_provider,
205
+ type_hierarchy_provider: type_hierarchy_provider,
206
+ experimental: {
207
+ addon_detection: true,
208
+ },
180
209
  ),
181
210
  serverInfo: {
182
211
  name: "Ruby LSP",
@@ -259,11 +288,18 @@ module RubyLsp
259
288
  def text_document_did_open(message)
260
289
  @mutex.synchronize do
261
290
  text_document = message.dig(:params, :textDocument)
291
+ language_id = case text_document[:languageId]
292
+ when "erb"
293
+ Document::LanguageId::ERB
294
+ else
295
+ Document::LanguageId::Ruby
296
+ end
262
297
  @store.set(
263
298
  uri: text_document[:uri],
264
299
  source: text_document[:text],
265
300
  version: text_document[:version],
266
301
  encoding: @global_state.encoding,
302
+ language_id: language_id,
267
303
  )
268
304
  end
269
305
  end
@@ -327,15 +363,17 @@ module RubyLsp
327
363
  return
328
364
  end
329
365
 
366
+ parse_result = document.parse_result
367
+
330
368
  # Run requests for the document
331
369
  dispatcher = Prism::Dispatcher.new
332
- folding_range = Requests::FoldingRanges.new(document.parse_result.comments, dispatcher)
370
+ folding_range = Requests::FoldingRanges.new(parse_result.comments, dispatcher)
333
371
  document_symbol = Requests::DocumentSymbol.new(uri, dispatcher)
334
- document_link = Requests::DocumentLink.new(uri, document.comments, dispatcher)
372
+ document_link = Requests::DocumentLink.new(uri, parse_result.comments, dispatcher)
335
373
  code_lens = Requests::CodeLens.new(@global_state, uri, dispatcher)
336
374
 
337
375
  semantic_highlighting = Requests::SemanticHighlighting.new(@global_state, dispatcher)
338
- dispatcher.dispatch(document.tree)
376
+ dispatcher.dispatch(parse_result.value)
339
377
 
340
378
  # Store all responses retrieve in this round of visits in the cache and then return the response for the request
341
379
  # we actually received
@@ -367,7 +405,7 @@ module RubyLsp
367
405
 
368
406
  dispatcher = Prism::Dispatcher.new
369
407
  request = Requests::SemanticHighlighting.new(@global_state, dispatcher, range: start_line..end_line)
370
- dispatcher.visit(document.tree)
408
+ dispatcher.visit(document.parse_result.value)
371
409
 
372
410
  response = request.perform
373
411
  send_message(Result.new(id: message[:id], response: response))
@@ -390,7 +428,11 @@ module RubyLsp
390
428
  return
391
429
  end
392
430
 
393
- response = Requests::Formatting.new(@global_state, @store.get(uri)).perform
431
+ document = @store.get(uri)
432
+
433
+ return send_empty_response(message[:id]) if document.is_a?(ERBDocument)
434
+
435
+ response = Requests::Formatting.new(@global_state, document).perform
394
436
  send_message(Result.new(id: message[:id], response: response))
395
437
  rescue Requests::Request::InvalidFormatter => error
396
438
  send_message(Notification.window_show_error("Configuration error: #{error.message}"))
@@ -406,19 +448,22 @@ module RubyLsp
406
448
  dispatcher = Prism::Dispatcher.new
407
449
  document = @store.get(params.dig(:textDocument, :uri))
408
450
  request = Requests::DocumentHighlight.new(document, params[:position], dispatcher)
409
- dispatcher.dispatch(document.tree)
451
+ dispatcher.dispatch(document.parse_result.value)
410
452
  send_message(Result.new(id: message[:id], response: request.perform))
411
453
  end
412
454
 
413
455
  sig { params(message: T::Hash[Symbol, T.untyped]).void }
414
456
  def text_document_on_type_formatting(message)
415
457
  params = message[:params]
458
+ document = @store.get(params.dig(:textDocument, :uri))
459
+
460
+ return send_empty_response(message[:id]) if document.is_a?(ERBDocument)
416
461
 
417
462
  send_message(
418
463
  Result.new(
419
464
  id: message[:id],
420
465
  response: Requests::OnTypeFormatting.new(
421
- @store.get(params.dig(:textDocument, :uri)),
466
+ document,
422
467
  params[:position],
423
468
  params[:ch],
424
469
  @store.client_name,
@@ -449,7 +494,7 @@ module RubyLsp
449
494
 
450
495
  sig { params(document: Document).returns(T::Boolean) }
451
496
  def typechecker_enabled?(document)
452
- @global_state.typechecker && document.sorbet_sigil_is_true_or_higher
497
+ @global_state.has_type_checker && document.sorbet_sigil_is_true_or_higher
453
498
  end
454
499
 
455
500
  sig { params(message: T::Hash[Symbol, T.untyped]).void }
@@ -459,7 +504,7 @@ module RubyLsp
459
504
  dispatcher = Prism::Dispatcher.new
460
505
  document = @store.get(params.dig(:textDocument, :uri))
461
506
  request = Requests::InlayHints.new(document, params[:range], hints_configurations, dispatcher)
462
- dispatcher.visit(document.tree)
507
+ dispatcher.visit(document.parse_result.value)
463
508
  send_message(Result.new(id: message[:id], response: request.perform))
464
509
  end
465
510
 
@@ -468,6 +513,8 @@ module RubyLsp
468
513
  params = message[:params]
469
514
  document = @store.get(params.dig(:textDocument, :uri))
470
515
 
516
+ return send_empty_response(message[:id]) if document.is_a?(ERBDocument)
517
+
471
518
  send_message(
472
519
  Result.new(
473
520
  id: message[:id],
@@ -521,7 +568,11 @@ module RubyLsp
521
568
  return
522
569
  end
523
570
 
524
- response = @store.cache_fetch(uri, "textDocument/diagnostic") do |document|
571
+ document = @store.get(uri)
572
+
573
+ return send_empty_response(message[:id]) if document.is_a?(ERBDocument)
574
+
575
+ response = document.cache_fetch("textDocument/diagnostic") do |document|
525
576
  Requests::Diagnostics.new(@global_state, document).perform
526
577
  end
527
578
 
@@ -551,7 +602,7 @@ module RubyLsp
551
602
  response: Requests::Completion.new(
552
603
  document,
553
604
  @global_state,
554
- params[:position],
605
+ params,
555
606
  typechecker_enabled?(document),
556
607
  dispatcher,
557
608
  ).perform,
@@ -660,6 +711,33 @@ module RubyLsp
660
711
  send_message(Result.new(id: message[:id], response: response))
661
712
  end
662
713
 
714
+ sig { params(message: T::Hash[Symbol, T.untyped]).void }
715
+ def text_document_prepare_type_hierarchy(message)
716
+ params = message[:params]
717
+ response = Requests::PrepareTypeHierarchy.new(
718
+ @store.get(params.dig(:textDocument, :uri)),
719
+ @global_state.index,
720
+ params[:position],
721
+ ).perform
722
+ send_message(Result.new(id: message[:id], response: response))
723
+ end
724
+
725
+ sig { params(message: T::Hash[Symbol, T.untyped]).void }
726
+ def type_hierarchy_supertypes(message)
727
+ response = Requests::TypeHierarchySupertypes.new(
728
+ @global_state.index,
729
+ message.dig(:params, :item),
730
+ ).perform
731
+ send_message(Result.new(id: message[:id], response: response))
732
+ end
733
+
734
+ sig { params(message: T::Hash[Symbol, T.untyped]).void }
735
+ def type_hierarchy_subtypes(message)
736
+ # TODO: implement subtypes
737
+ # The current index representation doesn't allow us to find the children of an entry.
738
+ send_message(Result.new(id: message[:id], response: nil))
739
+ end
740
+
663
741
  sig { params(message: T::Hash[Symbol, T.untyped]).void }
664
742
  def workspace_dependencies(message)
665
743
  response = begin
@@ -690,23 +768,14 @@ module RubyLsp
690
768
 
691
769
  sig { params(config_hash: T::Hash[String, T.untyped]).void }
692
770
  def perform_initial_indexing(config_hash)
693
- index_ruby_core
694
- index_ruby_code(config_hash)
695
- end
696
-
697
- sig { void }
698
- def index_ruby_core
699
- RubyIndexer::RBSIndexer.new(@global_state.index).index_ruby_core
700
- end
701
-
702
- sig { params(config_hash: T::Hash[String, T.untyped]).void }
703
- def index_ruby_code(config_hash)
704
771
  # The begin progress invocation happens during `initialize`, so that the notification is sent before we are
705
772
  # stuck indexing files
706
773
  RubyIndexer.configuration.apply_config(config_hash)
707
774
 
708
775
  Thread.new do
709
776
  begin
777
+ RubyIndexer::RBSIndexer.new(@global_state.index).index_ruby_core
778
+
710
779
  @global_state.index.index_all do |percentage|
711
780
  progress("indexing-progress", percentage)
712
781
  true
@@ -8,9 +8,6 @@ module RubyLsp
8
8
  sig { returns(T::Boolean) }
9
9
  attr_accessor :supports_progress
10
10
 
11
- sig { returns(T::Boolean) }
12
- attr_accessor :experimental_features
13
-
14
11
  sig { returns(T::Hash[Symbol, RequestConfig]) }
15
12
  attr_accessor :features_configuration
16
13
 
@@ -21,7 +18,6 @@ module RubyLsp
21
18
  def initialize
22
19
  @state = T.let({}, T::Hash[String, Document])
23
20
  @supports_progress = T.let(true, T::Boolean)
24
- @experimental_features = T.let(false, T::Boolean)
25
21
  @features_configuration = T.let(
26
22
  {
27
23
  inlayHint: RequestConfig.new({
@@ -41,13 +37,32 @@ module RubyLsp
41
37
  return document unless document.nil?
42
38
 
43
39
  path = T.must(uri.to_standardized_path)
44
- set(uri: uri, source: File.binread(path), version: 0)
40
+ ext = File.extname(path)
41
+ language_id = if ext == ".erb" || ext == ".rhtml"
42
+ Document::LanguageId::ERB
43
+ else
44
+ Document::LanguageId::Ruby
45
+ end
46
+ set(uri: uri, source: File.binread(path), version: 0, language_id: language_id)
45
47
  T.must(@state[uri.to_s])
46
48
  end
47
49
 
48
- sig { params(uri: URI::Generic, source: String, version: Integer, encoding: Encoding).void }
49
- def set(uri:, source:, version:, encoding: Encoding::UTF_8)
50
- document = RubyDocument.new(source: source, version: version, uri: uri, encoding: encoding)
50
+ sig do
51
+ params(
52
+ uri: URI::Generic,
53
+ source: String,
54
+ version: Integer,
55
+ language_id: Document::LanguageId,
56
+ encoding: Encoding,
57
+ ).void
58
+ end
59
+ def set(uri:, source:, version:, language_id:, encoding: Encoding::UTF_8)
60
+ document = case language_id
61
+ when Document::LanguageId::ERB
62
+ ERBDocument.new(source: source, version: version, uri: uri, encoding: encoding)
63
+ else
64
+ RubyDocument.new(source: source, version: version, uri: uri, encoding: encoding)
65
+ end
51
66
  @state[uri.to_s] = document
52
67
  end
53
68
 
@@ -20,8 +20,9 @@ module RubyLsp
20
20
  def with_server(source = nil, uri = Kernel.URI("file:///fake.rb"), stub_no_typechecker: false, load_addons: true,
21
21
  &block)
22
22
  server = RubyLsp::Server.new(test_mode: true)
23
- server.global_state.stubs(:typechecker).returns(false) if stub_no_typechecker
23
+ server.global_state.stubs(:has_type_checker).returns(false) if stub_no_typechecker
24
24
  server.global_state.apply_options({})
25
+ language_id = uri.to_s.end_with?(".erb") ? "erb" : "ruby"
25
26
 
26
27
  if source
27
28
  server.process_message({
@@ -31,6 +32,7 @@ module RubyLsp
31
32
  uri: uri,
32
33
  text: source,
33
34
  version: 1,
35
+ languageId: language_id,
34
36
  },
35
37
  },
36
38
  })
@@ -0,0 +1,86 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ # A minimalistic type checker to try to resolve types that can be inferred without requiring a type system or
6
+ # annotations
7
+ class TypeInferrer
8
+ extend T::Sig
9
+
10
+ sig { params(index: RubyIndexer::Index).void }
11
+ def initialize(index)
12
+ @index = index
13
+ end
14
+
15
+ sig { params(node_context: NodeContext).returns(T.nilable(String)) }
16
+ def infer_receiver_type(node_context)
17
+ node = node_context.node
18
+
19
+ case node
20
+ when Prism::CallNode
21
+ infer_receiver_for_call_node(node, node_context)
22
+ when Prism::InstanceVariableReadNode, Prism::InstanceVariableAndWriteNode, Prism::InstanceVariableWriteNode,
23
+ Prism::InstanceVariableOperatorWriteNode, Prism::InstanceVariableOrWriteNode, Prism::InstanceVariableTargetNode
24
+ nesting = node_context.nesting
25
+ # If we're at the top level, then the invocation is happening on `<main>`, which is a special singleton that
26
+ # inherits from Object
27
+ return "Object" if nesting.empty?
28
+
29
+ fully_qualified_name = node_context.fully_qualified_name
30
+ return fully_qualified_name if node_context.surrounding_method
31
+
32
+ "#{fully_qualified_name}::<Class:#{nesting.last}>"
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ sig { params(node: Prism::CallNode, node_context: NodeContext).returns(T.nilable(String)) }
39
+ def infer_receiver_for_call_node(node, node_context)
40
+ receiver = node.receiver
41
+
42
+ case receiver
43
+ when Prism::SelfNode, nil
44
+ nesting = node_context.nesting
45
+ # If we're at the top level, then the invocation is happening on `<main>`, which is a special singleton that
46
+ # inherits from Object
47
+ return "Object" if nesting.empty?
48
+ return node_context.fully_qualified_name if node_context.surrounding_method
49
+
50
+ # If we're not inside a method, then we're inside the body of a class or module, which is a singleton
51
+ # context
52
+ "#{nesting.join("::")}::<Class:#{nesting.last}>"
53
+ when Prism::ConstantPathNode, Prism::ConstantReadNode
54
+ # When the receiver is a constant reference, we have to try to resolve it to figure out the right
55
+ # receiver. But since the invocation is directly on the constant, that's the singleton context of that
56
+ # class/module
57
+ receiver_name = constant_name(receiver)
58
+ return unless receiver_name
59
+
60
+ resolved_receiver = @index.resolve(receiver_name, node_context.nesting)
61
+ name = resolved_receiver&.first&.name
62
+ return unless name
63
+
64
+ *parts, last = name.split("::")
65
+ return "#{last}::<Class:#{last}>" if parts.empty?
66
+
67
+ "#{parts.join("::")}::#{last}::<Class:#{last}>"
68
+ end
69
+ end
70
+
71
+ sig do
72
+ params(
73
+ node: T.any(
74
+ Prism::ConstantPathNode,
75
+ Prism::ConstantReadNode,
76
+ ),
77
+ ).returns(T.nilable(String))
78
+ end
79
+ def constant_name(node)
80
+ node.full_name
81
+ rescue Prism::ConstantPathNode::DynamicPartsInConstantPathError,
82
+ Prism::ConstantPathNode::MissingNodesInConstantPathError
83
+ nil
84
+ end
85
+ end
86
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.3
4
+ version: 0.17.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-11 00:00:00.000000000 Z
11
+ date: 2024-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: language_server-protocol
@@ -120,6 +120,7 @@ files:
120
120
  - lib/ruby_lsp/base_server.rb
121
121
  - lib/ruby_lsp/check_docs.rb
122
122
  - lib/ruby_lsp/document.rb
123
+ - lib/ruby_lsp/erb_document.rb
123
124
  - lib/ruby_lsp/global_state.rb
124
125
  - lib/ruby_lsp/internal.rb
125
126
  - lib/ruby_lsp/listeners/code_lens.rb
@@ -152,6 +153,7 @@ files:
152
153
  - lib/ruby_lsp/requests/hover.rb
153
154
  - lib/ruby_lsp/requests/inlay_hints.rb
154
155
  - lib/ruby_lsp/requests/on_type_formatting.rb
156
+ - lib/ruby_lsp/requests/prepare_type_hierarchy.rb
155
157
  - lib/ruby_lsp/requests/request.rb
156
158
  - lib/ruby_lsp/requests/selection_ranges.rb
157
159
  - lib/ruby_lsp/requests/semantic_highlighting.rb
@@ -167,6 +169,7 @@ files:
167
169
  - lib/ruby_lsp/requests/support/sorbet.rb
168
170
  - lib/ruby_lsp/requests/support/source_uri.rb
169
171
  - lib/ruby_lsp/requests/support/syntax_tree_formatter.rb
172
+ - lib/ruby_lsp/requests/type_hierarchy_supertypes.rb
170
173
  - lib/ruby_lsp/requests/workspace_symbol.rb
171
174
  - lib/ruby_lsp/response_builders.rb
172
175
  - lib/ruby_lsp/response_builders/collection_response_builder.rb
@@ -180,6 +183,7 @@ files:
180
183
  - lib/ruby_lsp/setup_bundler.rb
181
184
  - lib/ruby_lsp/store.rb
182
185
  - lib/ruby_lsp/test_helper.rb
186
+ - lib/ruby_lsp/type_inferrer.rb
183
187
  - lib/ruby_lsp/utils.rb
184
188
  homepage: https://github.com/Shopify/ruby-lsp
185
189
  licenses:
@@ -187,7 +191,7 @@ licenses:
187
191
  metadata:
188
192
  allowed_push_host: https://rubygems.org
189
193
  documentation_uri: https://shopify.github.io/ruby-lsp/
190
- post_install_message:
194
+ post_install_message:
191
195
  rdoc_options: []
192
196
  require_paths:
193
197
  - lib
@@ -202,8 +206,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
206
  - !ruby/object:Gem::Version
203
207
  version: '0'
204
208
  requirements: []
205
- rubygems_version: 3.5.11
206
- signing_key:
209
+ rubygems_version: 3.5.14
210
+ signing_key:
207
211
  specification_version: 4
208
212
  summary: An opinionated language server for Ruby
209
213
  test_files: []