ruby-lsp 0.23.11 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +18 -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 +106 -236
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +155 -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 -8
- 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 +170 -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 +73 -86
- data/lib/ruby_lsp/base_server.rb +41 -42
- data/lib/ruby_lsp/client_capabilities.rb +16 -13
- data/lib/ruby_lsp/document.rb +201 -98
- 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 +76 -74
- 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 +203 -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 +30 -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 +266 -143
- data/lib/ruby_lsp/setup_bundler.rb +113 -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 +236 -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,76 +3,61 @@
|
|
|
3
3
|
|
|
4
4
|
module RubyIndexer
|
|
5
5
|
class Entry
|
|
6
|
-
|
|
7
|
-
enums do
|
|
8
|
-
PUBLIC = new(:public)
|
|
9
|
-
PROTECTED = new(:protected)
|
|
10
|
-
PRIVATE = new(:private)
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
extend T::Sig
|
|
15
|
-
|
|
16
|
-
sig { returns(String) }
|
|
6
|
+
#: String
|
|
17
7
|
attr_reader :name
|
|
18
8
|
|
|
19
|
-
|
|
9
|
+
#: URI::Generic
|
|
20
10
|
attr_reader :uri
|
|
21
11
|
|
|
22
|
-
|
|
12
|
+
#: RubyIndexer::Location
|
|
23
13
|
attr_reader :location
|
|
24
14
|
|
|
25
15
|
alias_method :name_location, :location
|
|
26
16
|
|
|
27
|
-
|
|
17
|
+
#: Symbol
|
|
28
18
|
attr_accessor :visibility
|
|
29
19
|
|
|
30
|
-
|
|
31
|
-
params(
|
|
32
|
-
name: String,
|
|
33
|
-
uri: URI::Generic,
|
|
34
|
-
location: Location,
|
|
35
|
-
comments: T.nilable(String),
|
|
36
|
-
).void
|
|
37
|
-
end
|
|
20
|
+
#: (String name, URI::Generic uri, Location location, String? comments) -> void
|
|
38
21
|
def initialize(name, uri, location, comments)
|
|
39
22
|
@name = name
|
|
40
23
|
@uri = uri
|
|
41
24
|
@comments = comments
|
|
42
|
-
@visibility =
|
|
25
|
+
@visibility = :public #: Symbol
|
|
43
26
|
@location = location
|
|
44
27
|
end
|
|
45
28
|
|
|
46
|
-
|
|
29
|
+
#: -> bool
|
|
47
30
|
def public?
|
|
48
|
-
visibility ==
|
|
31
|
+
@visibility == :public
|
|
49
32
|
end
|
|
50
33
|
|
|
51
|
-
|
|
34
|
+
#: -> bool
|
|
52
35
|
def protected?
|
|
53
|
-
visibility ==
|
|
36
|
+
@visibility == :protected
|
|
54
37
|
end
|
|
55
38
|
|
|
56
|
-
|
|
39
|
+
#: -> bool
|
|
57
40
|
def private?
|
|
58
|
-
visibility ==
|
|
41
|
+
@visibility == :private
|
|
59
42
|
end
|
|
60
43
|
|
|
61
|
-
|
|
44
|
+
#: -> String
|
|
62
45
|
def file_name
|
|
63
46
|
if @uri.scheme == "untitled"
|
|
64
|
-
|
|
47
|
+
@uri.opaque #: as !nil
|
|
65
48
|
else
|
|
66
|
-
File.basename(
|
|
49
|
+
File.basename(
|
|
50
|
+
file_path, #: as !nil
|
|
51
|
+
)
|
|
67
52
|
end
|
|
68
53
|
end
|
|
69
54
|
|
|
70
|
-
|
|
55
|
+
#: -> String?
|
|
71
56
|
def file_path
|
|
72
57
|
@uri.full_path
|
|
73
58
|
end
|
|
74
59
|
|
|
75
|
-
|
|
60
|
+
#: -> String
|
|
76
61
|
def comments
|
|
77
62
|
@comments ||= begin
|
|
78
63
|
# Parse only the comments based on the file path, which is much faster than parsing the entire file
|
|
@@ -113,16 +98,12 @@ module RubyIndexer
|
|
|
113
98
|
end
|
|
114
99
|
end
|
|
115
100
|
|
|
101
|
+
# @abstract
|
|
116
102
|
class ModuleOperation
|
|
117
|
-
|
|
118
|
-
extend T::Helpers
|
|
119
|
-
|
|
120
|
-
abstract!
|
|
121
|
-
|
|
122
|
-
sig { returns(String) }
|
|
103
|
+
#: String
|
|
123
104
|
attr_reader :module_name
|
|
124
105
|
|
|
125
|
-
|
|
106
|
+
#: (String module_name) -> void
|
|
126
107
|
def initialize(module_name)
|
|
127
108
|
@module_name = module_name
|
|
128
109
|
end
|
|
@@ -131,30 +112,18 @@ module RubyIndexer
|
|
|
131
112
|
class Include < ModuleOperation; end
|
|
132
113
|
class Prepend < ModuleOperation; end
|
|
133
114
|
|
|
115
|
+
# @abstract
|
|
134
116
|
class Namespace < Entry
|
|
135
|
-
|
|
136
|
-
extend T::Helpers
|
|
137
|
-
|
|
138
|
-
abstract!
|
|
139
|
-
|
|
140
|
-
sig { returns(T::Array[String]) }
|
|
117
|
+
#: Array[String]
|
|
141
118
|
attr_reader :nesting
|
|
142
119
|
|
|
143
120
|
# Returns the location of the constant name, excluding the parent class or the body
|
|
144
|
-
|
|
121
|
+
#: Location
|
|
145
122
|
attr_reader :name_location
|
|
146
123
|
|
|
147
|
-
|
|
148
|
-
params(
|
|
149
|
-
nesting: T::Array[String],
|
|
150
|
-
uri: URI::Generic,
|
|
151
|
-
location: Location,
|
|
152
|
-
name_location: Location,
|
|
153
|
-
comments: T.nilable(String),
|
|
154
|
-
).void
|
|
155
|
-
end
|
|
124
|
+
#: (Array[String] nesting, URI::Generic uri, Location location, Location name_location, String? comments) -> void
|
|
156
125
|
def initialize(nesting, uri, location, name_location, comments)
|
|
157
|
-
@name =
|
|
126
|
+
@name = nesting.join("::") #: String
|
|
158
127
|
# The original nesting where this namespace was discovered
|
|
159
128
|
@nesting = nesting
|
|
160
129
|
|
|
@@ -163,7 +132,7 @@ module RubyIndexer
|
|
|
163
132
|
@name_location = name_location
|
|
164
133
|
end
|
|
165
134
|
|
|
166
|
-
|
|
135
|
+
#: -> Array[String]
|
|
167
136
|
def mixin_operation_module_names
|
|
168
137
|
mixin_operations.map(&:module_name)
|
|
169
138
|
end
|
|
@@ -171,12 +140,12 @@ module RubyIndexer
|
|
|
171
140
|
# Stores all explicit prepend, include and extend operations in the exact order they were discovered in the source
|
|
172
141
|
# code. Maintaining the order is essential to linearize ancestors the right way when a module is both included
|
|
173
142
|
# and prepended
|
|
174
|
-
|
|
143
|
+
#: -> Array[ModuleOperation]
|
|
175
144
|
def mixin_operations
|
|
176
|
-
@mixin_operations ||=
|
|
145
|
+
@mixin_operations ||= [] #: Array[ModuleOperation]?
|
|
177
146
|
end
|
|
178
147
|
|
|
179
|
-
|
|
148
|
+
#: -> Integer
|
|
180
149
|
def ancestor_hash
|
|
181
150
|
mixin_operation_module_names.hash
|
|
182
151
|
end
|
|
@@ -186,44 +155,26 @@ module RubyIndexer
|
|
|
186
155
|
end
|
|
187
156
|
|
|
188
157
|
class Class < Namespace
|
|
189
|
-
extend T::Sig
|
|
190
|
-
|
|
191
158
|
# The unresolved name of the parent class. This may return `nil`, which indicates the lack of an explicit parent
|
|
192
159
|
# and therefore ::Object is the correct parent class
|
|
193
|
-
|
|
160
|
+
#: String?
|
|
194
161
|
attr_reader :parent_class
|
|
195
162
|
|
|
196
|
-
|
|
197
|
-
params(
|
|
198
|
-
nesting: T::Array[String],
|
|
199
|
-
uri: URI::Generic,
|
|
200
|
-
location: Location,
|
|
201
|
-
name_location: Location,
|
|
202
|
-
comments: T.nilable(String),
|
|
203
|
-
parent_class: T.nilable(String),
|
|
204
|
-
).void
|
|
205
|
-
end
|
|
163
|
+
#: (Array[String] nesting, URI::Generic uri, Location location, Location name_location, String? comments, String? parent_class) -> void
|
|
206
164
|
def initialize(nesting, uri, location, name_location, comments, parent_class) # rubocop:disable Metrics/ParameterLists
|
|
207
165
|
super(nesting, uri, location, name_location, comments)
|
|
208
166
|
@parent_class = parent_class
|
|
209
167
|
end
|
|
210
168
|
|
|
211
|
-
|
|
169
|
+
# @override
|
|
170
|
+
#: -> Integer
|
|
212
171
|
def ancestor_hash
|
|
213
172
|
[mixin_operation_module_names, @parent_class].hash
|
|
214
173
|
end
|
|
215
174
|
end
|
|
216
175
|
|
|
217
176
|
class SingletonClass < Class
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
sig do
|
|
221
|
-
params(
|
|
222
|
-
location: Location,
|
|
223
|
-
name_location: Location,
|
|
224
|
-
comments: T.nilable(String),
|
|
225
|
-
).void
|
|
226
|
-
end
|
|
177
|
+
#: (Location location, Location name_location, String? comments) -> void
|
|
227
178
|
def update_singleton_information(location, name_location, comments)
|
|
228
179
|
@location = location
|
|
229
180
|
@name_location = name_location
|
|
@@ -234,20 +185,16 @@ module RubyIndexer
|
|
|
234
185
|
class Constant < Entry
|
|
235
186
|
end
|
|
236
187
|
|
|
188
|
+
# @abstract
|
|
237
189
|
class Parameter
|
|
238
|
-
extend T::Helpers
|
|
239
|
-
extend T::Sig
|
|
240
|
-
|
|
241
|
-
abstract!
|
|
242
|
-
|
|
243
190
|
# Name includes just the name of the parameter, excluding symbols like splats
|
|
244
|
-
|
|
191
|
+
#: Symbol
|
|
245
192
|
attr_reader :name
|
|
246
193
|
|
|
247
194
|
# Decorated name is the parameter name including the splat or block prefix, e.g.: `*foo`, `**foo` or `&block`
|
|
248
195
|
alias_method :decorated_name, :name
|
|
249
196
|
|
|
250
|
-
|
|
197
|
+
#: (name: Symbol) -> void
|
|
251
198
|
def initialize(name:)
|
|
252
199
|
@name = name
|
|
253
200
|
end
|
|
@@ -259,7 +206,8 @@ module RubyIndexer
|
|
|
259
206
|
|
|
260
207
|
# An optional method parameter, e.g. `def foo(a = 123)`
|
|
261
208
|
class OptionalParameter < Parameter
|
|
262
|
-
|
|
209
|
+
# @override
|
|
210
|
+
#: -> Symbol
|
|
263
211
|
def decorated_name
|
|
264
212
|
:"#{@name} = <default>"
|
|
265
213
|
end
|
|
@@ -267,7 +215,8 @@ module RubyIndexer
|
|
|
267
215
|
|
|
268
216
|
# An required keyword method parameter, e.g. `def foo(a:)`
|
|
269
217
|
class KeywordParameter < Parameter
|
|
270
|
-
|
|
218
|
+
# @override
|
|
219
|
+
#: -> Symbol
|
|
271
220
|
def decorated_name
|
|
272
221
|
:"#{@name}:"
|
|
273
222
|
end
|
|
@@ -275,7 +224,8 @@ module RubyIndexer
|
|
|
275
224
|
|
|
276
225
|
# An optional keyword method parameter, e.g. `def foo(a: 123)`
|
|
277
226
|
class OptionalKeywordParameter < Parameter
|
|
278
|
-
|
|
227
|
+
# @override
|
|
228
|
+
#: -> Symbol
|
|
279
229
|
def decorated_name
|
|
280
230
|
:"#{@name}: <default>"
|
|
281
231
|
end
|
|
@@ -283,9 +233,10 @@ module RubyIndexer
|
|
|
283
233
|
|
|
284
234
|
# A rest method parameter, e.g. `def foo(*a)`
|
|
285
235
|
class RestParameter < Parameter
|
|
286
|
-
DEFAULT_NAME =
|
|
236
|
+
DEFAULT_NAME = :"<anonymous splat>" #: Symbol
|
|
287
237
|
|
|
288
|
-
|
|
238
|
+
# @override
|
|
239
|
+
#: -> Symbol
|
|
289
240
|
def decorated_name
|
|
290
241
|
:"*#{@name}"
|
|
291
242
|
end
|
|
@@ -293,9 +244,10 @@ module RubyIndexer
|
|
|
293
244
|
|
|
294
245
|
# A keyword rest method parameter, e.g. `def foo(**a)`
|
|
295
246
|
class KeywordRestParameter < Parameter
|
|
296
|
-
DEFAULT_NAME =
|
|
247
|
+
DEFAULT_NAME = :"<anonymous keyword splat>" #: Symbol
|
|
297
248
|
|
|
298
|
-
|
|
249
|
+
# @override
|
|
250
|
+
#: -> Symbol
|
|
299
251
|
def decorated_name
|
|
300
252
|
:"**#{@name}"
|
|
301
253
|
end
|
|
@@ -303,17 +255,17 @@ module RubyIndexer
|
|
|
303
255
|
|
|
304
256
|
# A block method parameter, e.g. `def foo(&block)`
|
|
305
257
|
class BlockParameter < Parameter
|
|
306
|
-
DEFAULT_NAME =
|
|
258
|
+
DEFAULT_NAME = :"<anonymous block>" #: Symbol
|
|
307
259
|
|
|
308
260
|
class << self
|
|
309
|
-
|
|
310
|
-
sig { returns(BlockParameter) }
|
|
261
|
+
#: -> BlockParameter
|
|
311
262
|
def anonymous
|
|
312
263
|
new(name: DEFAULT_NAME)
|
|
313
264
|
end
|
|
314
265
|
end
|
|
315
266
|
|
|
316
|
-
|
|
267
|
+
# @override
|
|
268
|
+
#: -> Symbol
|
|
317
269
|
def decorated_name
|
|
318
270
|
:"&#{@name}"
|
|
319
271
|
end
|
|
@@ -321,44 +273,32 @@ module RubyIndexer
|
|
|
321
273
|
|
|
322
274
|
# A forwarding method parameter, e.g. `def foo(...)`
|
|
323
275
|
class ForwardingParameter < Parameter
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
sig { void }
|
|
276
|
+
#: -> void
|
|
327
277
|
def initialize
|
|
328
278
|
# You can't name a forwarding parameter, it's always called `...`
|
|
329
279
|
super(name: :"...")
|
|
330
280
|
end
|
|
331
281
|
end
|
|
332
282
|
|
|
283
|
+
# @abstract
|
|
333
284
|
class Member < Entry
|
|
334
|
-
|
|
335
|
-
extend T::Helpers
|
|
336
|
-
|
|
337
|
-
abstract!
|
|
338
|
-
|
|
339
|
-
sig { returns(T.nilable(Entry::Namespace)) }
|
|
285
|
+
#: Entry::Namespace?
|
|
340
286
|
attr_reader :owner
|
|
341
287
|
|
|
342
|
-
|
|
343
|
-
params(
|
|
344
|
-
name: String,
|
|
345
|
-
uri: URI::Generic,
|
|
346
|
-
location: Location,
|
|
347
|
-
comments: T.nilable(String),
|
|
348
|
-
visibility: Visibility,
|
|
349
|
-
owner: T.nilable(Entry::Namespace),
|
|
350
|
-
).void
|
|
351
|
-
end
|
|
288
|
+
#: (String name, URI::Generic uri, Location location, String? comments, Symbol visibility, Entry::Namespace? owner) -> void
|
|
352
289
|
def initialize(name, uri, location, comments, visibility, owner) # rubocop:disable Metrics/ParameterLists
|
|
353
290
|
super(name, uri, location, comments)
|
|
354
291
|
@visibility = visibility
|
|
355
292
|
@owner = owner
|
|
356
293
|
end
|
|
357
294
|
|
|
358
|
-
|
|
359
|
-
|
|
295
|
+
# @abstract
|
|
296
|
+
#: -> Array[Signature]
|
|
297
|
+
def signatures
|
|
298
|
+
raise AbstractMethodInvokedError
|
|
299
|
+
end
|
|
360
300
|
|
|
361
|
-
|
|
301
|
+
#: -> String
|
|
362
302
|
def decorated_parameters
|
|
363
303
|
first_signature = signatures.first
|
|
364
304
|
return "()" unless first_signature
|
|
@@ -366,7 +306,7 @@ module RubyIndexer
|
|
|
366
306
|
"(#{first_signature.format})"
|
|
367
307
|
end
|
|
368
308
|
|
|
369
|
-
|
|
309
|
+
#: -> String
|
|
370
310
|
def formatted_signatures
|
|
371
311
|
overloads_count = signatures.size
|
|
372
312
|
case overloads_count
|
|
@@ -381,43 +321,26 @@ module RubyIndexer
|
|
|
381
321
|
end
|
|
382
322
|
|
|
383
323
|
class Accessor < Member
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
sig { override.returns(T::Array[Signature]) }
|
|
324
|
+
# @override
|
|
325
|
+
#: -> Array[Signature]
|
|
387
326
|
def signatures
|
|
388
|
-
@signatures ||=
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
end,
|
|
394
|
-
T.nilable(T::Array[Signature]),
|
|
395
|
-
)
|
|
327
|
+
@signatures ||= begin
|
|
328
|
+
params = []
|
|
329
|
+
params << RequiredParameter.new(name: name.delete_suffix("=").to_sym) if name.end_with?("=")
|
|
330
|
+
[Entry::Signature.new(params)]
|
|
331
|
+
end #: Array[Signature]?
|
|
396
332
|
end
|
|
397
333
|
end
|
|
398
334
|
|
|
399
335
|
class Method < Member
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
sig { override.returns(T::Array[Signature]) }
|
|
336
|
+
#: Array[Signature]
|
|
403
337
|
attr_reader :signatures
|
|
404
338
|
|
|
405
339
|
# Returns the location of the method name, excluding parameters or the body
|
|
406
|
-
|
|
340
|
+
#: Location
|
|
407
341
|
attr_reader :name_location
|
|
408
342
|
|
|
409
|
-
|
|
410
|
-
params(
|
|
411
|
-
name: String,
|
|
412
|
-
uri: URI::Generic,
|
|
413
|
-
location: Location,
|
|
414
|
-
name_location: Location,
|
|
415
|
-
comments: T.nilable(String),
|
|
416
|
-
signatures: T::Array[Signature],
|
|
417
|
-
visibility: Visibility,
|
|
418
|
-
owner: T.nilable(Entry::Namespace),
|
|
419
|
-
).void
|
|
420
|
-
end
|
|
343
|
+
#: (String name, URI::Generic uri, Location location, Location name_location, String? comments, Array[Signature] signatures, Symbol visibility, Entry::Namespace? owner) -> void
|
|
421
344
|
def initialize(name, uri, location, name_location, comments, signatures, visibility, owner) # rubocop:disable Metrics/ParameterLists
|
|
422
345
|
super(name, uri, location, comments, visibility, owner)
|
|
423
346
|
@signatures = signatures
|
|
@@ -436,24 +359,13 @@ module RubyIndexer
|
|
|
436
359
|
# target in [rdoc-ref:Index#resolve]. If the right hand side contains a constant that doesn't exist, then it's not
|
|
437
360
|
# possible to resolve the alias and it will remain an UnresolvedAlias until the right hand side constant exists
|
|
438
361
|
class UnresolvedConstantAlias < Entry
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
sig { returns(String) }
|
|
362
|
+
#: String
|
|
442
363
|
attr_reader :target
|
|
443
364
|
|
|
444
|
-
|
|
365
|
+
#: Array[String]
|
|
445
366
|
attr_reader :nesting
|
|
446
367
|
|
|
447
|
-
|
|
448
|
-
params(
|
|
449
|
-
target: String,
|
|
450
|
-
nesting: T::Array[String],
|
|
451
|
-
name: String,
|
|
452
|
-
uri: URI::Generic,
|
|
453
|
-
location: Location,
|
|
454
|
-
comments: T.nilable(String),
|
|
455
|
-
).void
|
|
456
|
-
end
|
|
368
|
+
#: (String target, Array[String] nesting, String name, URI::Generic uri, Location location, String? comments) -> void
|
|
457
369
|
def initialize(target, nesting, name, uri, location, comments) # rubocop:disable Metrics/ParameterLists
|
|
458
370
|
super(name, uri, location, comments)
|
|
459
371
|
|
|
@@ -464,12 +376,10 @@ module RubyIndexer
|
|
|
464
376
|
|
|
465
377
|
# Alias represents a resolved alias, which points to an existing constant target
|
|
466
378
|
class ConstantAlias < Entry
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
sig { returns(String) }
|
|
379
|
+
#: String
|
|
470
380
|
attr_reader :target
|
|
471
381
|
|
|
472
|
-
|
|
382
|
+
#: (String target, UnresolvedConstantAlias unresolved_alias) -> void
|
|
473
383
|
def initialize(target, unresolved_alias)
|
|
474
384
|
super(
|
|
475
385
|
unresolved_alias.name,
|
|
@@ -488,18 +398,10 @@ module RubyIndexer
|
|
|
488
398
|
|
|
489
399
|
# Represents a class variable e.g.: @@a = 1
|
|
490
400
|
class ClassVariable < Entry
|
|
491
|
-
|
|
401
|
+
#: Entry::Namespace?
|
|
492
402
|
attr_reader :owner
|
|
493
403
|
|
|
494
|
-
|
|
495
|
-
params(
|
|
496
|
-
name: String,
|
|
497
|
-
uri: URI::Generic,
|
|
498
|
-
location: Location,
|
|
499
|
-
comments: T.nilable(String),
|
|
500
|
-
owner: T.nilable(Entry::Namespace),
|
|
501
|
-
).void
|
|
502
|
-
end
|
|
404
|
+
#: (String name, URI::Generic uri, Location location, String? comments, Entry::Namespace? owner) -> void
|
|
503
405
|
def initialize(name, uri, location, comments, owner)
|
|
504
406
|
super(name, uri, location, comments)
|
|
505
407
|
@owner = owner
|
|
@@ -508,18 +410,10 @@ module RubyIndexer
|
|
|
508
410
|
|
|
509
411
|
# Represents an instance variable e.g.: @a = 1
|
|
510
412
|
class InstanceVariable < Entry
|
|
511
|
-
|
|
413
|
+
#: Entry::Namespace?
|
|
512
414
|
attr_reader :owner
|
|
513
415
|
|
|
514
|
-
|
|
515
|
-
params(
|
|
516
|
-
name: String,
|
|
517
|
-
uri: URI::Generic,
|
|
518
|
-
location: Location,
|
|
519
|
-
comments: T.nilable(String),
|
|
520
|
-
owner: T.nilable(Entry::Namespace),
|
|
521
|
-
).void
|
|
522
|
-
end
|
|
416
|
+
#: (String name, URI::Generic uri, Location location, String? comments, Entry::Namespace? owner) -> void
|
|
523
417
|
def initialize(name, uri, location, comments, owner)
|
|
524
418
|
super(name, uri, location, comments)
|
|
525
419
|
@owner = owner
|
|
@@ -530,24 +424,13 @@ module RubyIndexer
|
|
|
530
424
|
# example, if we have `alias a b`, we create an unresolved alias for `a` because we aren't sure immediate what `b`
|
|
531
425
|
# is referring to
|
|
532
426
|
class UnresolvedMethodAlias < Entry
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
sig { returns(String) }
|
|
427
|
+
#: String
|
|
536
428
|
attr_reader :new_name, :old_name
|
|
537
429
|
|
|
538
|
-
|
|
430
|
+
#: Entry::Namespace?
|
|
539
431
|
attr_reader :owner
|
|
540
432
|
|
|
541
|
-
|
|
542
|
-
params(
|
|
543
|
-
new_name: String,
|
|
544
|
-
old_name: String,
|
|
545
|
-
owner: T.nilable(Entry::Namespace),
|
|
546
|
-
uri: URI::Generic,
|
|
547
|
-
location: Location,
|
|
548
|
-
comments: T.nilable(String),
|
|
549
|
-
).void
|
|
550
|
-
end
|
|
433
|
+
#: (String new_name, String old_name, Entry::Namespace? owner, URI::Generic uri, Location location, String? comments) -> void
|
|
551
434
|
def initialize(new_name, old_name, owner, uri, location, comments) # rubocop:disable Metrics/ParameterLists
|
|
552
435
|
super(new_name, uri, location, comments)
|
|
553
436
|
|
|
@@ -559,17 +442,13 @@ module RubyIndexer
|
|
|
559
442
|
|
|
560
443
|
# A method alias is a resolved alias entry that points to the exact method target it refers to
|
|
561
444
|
class MethodAlias < Entry
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
sig { returns(T.any(Member, MethodAlias)) }
|
|
445
|
+
#: (Member | MethodAlias)
|
|
565
446
|
attr_reader :target
|
|
566
447
|
|
|
567
|
-
|
|
448
|
+
#: Entry::Namespace?
|
|
568
449
|
attr_reader :owner
|
|
569
450
|
|
|
570
|
-
|
|
571
|
-
params(target: T.any(Member, MethodAlias), unresolved_alias: UnresolvedMethodAlias).void
|
|
572
|
-
end
|
|
451
|
+
#: ((Member | MethodAlias) target, UnresolvedMethodAlias unresolved_alias) -> void
|
|
573
452
|
def initialize(target, unresolved_alias)
|
|
574
453
|
full_comments = +"Alias for #{target.name}\n"
|
|
575
454
|
full_comments << "#{unresolved_alias.comments}\n"
|
|
@@ -583,20 +462,20 @@ module RubyIndexer
|
|
|
583
462
|
)
|
|
584
463
|
|
|
585
464
|
@target = target
|
|
586
|
-
@owner =
|
|
465
|
+
@owner = unresolved_alias.owner #: Entry::Namespace?
|
|
587
466
|
end
|
|
588
467
|
|
|
589
|
-
|
|
468
|
+
#: -> String
|
|
590
469
|
def decorated_parameters
|
|
591
470
|
@target.decorated_parameters
|
|
592
471
|
end
|
|
593
472
|
|
|
594
|
-
|
|
473
|
+
#: -> String
|
|
595
474
|
def formatted_signatures
|
|
596
475
|
@target.formatted_signatures
|
|
597
476
|
end
|
|
598
477
|
|
|
599
|
-
|
|
478
|
+
#: -> Array[Signature]
|
|
600
479
|
def signatures
|
|
601
480
|
@target.signatures
|
|
602
481
|
end
|
|
@@ -606,18 +485,16 @@ module RubyIndexer
|
|
|
606
485
|
# However RBS can represent the concept of method overloading, with different return types based on the arguments
|
|
607
486
|
# passed, so we need to store all the signatures.
|
|
608
487
|
class Signature
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
sig { returns(T::Array[Parameter]) }
|
|
488
|
+
#: Array[Parameter]
|
|
612
489
|
attr_reader :parameters
|
|
613
490
|
|
|
614
|
-
|
|
491
|
+
#: (Array[Parameter] parameters) -> void
|
|
615
492
|
def initialize(parameters)
|
|
616
493
|
@parameters = parameters
|
|
617
494
|
end
|
|
618
495
|
|
|
619
496
|
# Returns a string with the decorated names of the parameters of this member. E.g.: `(a, b = 1, c: 2)`
|
|
620
|
-
|
|
497
|
+
#: -> String
|
|
621
498
|
def format
|
|
622
499
|
@parameters.map(&:decorated_name).join(", ")
|
|
623
500
|
end
|
|
@@ -637,13 +514,13 @@ module RubyIndexer
|
|
|
637
514
|
# foo(1)
|
|
638
515
|
# foo(1, 2)
|
|
639
516
|
# ```
|
|
640
|
-
|
|
517
|
+
#: (Array[Prism::Node] arguments) -> bool
|
|
641
518
|
def matches?(arguments)
|
|
642
519
|
min_pos = 0
|
|
643
|
-
max_pos =
|
|
520
|
+
max_pos = 0 #: (Integer | Float)
|
|
644
521
|
names = []
|
|
645
|
-
has_forward =
|
|
646
|
-
has_keyword_rest =
|
|
522
|
+
has_forward = false #: bool
|
|
523
|
+
has_keyword_rest = false #: bool
|
|
647
524
|
|
|
648
525
|
@parameters.each do |param|
|
|
649
526
|
case param
|
|
@@ -665,7 +542,8 @@ module RubyIndexer
|
|
|
665
542
|
end
|
|
666
543
|
|
|
667
544
|
keyword_hash_nodes, positional_args = arguments.partition { |arg| arg.is_a?(Prism::KeywordHashNode) }
|
|
668
|
-
keyword_args =
|
|
545
|
+
keyword_args = keyword_hash_nodes.first #: as Prism::KeywordHashNode?
|
|
546
|
+
&.elements
|
|
669
547
|
forwarding_arguments, positionals = positional_args.partition do |arg|
|
|
670
548
|
arg.is_a?(Prism::ForwardingArgumentsNode)
|
|
671
549
|
end
|
|
@@ -688,15 +566,7 @@ module RubyIndexer
|
|
|
688
566
|
)
|
|
689
567
|
end
|
|
690
568
|
|
|
691
|
-
|
|
692
|
-
params(
|
|
693
|
-
positional_args: T::Array[Prism::Node],
|
|
694
|
-
forwarding_arguments: T::Array[Prism::Node],
|
|
695
|
-
keyword_args: T.nilable(T::Array[Prism::Node]),
|
|
696
|
-
min_pos: Integer,
|
|
697
|
-
max_pos: T.any(Integer, Float),
|
|
698
|
-
).returns(T::Boolean)
|
|
699
|
-
end
|
|
569
|
+
#: (Array[Prism::Node] positional_args, Array[Prism::Node] forwarding_arguments, Array[Prism::Node]? keyword_args, Integer min_pos, (Integer | Float) max_pos) -> bool
|
|
700
570
|
def positional_arguments_match?(positional_args, forwarding_arguments, keyword_args, min_pos, max_pos)
|
|
701
571
|
# If the method accepts at least one positional argument and a splat has been passed
|
|
702
572
|
(min_pos > 0 && positional_args.any? { |arg| arg.is_a?(Prism::SplatNode) }) ||
|
|
@@ -709,7 +579,7 @@ module RubyIndexer
|
|
|
709
579
|
(min_pos == 0 && positional_args.empty?)
|
|
710
580
|
end
|
|
711
581
|
|
|
712
|
-
|
|
582
|
+
#: (Array[Prism::Node]? args, Array[Symbol] names) -> bool
|
|
713
583
|
def keyword_arguments_match?(args, names)
|
|
714
584
|
return true unless args
|
|
715
585
|
return true if args.any? { |arg| arg.is_a?(Prism::AssocSplatNode) }
|