ruby-lsp 0.18.3 → 0.19.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/exe/ruby-lsp-check +1 -1
- data/lib/core_ext/uri.rb +9 -4
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +6 -0
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +66 -8
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +63 -32
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +8 -5
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +52 -8
- data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +324 -0
- data/lib/ruby_indexer/ruby_indexer.rb +1 -0
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +23 -0
- data/lib/ruby_indexer/test/constant_test.rb +8 -0
- data/lib/ruby_indexer/test/enhancements_test.rb +2 -0
- data/lib/ruby_indexer/test/index_test.rb +3 -0
- data/lib/ruby_indexer/test/instance_variables_test.rb +12 -0
- data/lib/ruby_indexer/test/method_test.rb +10 -0
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +22 -0
- data/lib/ruby_indexer/test/reference_finder_test.rb +242 -0
- data/lib/ruby_lsp/addon.rb +79 -17
- data/lib/ruby_lsp/base_server.rb +6 -0
- data/lib/ruby_lsp/erb_document.rb +9 -3
- data/lib/ruby_lsp/global_state.rb +8 -0
- data/lib/ruby_lsp/internal.rb +5 -1
- data/lib/ruby_lsp/listeners/completion.rb +1 -1
- data/lib/ruby_lsp/listeners/hover.rb +57 -0
- data/lib/ruby_lsp/listeners/semantic_highlighting.rb +24 -21
- data/lib/ruby_lsp/requests/code_action_resolve.rb +9 -3
- data/lib/ruby_lsp/requests/completion.rb +1 -0
- data/lib/ruby_lsp/requests/completion_resolve.rb +29 -0
- data/lib/ruby_lsp/requests/definition.rb +1 -0
- data/lib/ruby_lsp/requests/document_highlight.rb +1 -1
- data/lib/ruby_lsp/requests/hover.rb +1 -0
- data/lib/ruby_lsp/requests/on_type_formatting.rb +1 -1
- data/lib/ruby_lsp/requests/range_formatting.rb +55 -0
- data/lib/ruby_lsp/requests/references.rb +146 -0
- data/lib/ruby_lsp/requests/rename.rb +196 -0
- data/lib/ruby_lsp/requests/signature_help.rb +6 -1
- data/lib/ruby_lsp/requests/support/common.rb +2 -2
- data/lib/ruby_lsp/requests/support/formatter.rb +3 -0
- data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +6 -0
- data/lib/ruby_lsp/requests/support/source_uri.rb +8 -1
- data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +8 -0
- data/lib/ruby_lsp/ruby_document.rb +23 -8
- data/lib/ruby_lsp/scope.rb +47 -0
- data/lib/ruby_lsp/server.rb +127 -34
- data/lib/ruby_lsp/static_docs.rb +15 -0
- data/lib/ruby_lsp/store.rb +12 -0
- data/lib/ruby_lsp/test_helper.rb +1 -1
- data/lib/ruby_lsp/type_inferrer.rb +6 -1
- data/lib/ruby_lsp/utils.rb +3 -6
- data/static_docs/yield.md +81 -0
- metadata +21 -8
- data/lib/ruby_lsp/parameter_scope.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d900634d5328c8b4b5fcf799f807456bec3cdb94d6294c80fa9152bcf45aedde
|
4
|
+
data.tar.gz: b7661867d38331ec158312b10c7f530cbd58994ee94e8ff592f478e7e05efcb7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f7955f676bc5f231f990f04d8aea1a767165d4f2cac1e9514928014cd8a09eb68c60b4cd226a94b554dac88d77c2117ae3a3ea76bb66e68980974f1685d8970
|
7
|
+
data.tar.gz: 1b914d5607e5730139780cd1f172923db7878a7a0a4098daa1e17df8a1a7a2d8b6731b092baf7eeefc9f55605305e4d70d8cca8489f68a17bab532026c38e8b2
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.19.1
|
data/exe/ruby-lsp-check
CHANGED
@@ -32,7 +32,7 @@ files.each_with_index do |file, index|
|
|
32
32
|
})
|
33
33
|
|
34
34
|
result = server.pop_response
|
35
|
-
errors[file] = result
|
35
|
+
errors[file] = result if result.is_a?(RubyLsp::Error)
|
36
36
|
ensure
|
37
37
|
server.process_message({ method: "textDocument/didClose", params: { textDocument: { uri: uri } } })
|
38
38
|
server.pop_response
|
data/lib/core_ext/uri.rb
CHANGED
@@ -3,6 +3,11 @@
|
|
3
3
|
|
4
4
|
module URI
|
5
5
|
class Generic
|
6
|
+
# Avoid a deprecation warning with Ruby 3.4 where the default parser was changed to RFC3986.
|
7
|
+
# This condition must remain even after support for 3.4 has been dropped for users that have
|
8
|
+
# `uri` in their lockfile, decoupling it from the ruby version.
|
9
|
+
PARSER = T.let(const_defined?(:RFC2396_PARSER) ? RFC2396_PARSER : DEFAULT_PARSER, RFC2396_Parser)
|
10
|
+
|
6
11
|
class << self
|
7
12
|
extend T::Sig
|
8
13
|
|
@@ -10,12 +15,12 @@ module URI
|
|
10
15
|
def from_path(path:, fragment: nil, scheme: "file")
|
11
16
|
# On Windows, if the path begins with the disk name, we need to add a leading slash to make it a valid URI
|
12
17
|
escaped_path = if /^[A-Z]:/i.match?(path)
|
13
|
-
|
18
|
+
PARSER.escape("/#{path}")
|
14
19
|
elsif path.start_with?("//?/")
|
15
20
|
# Some paths on Windows start with "//?/". This is a special prefix that allows for long file paths
|
16
|
-
|
21
|
+
PARSER.escape(path.delete_prefix("//?"))
|
17
22
|
else
|
18
|
-
|
23
|
+
PARSER.escape(path)
|
19
24
|
end
|
20
25
|
|
21
26
|
build(scheme: scheme, path: escaped_path, fragment: fragment)
|
@@ -29,7 +34,7 @@ module URI
|
|
29
34
|
parsed_path = path
|
30
35
|
return unless parsed_path
|
31
36
|
|
32
|
-
unescaped_path =
|
37
|
+
unescaped_path = PARSER.unescape(parsed_path)
|
33
38
|
|
34
39
|
# On Windows, when we're getting the file system path back from the URI, we need to remove the leading forward
|
35
40
|
# slash
|
@@ -19,9 +19,13 @@ module RubyIndexer
|
|
19
19
|
sig { params(workspace_path: String).void }
|
20
20
|
attr_writer :workspace_path
|
21
21
|
|
22
|
+
sig { returns(Encoding) }
|
23
|
+
attr_accessor :encoding
|
24
|
+
|
22
25
|
sig { void }
|
23
26
|
def initialize
|
24
27
|
@workspace_path = T.let(Dir.pwd, String)
|
28
|
+
@encoding = T.let(Encoding::UTF_8, Encoding)
|
25
29
|
@excluded_gems = T.let(initial_excluded_gems, T::Array[String])
|
26
30
|
@included_gems = T.let([], T::Array[String])
|
27
31
|
@excluded_patterns = T.let([File.join("**", "*_test.rb"), File.join("tmp", "**", "*")], T::Array[String])
|
@@ -235,6 +239,8 @@ module RubyIndexer
|
|
235
239
|
|
236
240
|
excluded.uniq!
|
237
241
|
excluded.map(&:name)
|
242
|
+
rescue Bundler::GemfileNotFound
|
243
|
+
[]
|
238
244
|
end
|
239
245
|
end
|
240
246
|
end
|
@@ -109,6 +109,7 @@ module RubyIndexer
|
|
109
109
|
node.location,
|
110
110
|
constant_path.location,
|
111
111
|
comments,
|
112
|
+
@index.configuration.encoding,
|
112
113
|
parent_class,
|
113
114
|
)
|
114
115
|
|
@@ -132,7 +133,14 @@ module RubyIndexer
|
|
132
133
|
|
133
134
|
comments = collect_comments(node)
|
134
135
|
|
135
|
-
entry = Entry::Module.new(
|
136
|
+
entry = Entry::Module.new(
|
137
|
+
actual_nesting(name),
|
138
|
+
@file_path,
|
139
|
+
node.location,
|
140
|
+
constant_path.location,
|
141
|
+
comments,
|
142
|
+
@index.configuration.encoding,
|
143
|
+
)
|
136
144
|
|
137
145
|
@owner_stack << entry
|
138
146
|
@index.add(entry)
|
@@ -161,7 +169,12 @@ module RubyIndexer
|
|
161
169
|
|
162
170
|
if existing_entries
|
163
171
|
entry = T.must(existing_entries.first)
|
164
|
-
entry.update_singleton_information(
|
172
|
+
entry.update_singleton_information(
|
173
|
+
node.location,
|
174
|
+
expression.location,
|
175
|
+
collect_comments(node),
|
176
|
+
@index.configuration.encoding,
|
177
|
+
)
|
165
178
|
else
|
166
179
|
entry = Entry::SingletonClass.new(
|
167
180
|
real_nesting,
|
@@ -169,6 +182,7 @@ module RubyIndexer
|
|
169
182
|
node.location,
|
170
183
|
expression.location,
|
171
184
|
collect_comments(node),
|
185
|
+
@index.configuration.encoding,
|
172
186
|
nil,
|
173
187
|
)
|
174
188
|
@index.add(entry, skip_prefix_tree: true)
|
@@ -329,6 +343,7 @@ module RubyIndexer
|
|
329
343
|
node.location,
|
330
344
|
node.name_loc,
|
331
345
|
comments,
|
346
|
+
@index.configuration.encoding,
|
332
347
|
[Entry::Signature.new(list_params(node.parameters))],
|
333
348
|
current_visibility,
|
334
349
|
@owner_stack.last,
|
@@ -345,6 +360,7 @@ module RubyIndexer
|
|
345
360
|
node.location,
|
346
361
|
node.name_loc,
|
347
362
|
comments,
|
363
|
+
@index.configuration.encoding,
|
348
364
|
[Entry::Signature.new(list_params(node.parameters))],
|
349
365
|
current_visibility,
|
350
366
|
singleton,
|
@@ -403,6 +419,7 @@ module RubyIndexer
|
|
403
419
|
@file_path,
|
404
420
|
node.new_name.location,
|
405
421
|
comments,
|
422
|
+
@index.configuration.encoding,
|
406
423
|
),
|
407
424
|
)
|
408
425
|
end
|
@@ -433,7 +450,14 @@ module RubyIndexer
|
|
433
450
|
owner = @index.existing_or_new_singleton_class(owner.name)
|
434
451
|
end
|
435
452
|
|
436
|
-
@index.add(Entry::InstanceVariable.new(
|
453
|
+
@index.add(Entry::InstanceVariable.new(
|
454
|
+
name,
|
455
|
+
@file_path,
|
456
|
+
loc,
|
457
|
+
collect_comments(node),
|
458
|
+
@index.configuration.encoding,
|
459
|
+
owner,
|
460
|
+
))
|
437
461
|
end
|
438
462
|
|
439
463
|
sig { params(node: Prism::CallNode).void }
|
@@ -496,6 +520,7 @@ module RubyIndexer
|
|
496
520
|
@file_path,
|
497
521
|
new_name.location,
|
498
522
|
comments,
|
523
|
+
@index.configuration.encoding,
|
499
524
|
),
|
500
525
|
)
|
501
526
|
end
|
@@ -525,19 +550,43 @@ module RubyIndexer
|
|
525
550
|
@index.add(
|
526
551
|
case value
|
527
552
|
when Prism::ConstantReadNode, Prism::ConstantPathNode
|
528
|
-
Entry::UnresolvedConstantAlias.new(
|
553
|
+
Entry::UnresolvedConstantAlias.new(
|
554
|
+
value.slice,
|
555
|
+
@stack.dup,
|
556
|
+
name,
|
557
|
+
@file_path,
|
558
|
+
node.location,
|
559
|
+
comments,
|
560
|
+
@index.configuration.encoding,
|
561
|
+
)
|
529
562
|
when Prism::ConstantWriteNode, Prism::ConstantAndWriteNode, Prism::ConstantOrWriteNode,
|
530
563
|
Prism::ConstantOperatorWriteNode
|
531
564
|
|
532
565
|
# If the right hand side is another constant assignment, we need to visit it because that constant has to be
|
533
566
|
# indexed too
|
534
|
-
Entry::UnresolvedConstantAlias.new(
|
567
|
+
Entry::UnresolvedConstantAlias.new(
|
568
|
+
value.name.to_s,
|
569
|
+
@stack.dup,
|
570
|
+
name,
|
571
|
+
@file_path,
|
572
|
+
node.location,
|
573
|
+
comments,
|
574
|
+
@index.configuration.encoding,
|
575
|
+
)
|
535
576
|
when Prism::ConstantPathWriteNode, Prism::ConstantPathOrWriteNode, Prism::ConstantPathOperatorWriteNode,
|
536
577
|
Prism::ConstantPathAndWriteNode
|
537
578
|
|
538
|
-
Entry::UnresolvedConstantAlias.new(
|
579
|
+
Entry::UnresolvedConstantAlias.new(
|
580
|
+
value.target.slice,
|
581
|
+
@stack.dup,
|
582
|
+
name,
|
583
|
+
@file_path,
|
584
|
+
node.location,
|
585
|
+
comments,
|
586
|
+
@index.configuration.encoding,
|
587
|
+
)
|
539
588
|
else
|
540
|
-
Entry::Constant.new(name, @file_path, node.location, comments)
|
589
|
+
Entry::Constant.new(name, @file_path, node.location, comments, @index.configuration.encoding)
|
541
590
|
end,
|
542
591
|
)
|
543
592
|
end
|
@@ -600,7 +649,15 @@ module RubyIndexer
|
|
600
649
|
next unless name && loc
|
601
650
|
|
602
651
|
if reader
|
603
|
-
@index.add(Entry::Accessor.new(
|
652
|
+
@index.add(Entry::Accessor.new(
|
653
|
+
name,
|
654
|
+
@file_path,
|
655
|
+
loc,
|
656
|
+
comments,
|
657
|
+
@index.configuration.encoding,
|
658
|
+
current_visibility,
|
659
|
+
@owner_stack.last,
|
660
|
+
))
|
604
661
|
end
|
605
662
|
|
606
663
|
next unless writer
|
@@ -610,6 +667,7 @@ module RubyIndexer
|
|
610
667
|
@file_path,
|
611
668
|
loc,
|
612
669
|
comments,
|
670
|
+
@index.configuration.encoding,
|
613
671
|
current_visibility,
|
614
672
|
@owner_stack.last,
|
615
673
|
))
|
@@ -33,9 +33,10 @@ module RubyIndexer
|
|
33
33
|
file_path: String,
|
34
34
|
location: T.any(Prism::Location, RubyIndexer::Location),
|
35
35
|
comments: T.nilable(String),
|
36
|
+
encoding: Encoding,
|
36
37
|
).void
|
37
38
|
end
|
38
|
-
def initialize(name, file_path, location, comments)
|
39
|
+
def initialize(name, file_path, location, comments, encoding)
|
39
40
|
@name = name
|
40
41
|
@file_path = file_path
|
41
42
|
@comments = comments
|
@@ -46,8 +47,8 @@ module RubyIndexer
|
|
46
47
|
Location.new(
|
47
48
|
location.start_line,
|
48
49
|
location.end_line,
|
49
|
-
location.
|
50
|
-
location.
|
50
|
+
location.start_code_units_column(encoding),
|
51
|
+
location.end_code_units_column(encoding),
|
51
52
|
)
|
52
53
|
else
|
53
54
|
location
|
@@ -109,6 +110,10 @@ module RubyIndexer
|
|
109
110
|
else
|
110
111
|
""
|
111
112
|
end
|
113
|
+
rescue Errno::ENOENT
|
114
|
+
# If the file was deleted, but the entry hasn't been removed yet (could happen due to concurrency), then we do
|
115
|
+
# not want to fail. Just set the comments to an empty string
|
116
|
+
""
|
112
117
|
end
|
113
118
|
end
|
114
119
|
|
@@ -150,22 +155,23 @@ module RubyIndexer
|
|
150
155
|
location: T.any(Prism::Location, RubyIndexer::Location),
|
151
156
|
name_location: T.any(Prism::Location, Location),
|
152
157
|
comments: T.nilable(String),
|
158
|
+
encoding: Encoding,
|
153
159
|
).void
|
154
160
|
end
|
155
|
-
def initialize(nesting, file_path, location, name_location, comments)
|
161
|
+
def initialize(nesting, file_path, location, name_location, comments, encoding) # rubocop:disable Metrics/ParameterLists
|
156
162
|
@name = T.let(nesting.join("::"), String)
|
157
163
|
# The original nesting where this namespace was discovered
|
158
164
|
@nesting = nesting
|
159
165
|
|
160
|
-
super(@name, file_path, location, comments)
|
166
|
+
super(@name, file_path, location, comments, encoding)
|
161
167
|
|
162
168
|
@name_location = T.let(
|
163
169
|
if name_location.is_a?(Prism::Location)
|
164
170
|
Location.new(
|
165
171
|
name_location.start_line,
|
166
172
|
name_location.end_line,
|
167
|
-
name_location.
|
168
|
-
name_location.
|
173
|
+
name_location.start_code_units_column(encoding),
|
174
|
+
name_location.end_code_units_column(encoding),
|
169
175
|
)
|
170
176
|
else
|
171
177
|
name_location
|
@@ -211,11 +217,12 @@ module RubyIndexer
|
|
211
217
|
location: T.any(Prism::Location, RubyIndexer::Location),
|
212
218
|
name_location: T.any(Prism::Location, Location),
|
213
219
|
comments: T.nilable(String),
|
220
|
+
encoding: Encoding,
|
214
221
|
parent_class: T.nilable(String),
|
215
222
|
).void
|
216
223
|
end
|
217
|
-
def initialize(nesting, file_path, location, name_location, comments, parent_class) # rubocop:disable Metrics/ParameterLists
|
218
|
-
super(nesting, file_path, location, name_location, comments)
|
224
|
+
def initialize(nesting, file_path, location, name_location, comments, encoding, parent_class) # rubocop:disable Metrics/ParameterLists
|
225
|
+
super(nesting, file_path, location, name_location, comments, encoding)
|
219
226
|
@parent_class = parent_class
|
220
227
|
end
|
221
228
|
|
@@ -228,20 +235,27 @@ module RubyIndexer
|
|
228
235
|
class SingletonClass < Class
|
229
236
|
extend T::Sig
|
230
237
|
|
231
|
-
sig
|
232
|
-
|
238
|
+
sig do
|
239
|
+
params(
|
240
|
+
location: Prism::Location,
|
241
|
+
name_location: Prism::Location,
|
242
|
+
comments: T.nilable(String),
|
243
|
+
encoding: Encoding,
|
244
|
+
).void
|
245
|
+
end
|
246
|
+
def update_singleton_information(location, name_location, comments, encoding)
|
233
247
|
# Create a new RubyIndexer::Location object from the Prism location
|
234
248
|
@location = Location.new(
|
235
249
|
location.start_line,
|
236
250
|
location.end_line,
|
237
|
-
location.
|
238
|
-
location.
|
251
|
+
location.start_code_units_column(encoding),
|
252
|
+
location.end_code_units_column(encoding),
|
239
253
|
)
|
240
254
|
@name_location = Location.new(
|
241
255
|
name_location.start_line,
|
242
256
|
name_location.end_line,
|
243
|
-
name_location.
|
244
|
-
name_location.
|
257
|
+
name_location.start_code_units_column(encoding),
|
258
|
+
name_location.end_code_units_column(encoding),
|
245
259
|
)
|
246
260
|
(@comments ||= +"") << comments if comments
|
247
261
|
end
|
@@ -361,12 +375,13 @@ module RubyIndexer
|
|
361
375
|
file_path: String,
|
362
376
|
location: T.any(Prism::Location, RubyIndexer::Location),
|
363
377
|
comments: T.nilable(String),
|
378
|
+
encoding: Encoding,
|
364
379
|
visibility: Visibility,
|
365
380
|
owner: T.nilable(Entry::Namespace),
|
366
381
|
).void
|
367
382
|
end
|
368
|
-
def initialize(name, file_path, location, comments, visibility, owner) # rubocop:disable Metrics/ParameterLists
|
369
|
-
super(name, file_path, location, comments)
|
383
|
+
def initialize(name, file_path, location, comments, encoding, visibility, owner) # rubocop:disable Metrics/ParameterLists
|
384
|
+
super(name, file_path, location, comments, encoding)
|
370
385
|
@visibility = visibility
|
371
386
|
@owner = owner
|
372
387
|
end
|
@@ -429,21 +444,22 @@ module RubyIndexer
|
|
429
444
|
location: T.any(Prism::Location, RubyIndexer::Location),
|
430
445
|
name_location: T.any(Prism::Location, Location),
|
431
446
|
comments: T.nilable(String),
|
447
|
+
encoding: Encoding,
|
432
448
|
signatures: T::Array[Signature],
|
433
449
|
visibility: Visibility,
|
434
450
|
owner: T.nilable(Entry::Namespace),
|
435
451
|
).void
|
436
452
|
end
|
437
|
-
def initialize(name, file_path, location, name_location, comments, signatures, visibility, owner) # rubocop:disable Metrics/ParameterLists
|
438
|
-
super(name, file_path, location, comments, visibility, owner)
|
453
|
+
def initialize(name, file_path, location, name_location, comments, encoding, signatures, visibility, owner) # rubocop:disable Metrics/ParameterLists
|
454
|
+
super(name, file_path, location, comments, encoding, visibility, owner)
|
439
455
|
@signatures = signatures
|
440
456
|
@name_location = T.let(
|
441
457
|
if name_location.is_a?(Prism::Location)
|
442
458
|
Location.new(
|
443
459
|
name_location.start_line,
|
444
460
|
name_location.end_line,
|
445
|
-
name_location.
|
446
|
-
name_location.
|
461
|
+
name_location.start_code_units_column(encoding),
|
462
|
+
name_location.end_code_units_column(encoding),
|
447
463
|
)
|
448
464
|
else
|
449
465
|
name_location
|
@@ -480,10 +496,11 @@ module RubyIndexer
|
|
480
496
|
file_path: String,
|
481
497
|
location: T.any(Prism::Location, RubyIndexer::Location),
|
482
498
|
comments: T.nilable(String),
|
499
|
+
encoding: Encoding,
|
483
500
|
).void
|
484
501
|
end
|
485
|
-
def initialize(target, nesting, name, file_path, location, comments) # rubocop:disable Metrics/ParameterLists
|
486
|
-
super(name, file_path, location, comments)
|
502
|
+
def initialize(target, nesting, name, file_path, location, comments, encoding) # rubocop:disable Metrics/ParameterLists
|
503
|
+
super(name, file_path, location, comments, encoding)
|
487
504
|
|
488
505
|
@target = target
|
489
506
|
@nesting = nesting
|
@@ -497,15 +514,24 @@ module RubyIndexer
|
|
497
514
|
sig { returns(String) }
|
498
515
|
attr_reader :target
|
499
516
|
|
500
|
-
sig { params(target: String, unresolved_alias: UnresolvedConstantAlias).void }
|
501
|
-
def initialize(target, unresolved_alias)
|
502
|
-
super(
|
517
|
+
sig { params(target: String, unresolved_alias: UnresolvedConstantAlias, encoding: Encoding).void }
|
518
|
+
def initialize(target, unresolved_alias, encoding)
|
519
|
+
super(
|
520
|
+
unresolved_alias.name,
|
521
|
+
unresolved_alias.file_path,
|
522
|
+
unresolved_alias.location,
|
523
|
+
unresolved_alias.comments,
|
524
|
+
encoding
|
525
|
+
)
|
503
526
|
|
504
527
|
@visibility = unresolved_alias.visibility
|
505
528
|
@target = target
|
506
529
|
end
|
507
530
|
end
|
508
531
|
|
532
|
+
# Represents a global variable e.g.: $DEBUG
|
533
|
+
class GlobalVariable < Entry; end
|
534
|
+
|
509
535
|
# Represents an instance variable e.g.: @a = 1
|
510
536
|
class InstanceVariable < Entry
|
511
537
|
sig { returns(T.nilable(Entry::Namespace)) }
|
@@ -517,11 +543,12 @@ module RubyIndexer
|
|
517
543
|
file_path: String,
|
518
544
|
location: T.any(Prism::Location, RubyIndexer::Location),
|
519
545
|
comments: T.nilable(String),
|
546
|
+
encoding: Encoding,
|
520
547
|
owner: T.nilable(Entry::Namespace),
|
521
548
|
).void
|
522
549
|
end
|
523
|
-
def initialize(name, file_path, location, comments, owner)
|
524
|
-
super(name, file_path, location, comments)
|
550
|
+
def initialize(name, file_path, location, comments, encoding, owner) # rubocop:disable Metrics/ParameterLists
|
551
|
+
super(name, file_path, location, comments, encoding)
|
525
552
|
@owner = owner
|
526
553
|
end
|
527
554
|
end
|
@@ -546,10 +573,11 @@ module RubyIndexer
|
|
546
573
|
file_path: String,
|
547
574
|
location: T.any(Prism::Location, RubyIndexer::Location),
|
548
575
|
comments: T.nilable(String),
|
576
|
+
encoding: Encoding,
|
549
577
|
).void
|
550
578
|
end
|
551
|
-
def initialize(new_name, old_name, owner, file_path, location, comments) # rubocop:disable Metrics/ParameterLists
|
552
|
-
super(new_name, file_path, location, comments)
|
579
|
+
def initialize(new_name, old_name, owner, file_path, location, comments, encoding) # rubocop:disable Metrics/ParameterLists
|
580
|
+
super(new_name, file_path, location, comments, encoding)
|
553
581
|
|
554
582
|
@new_name = new_name
|
555
583
|
@old_name = old_name
|
@@ -567,8 +595,10 @@ module RubyIndexer
|
|
567
595
|
sig { returns(T.nilable(Entry::Namespace)) }
|
568
596
|
attr_reader :owner
|
569
597
|
|
570
|
-
sig
|
571
|
-
|
598
|
+
sig do
|
599
|
+
params(target: T.any(Member, MethodAlias), unresolved_alias: UnresolvedMethodAlias, encoding: Encoding).void
|
600
|
+
end
|
601
|
+
def initialize(target, unresolved_alias, encoding)
|
572
602
|
full_comments = +"Alias for #{target.name}\n"
|
573
603
|
full_comments << "#{unresolved_alias.comments}\n"
|
574
604
|
full_comments << target.comments
|
@@ -578,6 +608,7 @@ module RubyIndexer
|
|
578
608
|
unresolved_alias.file_path,
|
579
609
|
unresolved_alias.location,
|
580
610
|
full_comments,
|
611
|
+
encoding
|
581
612
|
)
|
582
613
|
|
583
614
|
@target = target
|
@@ -665,6 +665,7 @@ module RubyIndexer
|
|
665
665
|
attached_ancestor.location,
|
666
666
|
attached_ancestor.name_location,
|
667
667
|
nil,
|
668
|
+
@configuration.encoding,
|
668
669
|
nil,
|
669
670
|
)
|
670
671
|
add(singleton, skip_prefix_tree: true)
|
@@ -676,11 +677,13 @@ module RubyIndexer
|
|
676
677
|
sig do
|
677
678
|
type_parameters(:T).params(
|
678
679
|
path: String,
|
679
|
-
type: T::Class[T.all(T.type_parameter(:T), Entry)],
|
680
|
-
).returns(T.nilable(T::Array[T.type_parameter(:T)]))
|
680
|
+
type: T.nilable(T::Class[T.all(T.type_parameter(:T), Entry)]),
|
681
|
+
).returns(T.nilable(T.any(T::Array[Entry], T::Array[T.type_parameter(:T)])))
|
681
682
|
end
|
682
|
-
def entries_for(path, type)
|
683
|
+
def entries_for(path, type = nil)
|
683
684
|
entries = @files_to_entries[path]
|
685
|
+
return entries unless type
|
686
|
+
|
684
687
|
entries&.grep(type)
|
685
688
|
end
|
686
689
|
|
@@ -856,7 +859,7 @@ module RubyIndexer
|
|
856
859
|
return entry unless target
|
857
860
|
|
858
861
|
target_name = T.must(target.first).name
|
859
|
-
resolved_alias = Entry::ConstantAlias.new(target_name, entry)
|
862
|
+
resolved_alias = Entry::ConstantAlias.new(target_name, entry, @configuration.encoding)
|
860
863
|
|
861
864
|
# Replace the UnresolvedAlias by a resolved one so that we don't have to do this again later
|
862
865
|
original_entries = T.must(@entries[alias_name])
|
@@ -1047,7 +1050,7 @@ module RubyIndexer
|
|
1047
1050
|
target_method_entries = resolve_method(entry.old_name, receiver_name, seen_names)
|
1048
1051
|
return entry unless target_method_entries
|
1049
1052
|
|
1050
|
-
resolved_alias = Entry::MethodAlias.new(T.must(target_method_entries.first), entry)
|
1053
|
+
resolved_alias = Entry::MethodAlias.new(T.must(target_method_entries.first), entry, @configuration.encoding)
|
1051
1054
|
original_entries = T.must(@entries[new_name])
|
1052
1055
|
original_entries.delete(entry)
|
1053
1056
|
original_entries << resolved_alias
|
@@ -5,6 +5,8 @@ module RubyIndexer
|
|
5
5
|
class RBSIndexer
|
6
6
|
extend T::Sig
|
7
7
|
|
8
|
+
HAS_UNTYPED_FUNCTION = T.let(!!defined?(RBS::Types::UntypedFunction), T::Boolean)
|
9
|
+
|
8
10
|
sig { params(index: Index).void }
|
9
11
|
def initialize(index)
|
10
12
|
@index = index
|
@@ -42,6 +44,8 @@ module RubyIndexer
|
|
42
44
|
when RBS::AST::Declarations::Constant
|
43
45
|
namespace_nesting = declaration.name.namespace.path.map(&:to_s)
|
44
46
|
handle_constant(declaration, namespace_nesting, pathname.to_s)
|
47
|
+
when RBS::AST::Declarations::Global
|
48
|
+
handle_global_variable(declaration, pathname)
|
45
49
|
else # rubocop:disable Style/EmptyElse
|
46
50
|
# Other kinds not yet handled
|
47
51
|
end
|
@@ -57,9 +61,9 @@ module RubyIndexer
|
|
57
61
|
comments = comments_to_string(declaration)
|
58
62
|
entry = if declaration.is_a?(RBS::AST::Declarations::Class)
|
59
63
|
parent_class = declaration.super_class&.name&.name&.to_s
|
60
|
-
Entry::Class.new(nesting, file_path, location, location, comments, parent_class)
|
64
|
+
Entry::Class.new(nesting, file_path, location, location, comments, @index.configuration.encoding, parent_class)
|
61
65
|
else
|
62
|
-
Entry::Module.new(nesting, file_path, location, location, comments)
|
66
|
+
Entry::Module.new(nesting, file_path, location, location, comments, @index.configuration.encoding)
|
63
67
|
end
|
64
68
|
add_declaration_mixins_to_entry(declaration, entry)
|
65
69
|
@index.add(entry)
|
@@ -126,7 +130,17 @@ module RubyIndexer
|
|
126
130
|
|
127
131
|
real_owner = member.singleton? ? @index.existing_or_new_singleton_class(owner.name) : owner
|
128
132
|
signatures = signatures(member)
|
129
|
-
@index.add(Entry::Method.new(
|
133
|
+
@index.add(Entry::Method.new(
|
134
|
+
name,
|
135
|
+
file_path,
|
136
|
+
location,
|
137
|
+
location,
|
138
|
+
comments,
|
139
|
+
@index.configuration.encoding,
|
140
|
+
signatures,
|
141
|
+
visibility,
|
142
|
+
real_owner,
|
143
|
+
))
|
130
144
|
end
|
131
145
|
|
132
146
|
sig { params(member: RBS::AST::Members::MethodDefinition).returns(T::Array[Entry::Signature]) }
|
@@ -139,13 +153,23 @@ module RubyIndexer
|
|
139
153
|
|
140
154
|
sig { params(overload: RBS::AST::Members::MethodDefinition::Overload).returns(T::Array[Entry::Parameter]) }
|
141
155
|
def process_overload(overload)
|
142
|
-
function =
|
143
|
-
parameters = parse_arguments(function)
|
156
|
+
function = overload.method_type.type
|
144
157
|
|
145
|
-
|
146
|
-
|
158
|
+
if function.is_a?(RBS::Types::Function)
|
159
|
+
parameters = parse_arguments(function)
|
147
160
|
|
148
|
-
|
161
|
+
block = overload.method_type.block
|
162
|
+
parameters << Entry::BlockParameter.anonymous if block&.required
|
163
|
+
return parameters
|
164
|
+
end
|
165
|
+
|
166
|
+
# Untyped functions are a new RBS feature (since v3.6.0) to declare methods that accept any parameters. For our
|
167
|
+
# purposes, accepting any argument is equivalent to `...`
|
168
|
+
if HAS_UNTYPED_FUNCTION && function.is_a?(RBS::Types::UntypedFunction)
|
169
|
+
[Entry::ForwardingParameter.new]
|
170
|
+
else
|
171
|
+
[]
|
172
|
+
end
|
149
173
|
end
|
150
174
|
|
151
175
|
sig { params(function: RBS::Types::Function).returns(T::Array[Entry::Parameter]) }
|
@@ -245,6 +269,24 @@ module RubyIndexer
|
|
245
269
|
file_path,
|
246
270
|
to_ruby_indexer_location(declaration.location),
|
247
271
|
comments_to_string(declaration),
|
272
|
+
@index.configuration.encoding,
|
273
|
+
))
|
274
|
+
end
|
275
|
+
|
276
|
+
sig { params(declaration: RBS::AST::Declarations::Global, pathname: Pathname).void }
|
277
|
+
def handle_global_variable(declaration, pathname)
|
278
|
+
name = declaration.name.to_s
|
279
|
+
file_path = pathname.to_s
|
280
|
+
location = to_ruby_indexer_location(declaration.location)
|
281
|
+
comments = comments_to_string(declaration)
|
282
|
+
encoding = @index.configuration.encoding
|
283
|
+
|
284
|
+
@index.add(Entry::GlobalVariable.new(
|
285
|
+
name,
|
286
|
+
file_path,
|
287
|
+
location,
|
288
|
+
comments,
|
289
|
+
encoding,
|
248
290
|
))
|
249
291
|
end
|
250
292
|
|
@@ -260,6 +302,7 @@ module RubyIndexer
|
|
260
302
|
file_path,
|
261
303
|
to_ruby_indexer_location(member.location),
|
262
304
|
comments,
|
305
|
+
@index.configuration.encoding,
|
263
306
|
)
|
264
307
|
|
265
308
|
@index.add(entry)
|
@@ -270,6 +313,7 @@ module RubyIndexer
|
|
270
313
|
RBS::AST::Declarations::Class,
|
271
314
|
RBS::AST::Declarations::Module,
|
272
315
|
RBS::AST::Declarations::Constant,
|
316
|
+
RBS::AST::Declarations::Global,
|
273
317
|
RBS::AST::Members::MethodDefinition,
|
274
318
|
RBS::AST::Members::Alias,
|
275
319
|
)).returns(T.nilable(String))
|