ruby-lsp 0.23.11 → 0.26.1

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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp +10 -4
  5. data/exe/ruby-lsp-check +0 -4
  6. data/exe/ruby-lsp-launcher +45 -22
  7. data/exe/ruby-lsp-test-exec +6 -0
  8. data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -2
  9. data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -6
  10. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +82 -116
  11. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +140 -183
  12. data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +10 -14
  13. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +107 -236
  14. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +166 -281
  15. data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
  16. data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +23 -27
  17. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +25 -57
  18. data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +58 -68
  19. data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +17 -19
  20. data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +7 -11
  21. data/lib/ruby_indexer/test/class_variables_test.rb +14 -14
  22. data/lib/ruby_indexer/test/classes_and_modules_test.rb +65 -40
  23. data/lib/ruby_indexer/test/configuration_test.rb +49 -9
  24. data/lib/ruby_indexer/test/constant_test.rb +34 -34
  25. data/lib/ruby_indexer/test/enhancements_test.rb +1 -1
  26. data/lib/ruby_indexer/test/index_test.rb +185 -135
  27. data/lib/ruby_indexer/test/instance_variables_test.rb +61 -37
  28. data/lib/ruby_indexer/test/method_test.rb +166 -123
  29. data/lib/ruby_indexer/test/prefix_tree_test.rb +21 -21
  30. data/lib/ruby_indexer/test/rbs_indexer_test.rb +70 -75
  31. data/lib/ruby_indexer/test/reference_finder_test.rb +79 -14
  32. data/lib/ruby_indexer/test/test_case.rb +9 -3
  33. data/lib/ruby_indexer/test/uri_test.rb +15 -2
  34. data/lib/ruby_lsp/addon.rb +88 -86
  35. data/lib/ruby_lsp/base_server.rb +59 -54
  36. data/lib/ruby_lsp/client_capabilities.rb +16 -13
  37. data/lib/ruby_lsp/document.rb +205 -104
  38. data/lib/ruby_lsp/erb_document.rb +45 -47
  39. data/lib/ruby_lsp/global_state.rb +73 -57
  40. data/lib/ruby_lsp/internal.rb +8 -3
  41. data/lib/ruby_lsp/listeners/code_lens.rb +82 -89
  42. data/lib/ruby_lsp/listeners/completion.rb +81 -76
  43. data/lib/ruby_lsp/listeners/definition.rb +44 -58
  44. data/lib/ruby_lsp/listeners/document_highlight.rb +123 -150
  45. data/lib/ruby_lsp/listeners/document_link.rb +50 -70
  46. data/lib/ruby_lsp/listeners/document_symbol.rb +38 -52
  47. data/lib/ruby_lsp/listeners/folding_ranges.rb +40 -43
  48. data/lib/ruby_lsp/listeners/hover.rb +107 -115
  49. data/lib/ruby_lsp/listeners/inlay_hints.rb +8 -13
  50. data/lib/ruby_lsp/listeners/semantic_highlighting.rb +54 -56
  51. data/lib/ruby_lsp/listeners/signature_help.rb +12 -27
  52. data/lib/ruby_lsp/listeners/spec_style.rb +214 -0
  53. data/lib/ruby_lsp/listeners/test_discovery.rb +92 -0
  54. data/lib/ruby_lsp/listeners/test_style.rb +205 -95
  55. data/lib/ruby_lsp/node_context.rb +12 -39
  56. data/lib/ruby_lsp/rbs_document.rb +10 -11
  57. data/lib/ruby_lsp/requests/code_action_resolve.rb +65 -61
  58. data/lib/ruby_lsp/requests/code_actions.rb +14 -26
  59. data/lib/ruby_lsp/requests/code_lens.rb +31 -21
  60. data/lib/ruby_lsp/requests/completion.rb +8 -21
  61. data/lib/ruby_lsp/requests/completion_resolve.rb +6 -6
  62. data/lib/ruby_lsp/requests/definition.rb +8 -20
  63. data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
  64. data/lib/ruby_lsp/requests/discover_tests.rb +20 -7
  65. data/lib/ruby_lsp/requests/document_highlight.rb +6 -16
  66. data/lib/ruby_lsp/requests/document_link.rb +6 -17
  67. data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
  68. data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
  69. data/lib/ruby_lsp/requests/formatting.rb +6 -9
  70. data/lib/ruby_lsp/requests/go_to_relevant_file.rb +85 -0
  71. data/lib/ruby_lsp/requests/hover.rb +12 -25
  72. data/lib/ruby_lsp/requests/inlay_hints.rb +8 -19
  73. data/lib/ruby_lsp/requests/on_type_formatting.rb +32 -40
  74. data/lib/ruby_lsp/requests/prepare_rename.rb +5 -10
  75. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +5 -15
  76. data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
  77. data/lib/ruby_lsp/requests/references.rb +17 -57
  78. data/lib/ruby_lsp/requests/rename.rb +27 -51
  79. data/lib/ruby_lsp/requests/request.rb +13 -25
  80. data/lib/ruby_lsp/requests/selection_ranges.rb +7 -7
  81. data/lib/ruby_lsp/requests/semantic_highlighting.rb +16 -35
  82. data/lib/ruby_lsp/requests/show_syntax_tree.rb +7 -8
  83. data/lib/ruby_lsp/requests/signature_help.rb +9 -27
  84. data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
  85. data/lib/ruby_lsp/requests/support/common.rb +16 -58
  86. data/lib/ruby_lsp/requests/support/formatter.rb +16 -15
  87. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
  88. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +13 -16
  89. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +34 -36
  90. data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
  91. data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
  92. data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
  93. data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
  94. data/lib/ruby_lsp/requests/support/test_item.rb +16 -14
  95. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
  96. data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
  97. data/lib/ruby_lsp/response_builders/collection_response_builder.rb +6 -9
  98. data/lib/ruby_lsp/response_builders/document_symbol.rb +15 -21
  99. data/lib/ruby_lsp/response_builders/hover.rb +12 -18
  100. data/lib/ruby_lsp/response_builders/response_builder.rb +6 -7
  101. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +62 -91
  102. data/lib/ruby_lsp/response_builders/signature_help.rb +6 -8
  103. data/lib/ruby_lsp/response_builders/test_collection.rb +35 -13
  104. data/lib/ruby_lsp/ruby_document.rb +32 -98
  105. data/lib/ruby_lsp/scope.rb +7 -11
  106. data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
  107. data/lib/ruby_lsp/server.rb +303 -196
  108. data/lib/ruby_lsp/setup_bundler.rb +121 -82
  109. data/lib/ruby_lsp/static_docs.rb +12 -7
  110. data/lib/ruby_lsp/store.rb +21 -49
  111. data/lib/ruby_lsp/test_helper.rb +3 -16
  112. data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +233 -0
  113. data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +145 -0
  114. data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +92 -0
  115. data/lib/ruby_lsp/type_inferrer.rb +13 -14
  116. data/lib/ruby_lsp/utils.rb +138 -93
  117. data/static_docs/break.md +103 -0
  118. metadata +14 -20
  119. data/lib/ruby_lsp/load_sorbet.rb +0 -62
@@ -3,21 +3,14 @@
3
3
 
4
4
  module RubyIndexer
5
5
  class ReferenceFinder
6
- extend T::Sig
7
-
8
- class Target
9
- extend T::Helpers
10
-
11
- abstract!
12
- end
6
+ # @abstract
7
+ class Target; end
13
8
 
14
9
  class ConstTarget < Target
15
- extend T::Sig
16
-
17
- sig { returns(String) }
10
+ #: String
18
11
  attr_reader :fully_qualified_name
19
12
 
20
- sig { params(fully_qualified_name: String).void }
13
+ #: (String fully_qualified_name) -> void
21
14
  def initialize(fully_qualified_name)
22
15
  super()
23
16
  @fully_qualified_name = fully_qualified_name
@@ -25,12 +18,10 @@ module RubyIndexer
25
18
  end
26
19
 
27
20
  class MethodTarget < Target
28
- extend T::Sig
29
-
30
- sig { returns(String) }
21
+ #: String
31
22
  attr_reader :method_name
32
23
 
33
- sig { params(method_name: String).void }
24
+ #: (String method_name) -> void
34
25
  def initialize(method_name)
35
26
  super()
36
27
  @method_name = method_name
@@ -38,31 +29,31 @@ module RubyIndexer
38
29
  end
39
30
 
40
31
  class InstanceVariableTarget < Target
41
- extend T::Sig
42
-
43
- sig { returns(String) }
32
+ #: String
44
33
  attr_reader :name
45
34
 
46
- sig { params(name: String).void }
47
- def initialize(name)
35
+ #: Array[String]
36
+ attr_reader :owner_ancestors
37
+
38
+ #: (String name, Array[String] owner_ancestors) -> void
39
+ def initialize(name, owner_ancestors)
48
40
  super()
49
41
  @name = name
42
+ @owner_ancestors = owner_ancestors
50
43
  end
51
44
  end
52
45
 
53
46
  class Reference
54
- extend T::Sig
55
-
56
- sig { returns(String) }
47
+ #: String
57
48
  attr_reader :name
58
49
 
59
- sig { returns(Prism::Location) }
50
+ #: Prism::Location
60
51
  attr_reader :location
61
52
 
62
- sig { returns(T::Boolean) }
53
+ #: bool
63
54
  attr_reader :declaration
64
55
 
65
- sig { params(name: String, location: Prism::Location, declaration: T::Boolean).void }
56
+ #: (String name, Prism::Location location, declaration: bool) -> void
66
57
  def initialize(name, location, declaration:)
67
58
  @name = name
68
59
  @location = location
@@ -70,22 +61,14 @@ module RubyIndexer
70
61
  end
71
62
  end
72
63
 
73
- sig do
74
- params(
75
- target: Target,
76
- index: RubyIndexer::Index,
77
- dispatcher: Prism::Dispatcher,
78
- uri: URI::Generic,
79
- include_declarations: T::Boolean,
80
- ).void
81
- end
64
+ #: (Target target, RubyIndexer::Index index, Prism::Dispatcher dispatcher, URI::Generic uri, ?include_declarations: bool) -> void
82
65
  def initialize(target, index, dispatcher, uri, include_declarations: true)
83
66
  @target = target
84
67
  @index = index
85
68
  @uri = uri
86
69
  @include_declarations = include_declarations
87
- @stack = T.let([], T::Array[String])
88
- @references = T.let([], T::Array[Reference])
70
+ @stack = [] #: Array[String]
71
+ @references = [] #: Array[Reference]
89
72
 
90
73
  dispatcher.register(
91
74
  self,
@@ -119,34 +102,34 @@ module RubyIndexer
119
102
  )
120
103
  end
121
104
 
122
- sig { returns(T::Array[Reference]) }
105
+ #: -> Array[Reference]
123
106
  def references
124
107
  return @references if @include_declarations
125
108
 
126
109
  @references.reject(&:declaration)
127
110
  end
128
111
 
129
- sig { params(node: Prism::ClassNode).void }
112
+ #: (Prism::ClassNode node) -> void
130
113
  def on_class_node_enter(node)
131
114
  @stack << node.constant_path.slice
132
115
  end
133
116
 
134
- sig { params(node: Prism::ClassNode).void }
117
+ #: (Prism::ClassNode node) -> void
135
118
  def on_class_node_leave(node)
136
119
  @stack.pop
137
120
  end
138
121
 
139
- sig { params(node: Prism::ModuleNode).void }
122
+ #: (Prism::ModuleNode node) -> void
140
123
  def on_module_node_enter(node)
141
124
  @stack << node.constant_path.slice
142
125
  end
143
126
 
144
- sig { params(node: Prism::ModuleNode).void }
127
+ #: (Prism::ModuleNode node) -> void
145
128
  def on_module_node_leave(node)
146
129
  @stack.pop
147
130
  end
148
131
 
149
- sig { params(node: Prism::SingletonClassNode).void }
132
+ #: (Prism::SingletonClassNode node) -> void
150
133
  def on_singleton_class_node_enter(node)
151
134
  expression = node.expression
152
135
  return unless expression.is_a?(Prism::SelfNode)
@@ -154,12 +137,12 @@ module RubyIndexer
154
137
  @stack << "<Class:#{@stack.last}>"
155
138
  end
156
139
 
157
- sig { params(node: Prism::SingletonClassNode).void }
140
+ #: (Prism::SingletonClassNode node) -> void
158
141
  def on_singleton_class_node_leave(node)
159
142
  @stack.pop
160
143
  end
161
144
 
162
- sig { params(node: Prism::ConstantPathNode).void }
145
+ #: (Prism::ConstantPathNode node) -> void
163
146
  def on_constant_path_node_enter(node)
164
147
  name = Index.constant_name(node)
165
148
  return unless name
@@ -167,7 +150,7 @@ module RubyIndexer
167
150
  collect_constant_references(name, node.location)
168
151
  end
169
152
 
170
- sig { params(node: Prism::ConstantReadNode).void }
153
+ #: (Prism::ConstantReadNode node) -> void
171
154
  def on_constant_read_node_enter(node)
172
155
  name = Index.constant_name(node)
173
156
  return unless name
@@ -175,7 +158,7 @@ module RubyIndexer
175
158
  collect_constant_references(name, node.location)
176
159
  end
177
160
 
178
- sig { params(node: Prism::MultiWriteNode).void }
161
+ #: (Prism::MultiWriteNode node) -> void
179
162
  def on_multi_write_node_enter(node)
180
163
  [*node.lefts, *node.rest, *node.rights].each do |target|
181
164
  case target
@@ -185,7 +168,7 @@ module RubyIndexer
185
168
  end
186
169
  end
187
170
 
188
- sig { params(node: Prism::ConstantPathWriteNode).void }
171
+ #: (Prism::ConstantPathWriteNode node) -> void
189
172
  def on_constant_path_write_node_enter(node)
190
173
  target = node.target
191
174
  return unless target.parent.nil? || target.parent.is_a?(Prism::ConstantReadNode)
@@ -196,7 +179,7 @@ module RubyIndexer
196
179
  collect_constant_references(name, target.location)
197
180
  end
198
181
 
199
- sig { params(node: Prism::ConstantPathOrWriteNode).void }
182
+ #: (Prism::ConstantPathOrWriteNode node) -> void
200
183
  def on_constant_path_or_write_node_enter(node)
201
184
  target = node.target
202
185
  return unless target.parent.nil? || target.parent.is_a?(Prism::ConstantReadNode)
@@ -207,7 +190,7 @@ module RubyIndexer
207
190
  collect_constant_references(name, target.location)
208
191
  end
209
192
 
210
- sig { params(node: Prism::ConstantPathOperatorWriteNode).void }
193
+ #: (Prism::ConstantPathOperatorWriteNode node) -> void
211
194
  def on_constant_path_operator_write_node_enter(node)
212
195
  target = node.target
213
196
  return unless target.parent.nil? || target.parent.is_a?(Prism::ConstantReadNode)
@@ -218,7 +201,7 @@ module RubyIndexer
218
201
  collect_constant_references(name, target.location)
219
202
  end
220
203
 
221
- sig { params(node: Prism::ConstantPathAndWriteNode).void }
204
+ #: (Prism::ConstantPathAndWriteNode node) -> void
222
205
  def on_constant_path_and_write_node_enter(node)
223
206
  target = node.target
224
207
  return unless target.parent.nil? || target.parent.is_a?(Prism::ConstantReadNode)
@@ -229,27 +212,27 @@ module RubyIndexer
229
212
  collect_constant_references(name, target.location)
230
213
  end
231
214
 
232
- sig { params(node: Prism::ConstantWriteNode).void }
215
+ #: (Prism::ConstantWriteNode node) -> void
233
216
  def on_constant_write_node_enter(node)
234
217
  collect_constant_references(node.name.to_s, node.name_loc)
235
218
  end
236
219
 
237
- sig { params(node: Prism::ConstantOrWriteNode).void }
220
+ #: (Prism::ConstantOrWriteNode node) -> void
238
221
  def on_constant_or_write_node_enter(node)
239
222
  collect_constant_references(node.name.to_s, node.name_loc)
240
223
  end
241
224
 
242
- sig { params(node: Prism::ConstantAndWriteNode).void }
225
+ #: (Prism::ConstantAndWriteNode node) -> void
243
226
  def on_constant_and_write_node_enter(node)
244
227
  collect_constant_references(node.name.to_s, node.name_loc)
245
228
  end
246
229
 
247
- sig { params(node: Prism::ConstantOperatorWriteNode).void }
230
+ #: (Prism::ConstantOperatorWriteNode node) -> void
248
231
  def on_constant_operator_write_node_enter(node)
249
232
  collect_constant_references(node.name.to_s, node.name_loc)
250
233
  end
251
234
 
252
- sig { params(node: Prism::DefNode).void }
235
+ #: (Prism::DefNode node) -> void
253
236
  def on_def_node_enter(node)
254
237
  if @target.is_a?(MethodTarget) && (name = node.name.to_s) == @target.method_name
255
238
  @references << Reference.new(name, node.name_loc, declaration: true)
@@ -260,53 +243,57 @@ module RubyIndexer
260
243
  end
261
244
  end
262
245
 
263
- sig { params(node: Prism::DefNode).void }
246
+ #: (Prism::DefNode node) -> void
264
247
  def on_def_node_leave(node)
265
248
  if node.receiver.is_a?(Prism::SelfNode)
266
249
  @stack.pop
267
250
  end
268
251
  end
269
252
 
270
- sig { params(node: Prism::InstanceVariableReadNode).void }
253
+ #: (Prism::InstanceVariableReadNode node) -> void
271
254
  def on_instance_variable_read_node_enter(node)
272
255
  collect_instance_variable_references(node.name.to_s, node.location, false)
273
256
  end
274
257
 
275
- sig { params(node: Prism::InstanceVariableWriteNode).void }
258
+ #: (Prism::InstanceVariableWriteNode node) -> void
276
259
  def on_instance_variable_write_node_enter(node)
277
260
  collect_instance_variable_references(node.name.to_s, node.name_loc, true)
278
261
  end
279
262
 
280
- sig { params(node: Prism::InstanceVariableAndWriteNode).void }
263
+ #: (Prism::InstanceVariableAndWriteNode node) -> void
281
264
  def on_instance_variable_and_write_node_enter(node)
282
265
  collect_instance_variable_references(node.name.to_s, node.name_loc, true)
283
266
  end
284
267
 
285
- sig { params(node: Prism::InstanceVariableOperatorWriteNode).void }
268
+ #: (Prism::InstanceVariableOperatorWriteNode node) -> void
286
269
  def on_instance_variable_operator_write_node_enter(node)
287
270
  collect_instance_variable_references(node.name.to_s, node.name_loc, true)
288
271
  end
289
272
 
290
- sig { params(node: Prism::InstanceVariableOrWriteNode).void }
273
+ #: (Prism::InstanceVariableOrWriteNode node) -> void
291
274
  def on_instance_variable_or_write_node_enter(node)
292
275
  collect_instance_variable_references(node.name.to_s, node.name_loc, true)
293
276
  end
294
277
 
295
- sig { params(node: Prism::InstanceVariableTargetNode).void }
278
+ #: (Prism::InstanceVariableTargetNode node) -> void
296
279
  def on_instance_variable_target_node_enter(node)
297
280
  collect_instance_variable_references(node.name.to_s, node.location, true)
298
281
  end
299
282
 
300
- sig { params(node: Prism::CallNode).void }
283
+ #: (Prism::CallNode node) -> void
301
284
  def on_call_node_enter(node)
302
285
  if @target.is_a?(MethodTarget) && (name = node.name.to_s) == @target.method_name
303
- @references << Reference.new(name, T.must(node.message_loc), declaration: false)
286
+ @references << Reference.new(
287
+ name,
288
+ node.message_loc, #: as !nil
289
+ declaration: false,
290
+ )
304
291
  end
305
292
  end
306
293
 
307
294
  private
308
295
 
309
- sig { params(name: String, location: Prism::Location).void }
296
+ #: (String name, Prism::Location location) -> void
310
297
  def collect_constant_references(name, location)
311
298
  return unless @target.is_a?(ConstTarget)
312
299
 
@@ -335,11 +322,14 @@ module RubyIndexer
335
322
  @references << Reference.new(name, location, declaration: declaration)
336
323
  end
337
324
 
338
- sig { params(name: String, location: Prism::Location, declaration: T::Boolean).void }
325
+ #: (String name, Prism::Location location, bool declaration) -> void
339
326
  def collect_instance_variable_references(name, location, declaration)
340
327
  return unless @target.is_a?(InstanceVariableTarget) && name == @target.name
341
328
 
342
- @references << Reference.new(name, location, declaration: declaration)
329
+ receiver_type = Index.actual_nesting(@stack, nil).join("::")
330
+ if @target.owner_ancestors.include?(receiver_type)
331
+ @references << Reference.new(name, location, declaration: declaration)
332
+ end
343
333
  end
344
334
  end
345
335
  end
@@ -1,35 +1,33 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "uri"
5
+
4
6
  module URI
5
7
  class Generic
6
- extend T::Sig
7
-
8
8
  # Avoid a deprecation warning with Ruby 3.4 where the default parser was changed to RFC3986.
9
9
  # This condition must remain even after support for 3.4 has been dropped for users that have
10
10
  # `uri` in their lockfile, decoupling it from the ruby version.
11
- PARSER = T.let(const_defined?(:RFC2396_PARSER) ? RFC2396_PARSER : DEFAULT_PARSER, RFC2396_Parser)
12
11
 
13
- class << self
14
- extend T::Sig
12
+ # NOTE: We also define this in the shim
13
+ PARSER = const_defined?(:RFC2396_PARSER) ? RFC2396_PARSER : DEFAULT_PARSER
15
14
 
16
- sig do
17
- params(
18
- path: String,
19
- fragment: T.nilable(String),
20
- scheme: String,
21
- load_path_entry: T.nilable(String),
22
- ).returns(URI::Generic)
23
- end
15
+ class << self
16
+ #: (path: String, ?fragment: String?, ?scheme: String, ?load_path_entry: String?) -> URI::Generic
24
17
  def from_path(path:, fragment: nil, scheme: "file", load_path_entry: nil)
18
+ # This unsafe regex is the same one used in the URI::RFC2396_REGEXP class with the exception of the fact that we
19
+ # do not include colon as a safe character. VS Code URIs always escape colons and we need to ensure we do the
20
+ # same to avoid inconsistencies in our URIs, which are used to identify resources
21
+ unsafe_regex = %r{[^\-_.!~*'()a-zA-Z\d;/?@&=+$,\[\]]}
22
+
25
23
  # On Windows, if the path begins with the disk name, we need to add a leading slash to make it a valid URI
26
24
  escaped_path = if /^[A-Z]:/i.match?(path)
27
- PARSER.escape("/#{path}")
25
+ PARSER.escape("/#{path}", unsafe_regex)
28
26
  elsif path.start_with?("//?/")
29
27
  # Some paths on Windows start with "//?/". This is a special prefix that allows for long file paths
30
- PARSER.escape(path.delete_prefix("//?"))
28
+ PARSER.escape(path.delete_prefix("//?"), unsafe_regex)
31
29
  else
32
- PARSER.escape(path)
30
+ PARSER.escape(path, unsafe_regex)
33
31
  end
34
32
 
35
33
  uri = build(scheme: scheme, path: escaped_path, fragment: fragment)
@@ -42,10 +40,10 @@ module URI
42
40
  end
43
41
  end
44
42
 
45
- sig { returns(T.nilable(String)) }
43
+ #: String?
46
44
  attr_accessor :require_path
47
45
 
48
- sig { params(load_path_entry: String).void }
46
+ #: (String load_path_entry) -> void
49
47
  def add_require_path_from_load_entry(load_path_entry)
50
48
  path = to_standardized_path
51
49
  return unless path
@@ -53,7 +51,7 @@ module URI
53
51
  self.require_path = path.delete_prefix("#{load_path_entry}/").delete_suffix(".rb")
54
52
  end
55
53
 
56
- sig { returns(T.nilable(String)) }
54
+ #: -> String?
57
55
  def to_standardized_path
58
56
  parsed_path = path
59
57
  return unless parsed_path
@@ -5,30 +5,26 @@ module RubyIndexer
5
5
  # Represents the visibility scope in a Ruby namespace. This keeps track of whether methods are in a public, private or
6
6
  # protected section, and whether they are module functions.
7
7
  class VisibilityScope
8
- extend T::Sig
9
-
10
8
  class << self
11
- extend T::Sig
12
-
13
- sig { returns(T.attached_class) }
9
+ #: -> instance
14
10
  def module_function_scope
15
- new(module_func: true, visibility: Entry::Visibility::PRIVATE)
11
+ new(module_func: true, visibility: :private)
16
12
  end
17
13
 
18
- sig { returns(T.attached_class) }
14
+ #: -> instance
19
15
  def public_scope
20
16
  new
21
17
  end
22
18
  end
23
19
 
24
- sig { returns(Entry::Visibility) }
20
+ #: Symbol
25
21
  attr_reader :visibility
26
22
 
27
- sig { returns(T::Boolean) }
23
+ #: bool
28
24
  attr_reader :module_func
29
25
 
30
- sig { params(visibility: Entry::Visibility, module_func: T::Boolean).void }
31
- def initialize(visibility: Entry::Visibility::PUBLIC, module_func: false)
26
+ #: (?visibility: Symbol, ?module_func: bool) -> void
27
+ def initialize(visibility: :public, module_func: false)
32
28
  @visibility = visibility
33
29
  @module_func = module_func
34
30
  end
@@ -14,8 +14,8 @@ module RubyIndexer
14
14
 
15
15
  assert_entry("@@bar", Entry::ClassVariable, "/fake/path/foo.rb:1-2:1-7")
16
16
 
17
- entry = T.must(@index["@@bar"]&.first)
18
- owner = T.must(entry.owner)
17
+ entry = @index["@@bar"]&.first #: as Entry::ClassVariable
18
+ owner = entry.owner #: as !nil
19
19
  assert_instance_of(Entry::Class, owner)
20
20
  assert_equal("Foo", owner.name)
21
21
  end
@@ -50,13 +50,13 @@ module RubyIndexer
50
50
  assert_entry("@@foo", Entry::ClassVariable, "/fake/path/foo.rb:1-2:1-7")
51
51
  assert_entry("@@bar", Entry::ClassVariable, "/fake/path/foo.rb:1-9:1-14")
52
52
 
53
- entry = T.must(@index["@@foo"]&.first)
54
- owner = T.must(entry.owner)
53
+ entry = @index["@@foo"]&.first #: as Entry::ClassVariable
54
+ owner = entry.owner #: as !nil
55
55
  assert_instance_of(Entry::Class, owner)
56
56
  assert_equal("Foo", owner.name)
57
57
 
58
- entry = T.must(@index["@@bar"]&.first)
59
- owner = T.must(entry.owner)
58
+ entry = @index["@@bar"]&.first #: as Entry::ClassVariable
59
+ owner = entry.owner #: as !nil
60
60
  assert_instance_of(Entry::Class, owner)
61
61
  assert_equal("Foo", owner.name)
62
62
  end
@@ -83,10 +83,10 @@ module RubyIndexer
83
83
 
84
84
  def test_top_level_class_variable
85
85
  index(<<~RUBY)
86
- @foo = 123
86
+ @@foo = 123
87
87
  RUBY
88
88
 
89
- entry = T.must(@index["@foo"]&.first)
89
+ entry = @index["@@foo"]&.first #: as Entry::ClassVariable
90
90
  assert_nil(entry.owner)
91
91
  end
92
92
 
@@ -99,8 +99,8 @@ module RubyIndexer
99
99
  end
100
100
  RUBY
101
101
 
102
- entry = T.must(@index["@@bar"]&.first)
103
- owner = T.must(entry.owner)
102
+ entry = @index["@@bar"]&.first #: as Entry::ClassVariable
103
+ owner = entry.owner #: as !nil
104
104
  assert_instance_of(Entry::Class, owner)
105
105
  assert_equal("Foo", owner.name)
106
106
  end
@@ -114,8 +114,8 @@ module RubyIndexer
114
114
  end
115
115
  RUBY
116
116
 
117
- entry = T.must(@index["@@bar"]&.first)
118
- owner = T.must(entry.owner)
117
+ entry = @index["@@bar"]&.first #: as Entry::ClassVariable
118
+ owner = entry.owner #: as !nil
119
119
  assert_instance_of(Entry::Class, owner)
120
120
  assert_equal("Foo", owner.name)
121
121
  end
@@ -131,8 +131,8 @@ module RubyIndexer
131
131
  end
132
132
  RUBY
133
133
 
134
- entry = T.must(@index["@@bar"]&.first)
135
- owner = T.must(entry.owner)
134
+ entry = @index["@@bar"]&.first #: as Entry::ClassVariable
135
+ owner = entry.owner #: as !nil
136
136
  assert_instance_of(Entry::Class, owner)
137
137
  assert_equal("Foo", owner.name)
138
138
  end