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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/VERSION +1 -1
- data/exe/ruby-lsp +10 -4
- data/exe/ruby-lsp-check +0 -4
- data/exe/ruby-lsp-launcher +45 -22
- data/exe/ruby-lsp-test-exec +6 -0
- data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -2
- data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -6
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +82 -116
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +140 -183
- data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +10 -14
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +107 -236
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +166 -281
- data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
- data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +23 -27
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +25 -57
- data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +58 -68
- data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +17 -19
- data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +7 -11
- data/lib/ruby_indexer/test/class_variables_test.rb +14 -14
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +65 -40
- data/lib/ruby_indexer/test/configuration_test.rb +49 -9
- data/lib/ruby_indexer/test/constant_test.rb +34 -34
- data/lib/ruby_indexer/test/enhancements_test.rb +1 -1
- data/lib/ruby_indexer/test/index_test.rb +185 -135
- data/lib/ruby_indexer/test/instance_variables_test.rb +61 -37
- data/lib/ruby_indexer/test/method_test.rb +166 -123
- data/lib/ruby_indexer/test/prefix_tree_test.rb +21 -21
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +70 -75
- data/lib/ruby_indexer/test/reference_finder_test.rb +79 -14
- data/lib/ruby_indexer/test/test_case.rb +9 -3
- data/lib/ruby_indexer/test/uri_test.rb +15 -2
- data/lib/ruby_lsp/addon.rb +88 -86
- data/lib/ruby_lsp/base_server.rb +59 -54
- data/lib/ruby_lsp/client_capabilities.rb +16 -13
- data/lib/ruby_lsp/document.rb +205 -104
- data/lib/ruby_lsp/erb_document.rb +45 -47
- data/lib/ruby_lsp/global_state.rb +73 -57
- data/lib/ruby_lsp/internal.rb +8 -3
- data/lib/ruby_lsp/listeners/code_lens.rb +82 -89
- data/lib/ruby_lsp/listeners/completion.rb +81 -76
- data/lib/ruby_lsp/listeners/definition.rb +44 -58
- data/lib/ruby_lsp/listeners/document_highlight.rb +123 -150
- data/lib/ruby_lsp/listeners/document_link.rb +50 -70
- data/lib/ruby_lsp/listeners/document_symbol.rb +38 -52
- data/lib/ruby_lsp/listeners/folding_ranges.rb +40 -43
- data/lib/ruby_lsp/listeners/hover.rb +107 -115
- data/lib/ruby_lsp/listeners/inlay_hints.rb +8 -13
- data/lib/ruby_lsp/listeners/semantic_highlighting.rb +54 -56
- data/lib/ruby_lsp/listeners/signature_help.rb +12 -27
- data/lib/ruby_lsp/listeners/spec_style.rb +214 -0
- data/lib/ruby_lsp/listeners/test_discovery.rb +92 -0
- data/lib/ruby_lsp/listeners/test_style.rb +205 -95
- data/lib/ruby_lsp/node_context.rb +12 -39
- data/lib/ruby_lsp/rbs_document.rb +10 -11
- data/lib/ruby_lsp/requests/code_action_resolve.rb +65 -61
- data/lib/ruby_lsp/requests/code_actions.rb +14 -26
- data/lib/ruby_lsp/requests/code_lens.rb +31 -21
- data/lib/ruby_lsp/requests/completion.rb +8 -21
- data/lib/ruby_lsp/requests/completion_resolve.rb +6 -6
- data/lib/ruby_lsp/requests/definition.rb +8 -20
- data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
- data/lib/ruby_lsp/requests/discover_tests.rb +20 -7
- data/lib/ruby_lsp/requests/document_highlight.rb +6 -16
- data/lib/ruby_lsp/requests/document_link.rb +6 -17
- data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
- data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
- data/lib/ruby_lsp/requests/formatting.rb +6 -9
- data/lib/ruby_lsp/requests/go_to_relevant_file.rb +85 -0
- data/lib/ruby_lsp/requests/hover.rb +12 -25
- data/lib/ruby_lsp/requests/inlay_hints.rb +8 -19
- data/lib/ruby_lsp/requests/on_type_formatting.rb +32 -40
- data/lib/ruby_lsp/requests/prepare_rename.rb +5 -10
- data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +5 -15
- data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
- data/lib/ruby_lsp/requests/references.rb +17 -57
- data/lib/ruby_lsp/requests/rename.rb +27 -51
- data/lib/ruby_lsp/requests/request.rb +13 -25
- data/lib/ruby_lsp/requests/selection_ranges.rb +7 -7
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +16 -35
- data/lib/ruby_lsp/requests/show_syntax_tree.rb +7 -8
- data/lib/ruby_lsp/requests/signature_help.rb +9 -27
- data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
- data/lib/ruby_lsp/requests/support/common.rb +16 -58
- data/lib/ruby_lsp/requests/support/formatter.rb +16 -15
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
- data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +13 -16
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +34 -36
- data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
- data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
- data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
- data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
- data/lib/ruby_lsp/requests/support/test_item.rb +16 -14
- data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
- data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
- data/lib/ruby_lsp/response_builders/collection_response_builder.rb +6 -9
- data/lib/ruby_lsp/response_builders/document_symbol.rb +15 -21
- data/lib/ruby_lsp/response_builders/hover.rb +12 -18
- data/lib/ruby_lsp/response_builders/response_builder.rb +6 -7
- data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +62 -91
- data/lib/ruby_lsp/response_builders/signature_help.rb +6 -8
- data/lib/ruby_lsp/response_builders/test_collection.rb +35 -13
- data/lib/ruby_lsp/ruby_document.rb +32 -98
- data/lib/ruby_lsp/scope.rb +7 -11
- data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
- data/lib/ruby_lsp/server.rb +303 -196
- data/lib/ruby_lsp/setup_bundler.rb +121 -82
- data/lib/ruby_lsp/static_docs.rb +12 -7
- data/lib/ruby_lsp/store.rb +21 -49
- data/lib/ruby_lsp/test_helper.rb +3 -16
- data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +233 -0
- data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +145 -0
- data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +92 -0
- data/lib/ruby_lsp/type_inferrer.rb +13 -14
- data/lib/ruby_lsp/utils.rb +138 -93
- data/static_docs/break.md +103 -0
- metadata +14 -20
- data/lib/ruby_lsp/load_sorbet.rb +0 -62
@@ -3,21 +3,14 @@
|
|
3
3
|
|
4
4
|
module RubyIndexer
|
5
5
|
class ReferenceFinder
|
6
|
-
|
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
|
-
|
16
|
-
|
17
|
-
sig { returns(String) }
|
10
|
+
#: String
|
18
11
|
attr_reader :fully_qualified_name
|
19
12
|
|
20
|
-
|
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
|
-
|
29
|
-
|
30
|
-
sig { returns(String) }
|
21
|
+
#: String
|
31
22
|
attr_reader :method_name
|
32
23
|
|
33
|
-
|
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
|
-
|
42
|
-
|
43
|
-
sig { returns(String) }
|
32
|
+
#: String
|
44
33
|
attr_reader :name
|
45
34
|
|
46
|
-
|
47
|
-
|
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
|
-
|
55
|
-
|
56
|
-
sig { returns(String) }
|
47
|
+
#: String
|
57
48
|
attr_reader :name
|
58
49
|
|
59
|
-
|
50
|
+
#: Prism::Location
|
60
51
|
attr_reader :location
|
61
52
|
|
62
|
-
|
53
|
+
#: bool
|
63
54
|
attr_reader :declaration
|
64
55
|
|
65
|
-
|
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
|
-
|
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 =
|
88
|
-
@references =
|
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
|
-
|
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
|
-
|
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
|
-
|
117
|
+
#: (Prism::ClassNode node) -> void
|
135
118
|
def on_class_node_leave(node)
|
136
119
|
@stack.pop
|
137
120
|
end
|
138
121
|
|
139
|
-
|
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
|
-
|
127
|
+
#: (Prism::ModuleNode node) -> void
|
145
128
|
def on_module_node_leave(node)
|
146
129
|
@stack.pop
|
147
130
|
end
|
148
131
|
|
149
|
-
|
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
|
-
|
140
|
+
#: (Prism::SingletonClassNode node) -> void
|
158
141
|
def on_singleton_class_node_leave(node)
|
159
142
|
@stack.pop
|
160
143
|
end
|
161
144
|
|
162
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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(
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
14
|
-
|
12
|
+
# NOTE: We also define this in the shim
|
13
|
+
PARSER = const_defined?(:RFC2396_PARSER) ? RFC2396_PARSER : DEFAULT_PARSER
|
15
14
|
|
16
|
-
|
17
|
-
|
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
|
-
|
43
|
+
#: String?
|
46
44
|
attr_accessor :require_path
|
47
45
|
|
48
|
-
|
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
|
-
|
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
|
-
|
12
|
-
|
13
|
-
sig { returns(T.attached_class) }
|
9
|
+
#: -> instance
|
14
10
|
def module_function_scope
|
15
|
-
new(module_func: true, visibility:
|
11
|
+
new(module_func: true, visibility: :private)
|
16
12
|
end
|
17
13
|
|
18
|
-
|
14
|
+
#: -> instance
|
19
15
|
def public_scope
|
20
16
|
new
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
24
|
-
|
20
|
+
#: Symbol
|
25
21
|
attr_reader :visibility
|
26
22
|
|
27
|
-
|
23
|
+
#: bool
|
28
24
|
attr_reader :module_func
|
29
25
|
|
30
|
-
|
31
|
-
def initialize(visibility:
|
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 =
|
18
|
-
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 =
|
54
|
-
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 =
|
59
|
-
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
|
-
|
86
|
+
@@foo = 123
|
87
87
|
RUBY
|
88
88
|
|
89
|
-
entry =
|
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 =
|
103
|
-
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 =
|
118
|
-
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 =
|
135
|
-
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
|