ruby-lsp 0.10.1 → 0.11.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 +4 -4
- data/VERSION +1 -1
- data/exe/ruby-lsp-check +1 -1
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +35 -5
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +141 -5
- data/lib/ruby_indexer/lib/ruby_indexer/visitor.rb +66 -18
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +23 -0
- data/lib/ruby_indexer/test/configuration_test.rb +2 -0
- data/lib/ruby_indexer/test/constant_test.rb +202 -0
- data/lib/ruby_indexer/test/index_test.rb +20 -0
- data/lib/ruby_lsp/{extension.rb → addon.rb} +27 -25
- data/lib/ruby_lsp/check_docs.rb +7 -8
- data/lib/ruby_lsp/document.rb +35 -38
- data/lib/ruby_lsp/event_emitter.rb +239 -77
- data/lib/ruby_lsp/executor.rb +45 -55
- data/lib/ruby_lsp/internal.rb +2 -3
- data/lib/ruby_lsp/listener.rb +8 -7
- data/lib/ruby_lsp/parameter_scope.rb +33 -0
- data/lib/ruby_lsp/requests/base_request.rb +3 -3
- data/lib/ruby_lsp/requests/code_action_resolve.rb +14 -14
- data/lib/ruby_lsp/requests/code_lens.rb +39 -63
- data/lib/ruby_lsp/requests/completion.rb +54 -32
- data/lib/ruby_lsp/requests/definition.rb +30 -27
- data/lib/ruby_lsp/requests/diagnostics.rb +26 -3
- data/lib/ruby_lsp/requests/document_highlight.rb +18 -19
- data/lib/ruby_lsp/requests/document_link.rb +50 -9
- data/lib/ruby_lsp/requests/document_symbol.rb +82 -75
- data/lib/ruby_lsp/requests/folding_ranges.rb +199 -222
- data/lib/ruby_lsp/requests/formatting.rb +5 -6
- data/lib/ruby_lsp/requests/hover.rb +33 -22
- data/lib/ruby_lsp/requests/inlay_hints.rb +2 -3
- data/lib/ruby_lsp/requests/selection_ranges.rb +65 -40
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +187 -145
- data/lib/ruby_lsp/requests/show_syntax_tree.rb +3 -4
- data/lib/ruby_lsp/requests/support/annotation.rb +18 -17
- data/lib/ruby_lsp/requests/support/common.rb +17 -26
- data/lib/ruby_lsp/requests/support/dependency_detector.rb +67 -42
- data/lib/ruby_lsp/requests/support/highlight_target.rb +64 -45
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +9 -4
- data/lib/ruby_lsp/requests/support/selection_range.rb +5 -4
- data/lib/ruby_lsp/requests/support/sorbet.rb +2 -57
- data/lib/ruby_lsp/requests/support/syntax_tree_formatting_runner.rb +7 -1
- data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -1
- data/lib/ruby_lsp/server.rb +6 -44
- data/lib/ruby_lsp/utils.rb +2 -12
- metadata +11 -30
@@ -2,7 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module RubyLsp
|
5
|
-
# EventEmitter is an intermediary between our requests and
|
5
|
+
# EventEmitter is an intermediary between our requests and YARP visitors. It's used to visit the document's AST
|
6
6
|
# and emit events that the requests can listen to for providing functionality. Usages:
|
7
7
|
#
|
8
8
|
# - For positional requests, locate the target node and use `emit_for_target` to fire events for each listener
|
@@ -18,9 +18,8 @@ module RubyLsp
|
|
18
18
|
# emitter.emit_for_target(target_node)
|
19
19
|
# listener.response
|
20
20
|
# ```
|
21
|
-
class EventEmitter <
|
21
|
+
class EventEmitter < YARP::Visitor
|
22
22
|
extend T::Sig
|
23
|
-
include SyntaxTree::WithScope
|
24
23
|
|
25
24
|
sig { void }
|
26
25
|
def initialize
|
@@ -35,154 +34,317 @@ module RubyLsp
|
|
35
34
|
|
36
35
|
# Emit events for a specific node. This is similar to the regular `visit` method, but avoids going deeper into the
|
37
36
|
# tree for performance
|
38
|
-
sig { params(node: T.nilable(
|
37
|
+
sig { params(node: T.nilable(YARP::Node)).void }
|
39
38
|
def emit_for_target(node)
|
40
39
|
case node
|
41
|
-
when
|
42
|
-
@listeners[:on_command]&.each { |l| T.unsafe(l).on_command(node) }
|
43
|
-
when SyntaxTree::CallNode
|
40
|
+
when YARP::CallNode
|
44
41
|
@listeners[:on_call]&.each { |l| T.unsafe(l).on_call(node) }
|
45
|
-
when
|
46
|
-
@listeners[:
|
47
|
-
when
|
48
|
-
@listeners[:
|
49
|
-
when
|
50
|
-
@listeners[:
|
51
|
-
when
|
52
|
-
@listeners[:
|
42
|
+
when YARP::ConstantPathNode
|
43
|
+
@listeners[:on_constant_path]&.each { |l| T.unsafe(l).on_constant_path(node) }
|
44
|
+
when YARP::StringNode
|
45
|
+
@listeners[:on_string]&.each { |l| T.unsafe(l).on_string(node) }
|
46
|
+
when YARP::ClassNode
|
47
|
+
@listeners[:on_class]&.each { |l| T.unsafe(l).on_class(node) }
|
48
|
+
when YARP::ModuleNode
|
49
|
+
@listeners[:on_module]&.each { |l| T.unsafe(l).on_module(node) }
|
50
|
+
when YARP::ConstantWriteNode
|
51
|
+
@listeners[:on_constant_write]&.each { |l| T.unsafe(l).on_constant_write(node) }
|
52
|
+
when YARP::ConstantReadNode
|
53
|
+
@listeners[:on_constant_read]&.each { |l| T.unsafe(l).on_constant_read(node) }
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
56
57
|
# Visit dispatchers are below. Notice that for nodes that create a new scope (e.g.: classes, modules, method defs)
|
57
58
|
# we need both an `on_*` and `after_*` event. This is because some requests must know when we exit the scope
|
58
|
-
sig { override.params(node: T.nilable(
|
59
|
+
sig { override.params(node: T.nilable(YARP::Node)).void }
|
59
60
|
def visit(node)
|
60
61
|
@listeners[:on_node]&.each { |l| T.unsafe(l).on_node(node) }
|
61
62
|
super
|
62
63
|
end
|
63
64
|
|
64
|
-
sig {
|
65
|
-
def
|
65
|
+
sig { params(nodes: T::Array[T.nilable(YARP::Node)]).void }
|
66
|
+
def visit_all(nodes)
|
67
|
+
nodes.each { |node| visit(node) }
|
68
|
+
end
|
69
|
+
|
70
|
+
sig { override.params(node: YARP::ClassNode).void }
|
71
|
+
def visit_class_node(node)
|
66
72
|
@listeners[:on_class]&.each { |l| T.unsafe(l).on_class(node) }
|
67
73
|
super
|
68
74
|
@listeners[:after_class]&.each { |l| T.unsafe(l).after_class(node) }
|
69
75
|
end
|
70
76
|
|
71
|
-
sig { override.params(node:
|
72
|
-
def
|
77
|
+
sig { override.params(node: YARP::ModuleNode).void }
|
78
|
+
def visit_module_node(node)
|
73
79
|
@listeners[:on_module]&.each { |l| T.unsafe(l).on_module(node) }
|
74
80
|
super
|
75
81
|
@listeners[:after_module]&.each { |l| T.unsafe(l).after_module(node) }
|
76
82
|
end
|
77
83
|
|
78
|
-
sig { override.params(node:
|
79
|
-
def
|
80
|
-
@listeners[:
|
84
|
+
sig { override.params(node: YARP::CallNode).void }
|
85
|
+
def visit_call_node(node)
|
86
|
+
@listeners[:on_call]&.each { |l| T.unsafe(l).on_call(node) }
|
81
87
|
super
|
82
|
-
@listeners[:
|
88
|
+
@listeners[:after_call]&.each { |l| T.unsafe(l).after_call(node) }
|
83
89
|
end
|
84
90
|
|
85
|
-
sig { override.params(node:
|
86
|
-
def
|
87
|
-
@listeners[:
|
91
|
+
sig { override.params(node: YARP::InstanceVariableWriteNode).void }
|
92
|
+
def visit_instance_variable_write_node(node)
|
93
|
+
@listeners[:on_instance_variable_write]&.each { |l| T.unsafe(l).on_instance_variable_write(node) }
|
88
94
|
super
|
89
95
|
end
|
90
96
|
|
91
|
-
sig { override.params(node:
|
92
|
-
def
|
93
|
-
@listeners[:
|
97
|
+
sig { override.params(node: YARP::ClassVariableWriteNode).void }
|
98
|
+
def visit_class_variable_write_node(node)
|
99
|
+
@listeners[:on_class_variable_write]&.each { |l| T.unsafe(l).on_class_variable_write(node) }
|
94
100
|
super
|
95
|
-
@listeners[:after_call]&.each { |l| T.unsafe(l).after_call(node) }
|
96
101
|
end
|
97
102
|
|
98
|
-
sig { override.params(node:
|
99
|
-
def
|
100
|
-
@listeners[:
|
103
|
+
sig { override.params(node: YARP::DefNode).void }
|
104
|
+
def visit_def_node(node)
|
105
|
+
@listeners[:on_def]&.each { |l| T.unsafe(l).on_def(node) }
|
101
106
|
super
|
107
|
+
@listeners[:after_def]&.each { |l| T.unsafe(l).after_def(node) }
|
102
108
|
end
|
103
109
|
|
104
|
-
sig { override.params(node:
|
105
|
-
def
|
106
|
-
@listeners[:
|
110
|
+
sig { override.params(node: YARP::BlockNode).void }
|
111
|
+
def visit_block_node(node)
|
112
|
+
@listeners[:on_block]&.each { |l| T.unsafe(l).on_block(node) }
|
107
113
|
super
|
114
|
+
@listeners[:after_block]&.each { |l| T.unsafe(l).after_block(node) }
|
108
115
|
end
|
109
116
|
|
110
|
-
sig { override.params(node:
|
111
|
-
def
|
112
|
-
@listeners[:
|
117
|
+
sig { override.params(node: YARP::SelfNode).void }
|
118
|
+
def visit_self_node(node)
|
119
|
+
@listeners[:on_self]&.each { |l| T.unsafe(l).on_self(node) }
|
113
120
|
super
|
114
121
|
end
|
115
122
|
|
116
|
-
sig { override.params(node:
|
117
|
-
def
|
118
|
-
@listeners[:
|
123
|
+
sig { override.params(node: YARP::RescueNode).void }
|
124
|
+
def visit_rescue_node(node)
|
125
|
+
@listeners[:on_rescue]&.each { |l| T.unsafe(l).on_rescue(node) }
|
119
126
|
super
|
120
|
-
@listeners[:after_def]&.each { |l| T.unsafe(l).after_def(node) }
|
121
127
|
end
|
122
128
|
|
123
|
-
sig { override.params(node:
|
124
|
-
def
|
125
|
-
@listeners[:
|
129
|
+
sig { override.params(node: YARP::BlockParameterNode).void }
|
130
|
+
def visit_block_parameter_node(node)
|
131
|
+
@listeners[:on_block_parameter]&.each { |l| T.unsafe(l).on_block_parameter(node) }
|
126
132
|
super
|
127
133
|
end
|
128
134
|
|
129
|
-
sig { override.params(node:
|
130
|
-
def
|
131
|
-
@listeners[:
|
135
|
+
sig { override.params(node: YARP::KeywordParameterNode).void }
|
136
|
+
def visit_keyword_parameter_node(node)
|
137
|
+
@listeners[:on_keyword_parameter]&.each { |l| T.unsafe(l).on_keyword_parameter(node) }
|
132
138
|
super
|
133
139
|
end
|
134
140
|
|
135
|
-
sig { override.params(node:
|
136
|
-
def
|
137
|
-
@listeners[:
|
141
|
+
sig { override.params(node: YARP::KeywordRestParameterNode).void }
|
142
|
+
def visit_keyword_rest_parameter_node(node)
|
143
|
+
@listeners[:on_keyword_rest_parameter]&.each { |l| T.unsafe(l).on_keyword_rest_parameter(node) }
|
144
|
+
super
|
145
|
+
end
|
146
|
+
|
147
|
+
sig { override.params(node: YARP::OptionalParameterNode).void }
|
148
|
+
def visit_optional_parameter_node(node)
|
149
|
+
@listeners[:on_optional_parameter]&.each { |l| T.unsafe(l).on_optional_parameter(node) }
|
150
|
+
super
|
151
|
+
end
|
152
|
+
|
153
|
+
sig { override.params(node: YARP::RequiredParameterNode).void }
|
154
|
+
def visit_required_parameter_node(node)
|
155
|
+
@listeners[:on_required_parameter]&.each { |l| T.unsafe(l).on_required_parameter(node) }
|
156
|
+
super
|
157
|
+
end
|
158
|
+
|
159
|
+
sig { override.params(node: YARP::RestParameterNode).void }
|
160
|
+
def visit_rest_parameter_node(node)
|
161
|
+
@listeners[:on_rest_parameter]&.each { |l| T.unsafe(l).on_rest_parameter(node) }
|
162
|
+
super
|
163
|
+
end
|
164
|
+
|
165
|
+
sig { override.params(node: YARP::ConstantReadNode).void }
|
166
|
+
def visit_constant_read_node(node)
|
167
|
+
@listeners[:on_constant_read]&.each { |l| T.unsafe(l).on_constant_read(node) }
|
168
|
+
super
|
169
|
+
end
|
170
|
+
|
171
|
+
sig { override.params(node: YARP::ConstantPathNode).void }
|
172
|
+
def visit_constant_path_node(node)
|
173
|
+
@listeners[:on_constant_path]&.each { |l| T.unsafe(l).on_constant_path(node) }
|
174
|
+
super
|
175
|
+
end
|
176
|
+
|
177
|
+
sig { override.params(node: YARP::ConstantPathWriteNode).void }
|
178
|
+
def visit_constant_path_write_node(node)
|
179
|
+
@listeners[:on_constant_path_write]&.each { |l| T.unsafe(l).on_constant_path_write(node) }
|
180
|
+
super
|
181
|
+
end
|
182
|
+
|
183
|
+
sig { override.params(node: YARP::ConstantWriteNode).void }
|
184
|
+
def visit_constant_write_node(node)
|
185
|
+
@listeners[:on_constant_write]&.each { |l| T.unsafe(l).on_constant_write(node) }
|
186
|
+
super
|
187
|
+
end
|
188
|
+
|
189
|
+
sig { override.params(node: YARP::ConstantAndWriteNode).void }
|
190
|
+
def visit_constant_and_write_node(node)
|
191
|
+
@listeners[:on_constant_and_write]&.each { |l| T.unsafe(l).on_constant_and_write(node) }
|
192
|
+
super
|
193
|
+
end
|
194
|
+
|
195
|
+
sig { override.params(node: YARP::ConstantOperatorWriteNode).void }
|
196
|
+
def visit_constant_operator_write_node(node)
|
197
|
+
@listeners[:on_constant_operator_write]&.each { |l| T.unsafe(l).on_constant_operator_write(node) }
|
198
|
+
super
|
199
|
+
end
|
200
|
+
|
201
|
+
sig { override.params(node: YARP::ConstantOrWriteNode).void }
|
202
|
+
def visit_constant_or_write_node(node)
|
203
|
+
@listeners[:on_constant_or_write]&.each { |l| T.unsafe(l).on_constant_or_write(node) }
|
204
|
+
super
|
205
|
+
end
|
206
|
+
|
207
|
+
sig { override.params(node: YARP::ConstantTargetNode).void }
|
208
|
+
def visit_constant_target_node(node)
|
209
|
+
@listeners[:on_constant_target]&.each { |l| T.unsafe(l).on_constant_target(node) }
|
210
|
+
super
|
211
|
+
end
|
212
|
+
|
213
|
+
sig { override.params(node: YARP::LocalVariableWriteNode).void }
|
214
|
+
def visit_local_variable_write_node(node)
|
215
|
+
@listeners[:on_local_variable_write]&.each { |l| T.unsafe(l).on_local_variable_write(node) }
|
216
|
+
super
|
217
|
+
end
|
218
|
+
|
219
|
+
sig { override.params(node: YARP::LocalVariableReadNode).void }
|
220
|
+
def visit_local_variable_read_node(node)
|
221
|
+
@listeners[:on_local_variable_read]&.each { |l| T.unsafe(l).on_local_variable_read(node) }
|
222
|
+
super
|
223
|
+
end
|
224
|
+
|
225
|
+
sig { override.params(node: YARP::LocalVariableAndWriteNode).void }
|
226
|
+
def visit_local_variable_and_write_node(node)
|
227
|
+
@listeners[:on_local_variable_and_write]&.each { |l| T.unsafe(l).on_local_variable_and_write(node) }
|
228
|
+
super
|
229
|
+
end
|
230
|
+
|
231
|
+
sig { override.params(node: YARP::LocalVariableOperatorWriteNode).void }
|
232
|
+
def visit_local_variable_operator_write_node(node)
|
233
|
+
@listeners[:on_local_variable_operator_write]&.each { |l| T.unsafe(l).on_local_variable_operator_write(node) }
|
234
|
+
super
|
235
|
+
end
|
236
|
+
|
237
|
+
sig { override.params(node: YARP::LocalVariableOrWriteNode).void }
|
238
|
+
def visit_local_variable_or_write_node(node)
|
239
|
+
@listeners[:on_local_variable_or_write]&.each { |l| T.unsafe(l).on_local_variable_or_write(node) }
|
240
|
+
super
|
241
|
+
end
|
242
|
+
|
243
|
+
sig { override.params(node: YARP::LocalVariableTargetNode).void }
|
244
|
+
def visit_local_variable_target_node(node)
|
245
|
+
@listeners[:on_local_variable_target]&.each { |l| T.unsafe(l).on_local_variable_target(node) }
|
246
|
+
super
|
247
|
+
end
|
248
|
+
|
249
|
+
sig { override.params(node: YARP::BlockLocalVariableNode).void }
|
250
|
+
def visit_block_local_variable_node(node)
|
251
|
+
@listeners[:on_block_local_variable]&.each { |l| T.unsafe(l).on_block_local_variable(node) }
|
252
|
+
super
|
253
|
+
end
|
254
|
+
|
255
|
+
sig { override.params(node: YARP::IfNode).void }
|
256
|
+
def visit_if_node(node)
|
257
|
+
@listeners[:on_if]&.each { |l| T.unsafe(l).on_if(node) }
|
258
|
+
super
|
259
|
+
end
|
260
|
+
|
261
|
+
sig { override.params(node: YARP::InNode).void }
|
262
|
+
def visit_in_node(node)
|
263
|
+
@listeners[:on_in]&.each { |l| T.unsafe(l).on_in(node) }
|
264
|
+
super
|
265
|
+
end
|
266
|
+
|
267
|
+
sig { override.params(node: YARP::WhenNode).void }
|
268
|
+
def visit_when_node(node)
|
269
|
+
@listeners[:on_when]&.each { |l| T.unsafe(l).on_when(node) }
|
270
|
+
super
|
271
|
+
end
|
272
|
+
|
273
|
+
sig { override.params(node: YARP::InterpolatedStringNode).void }
|
274
|
+
def visit_interpolated_string_node(node)
|
275
|
+
@listeners[:on_interpolated_string]&.each { |l| T.unsafe(l).on_interpolated_string(node) }
|
276
|
+
super
|
277
|
+
end
|
278
|
+
|
279
|
+
sig { override.params(node: YARP::ArrayNode).void }
|
280
|
+
def visit_array_node(node)
|
281
|
+
@listeners[:on_array]&.each { |l| T.unsafe(l).on_array(node) }
|
282
|
+
super
|
283
|
+
end
|
284
|
+
|
285
|
+
sig { override.params(node: YARP::CaseNode).void }
|
286
|
+
def visit_case_node(node)
|
287
|
+
@listeners[:on_case]&.each { |l| T.unsafe(l).on_case(node) }
|
288
|
+
super
|
289
|
+
end
|
290
|
+
|
291
|
+
sig { override.params(node: YARP::ForNode).void }
|
292
|
+
def visit_for_node(node)
|
293
|
+
@listeners[:on_for]&.each { |l| T.unsafe(l).on_for(node) }
|
294
|
+
super
|
295
|
+
end
|
296
|
+
|
297
|
+
sig { override.params(node: YARP::HashNode).void }
|
298
|
+
def visit_hash_node(node)
|
299
|
+
@listeners[:on_hash]&.each { |l| T.unsafe(l).on_hash(node) }
|
138
300
|
super
|
139
301
|
end
|
140
302
|
|
141
|
-
sig { override.params(node:
|
142
|
-
def
|
143
|
-
@listeners[:
|
303
|
+
sig { override.params(node: YARP::SingletonClassNode).void }
|
304
|
+
def visit_singleton_class_node(node)
|
305
|
+
@listeners[:on_singleton_class]&.each { |l| T.unsafe(l).on_singleton_class(node) }
|
144
306
|
super
|
145
307
|
end
|
146
308
|
|
147
|
-
sig { override.params(node:
|
148
|
-
def
|
149
|
-
@listeners[:
|
309
|
+
sig { override.params(node: YARP::UnlessNode).void }
|
310
|
+
def visit_unless_node(node)
|
311
|
+
@listeners[:on_unless]&.each { |l| T.unsafe(l).on_unless(node) }
|
150
312
|
super
|
151
313
|
end
|
152
314
|
|
153
|
-
sig { override.params(node:
|
154
|
-
def
|
155
|
-
@listeners[:
|
315
|
+
sig { override.params(node: YARP::UntilNode).void }
|
316
|
+
def visit_until_node(node)
|
317
|
+
@listeners[:on_until]&.each { |l| T.unsafe(l).on_until(node) }
|
156
318
|
super
|
157
319
|
end
|
158
320
|
|
159
|
-
sig { override.params(node:
|
160
|
-
def
|
161
|
-
@listeners[:
|
321
|
+
sig { override.params(node: YARP::WhileNode).void }
|
322
|
+
def visit_while_node(node)
|
323
|
+
@listeners[:on_while]&.each { |l| T.unsafe(l).on_while(node) }
|
162
324
|
super
|
163
325
|
end
|
164
326
|
|
165
|
-
sig { override.params(node:
|
166
|
-
def
|
167
|
-
@listeners[:
|
327
|
+
sig { override.params(node: YARP::ElseNode).void }
|
328
|
+
def visit_else_node(node)
|
329
|
+
@listeners[:on_else]&.each { |l| T.unsafe(l).on_else(node) }
|
168
330
|
super
|
169
331
|
end
|
170
332
|
|
171
|
-
sig { override.params(node:
|
172
|
-
def
|
173
|
-
@listeners[:
|
333
|
+
sig { override.params(node: YARP::EnsureNode).void }
|
334
|
+
def visit_ensure_node(node)
|
335
|
+
@listeners[:on_ensure]&.each { |l| T.unsafe(l).on_ensure(node) }
|
174
336
|
super
|
175
337
|
end
|
176
338
|
|
177
|
-
sig { override.params(node:
|
178
|
-
def
|
339
|
+
sig { override.params(node: YARP::BeginNode).void }
|
340
|
+
def visit_begin_node(node)
|
341
|
+
@listeners[:on_begin]&.each { |l| T.unsafe(l).on_begin(node) }
|
179
342
|
super
|
180
|
-
@listeners[:after_binary]&.each { |l| T.unsafe(l).after_binary(node) }
|
181
343
|
end
|
182
344
|
|
183
|
-
sig { override.params(node:
|
184
|
-
def
|
185
|
-
@listeners[:
|
345
|
+
sig { override.params(node: YARP::StringConcatNode).void }
|
346
|
+
def visit_string_concat_node(node)
|
347
|
+
@listeners[:on_string_concat]&.each { |l| T.unsafe(l).on_string_concat(node) }
|
186
348
|
super
|
187
349
|
end
|
188
350
|
end
|
data/lib/ruby_lsp/executor.rb
CHANGED
@@ -13,7 +13,6 @@ module RubyLsp
|
|
13
13
|
# Requests that mutate the store must be run sequentially! Parallel requests only receive a temporary copy of the
|
14
14
|
# store
|
15
15
|
@store = store
|
16
|
-
@test_library = T.let(DependencyDetector.detected_test_library, String)
|
17
16
|
@message_queue = message_queue
|
18
17
|
@index = T.let(RubyIndexer::Index.new, RubyIndexer::Index)
|
19
18
|
end
|
@@ -23,13 +22,13 @@ module RubyLsp
|
|
23
22
|
response = T.let(nil, T.untyped)
|
24
23
|
error = T.let(nil, T.nilable(Exception))
|
25
24
|
|
26
|
-
|
25
|
+
begin
|
27
26
|
response = run(request)
|
28
27
|
rescue StandardError, LoadError => e
|
29
28
|
error = e
|
30
29
|
end
|
31
30
|
|
32
|
-
Result.new(response: response, error: error
|
31
|
+
Result.new(response: response, error: error)
|
33
32
|
end
|
34
33
|
|
35
34
|
private
|
@@ -42,20 +41,20 @@ module RubyLsp
|
|
42
41
|
when "initialize"
|
43
42
|
initialize_request(request.dig(:params))
|
44
43
|
when "initialized"
|
45
|
-
|
44
|
+
Addon.load_addons
|
46
45
|
|
47
|
-
|
46
|
+
errored_addons = Addon.addons.select(&:error?)
|
48
47
|
|
49
|
-
if
|
48
|
+
if errored_addons.any?
|
50
49
|
@message_queue << Notification.new(
|
51
50
|
message: "window/showMessage",
|
52
51
|
params: Interface::ShowMessageParams.new(
|
53
52
|
type: Constant::MessageType::WARNING,
|
54
|
-
message: "Error loading
|
53
|
+
message: "Error loading addons:\n\n#{errored_addons.map(&:formatted_errors).join("\n\n")}",
|
55
54
|
),
|
56
55
|
)
|
57
56
|
|
58
|
-
warn(
|
57
|
+
warn(errored_addons.map(&:backtraces).join("\n\n"))
|
59
58
|
end
|
60
59
|
|
61
60
|
perform_initial_indexing
|
@@ -82,12 +81,10 @@ module RubyLsp
|
|
82
81
|
request.dig(:params, :contentChanges),
|
83
82
|
request.dig(:params, :textDocument, :version),
|
84
83
|
)
|
85
|
-
when "textDocument/foldingRange"
|
86
|
-
folding_range(uri)
|
87
84
|
when "textDocument/selectionRange"
|
88
85
|
selection_range(uri, request.dig(:params, :positions))
|
89
86
|
when "textDocument/documentSymbol", "textDocument/documentLink", "textDocument/codeLens",
|
90
|
-
"textDocument/semanticTokens/full"
|
87
|
+
"textDocument/semanticTokens/full", "textDocument/foldingRange"
|
91
88
|
document = @store.get(uri)
|
92
89
|
|
93
90
|
# If the response has already been cached by another request, return it
|
@@ -96,15 +93,17 @@ module RubyLsp
|
|
96
93
|
|
97
94
|
# Run listeners for the document
|
98
95
|
emitter = EventEmitter.new
|
96
|
+
folding_range = Requests::FoldingRanges.new(document.parse_result.comments, emitter, @message_queue)
|
99
97
|
document_symbol = Requests::DocumentSymbol.new(emitter, @message_queue)
|
100
|
-
document_link = Requests::DocumentLink.new(uri, emitter, @message_queue)
|
101
|
-
code_lens = Requests::CodeLens.new(uri, emitter, @message_queue
|
98
|
+
document_link = Requests::DocumentLink.new(uri, document.comments, emitter, @message_queue)
|
99
|
+
code_lens = Requests::CodeLens.new(uri, emitter, @message_queue)
|
102
100
|
|
103
101
|
semantic_highlighting = Requests::SemanticHighlighting.new(emitter, @message_queue)
|
104
|
-
emitter.visit(document.tree)
|
102
|
+
emitter.visit(document.tree)
|
105
103
|
|
106
104
|
# Store all responses retrieve in this round of visits in the cache and then return the response for the request
|
107
105
|
# we actually received
|
106
|
+
document.cache_set("textDocument/foldingRange", folding_range.response)
|
108
107
|
document.cache_set("textDocument/documentSymbol", document_symbol.response)
|
109
108
|
document.cache_set("textDocument/documentLink", document_link.response)
|
110
109
|
document.cache_set("textDocument/codeLens", code_lens.response)
|
@@ -246,28 +245,25 @@ module RubyLsp
|
|
246
245
|
end
|
247
246
|
def definition(uri, position)
|
248
247
|
document = @store.get(uri)
|
249
|
-
return if document.syntax_error?
|
250
|
-
|
251
248
|
target, parent, nesting = document.locate_node(
|
252
249
|
position,
|
253
|
-
node_types: [
|
250
|
+
node_types: [YARP::CallNode, YARP::ConstantReadNode, YARP::ConstantPathNode],
|
254
251
|
)
|
255
252
|
|
256
|
-
target = parent if target.is_a?(
|
253
|
+
target = parent if target.is_a?(YARP::ConstantReadNode) && parent.is_a?(YARP::ConstantPathNode)
|
257
254
|
|
258
255
|
emitter = EventEmitter.new
|
259
|
-
base_listener = Requests::Definition.new(
|
256
|
+
base_listener = Requests::Definition.new(
|
257
|
+
uri,
|
258
|
+
nesting,
|
259
|
+
@index,
|
260
|
+
emitter,
|
261
|
+
@message_queue,
|
262
|
+
)
|
260
263
|
emitter.emit_for_target(target)
|
261
264
|
base_listener.response
|
262
265
|
end
|
263
266
|
|
264
|
-
sig { params(uri: URI::Generic).returns(T::Array[Interface::FoldingRange]) }
|
265
|
-
def folding_range(uri)
|
266
|
-
@store.cache_fetch(uri, "textDocument/foldingRange") do |document|
|
267
|
-
Requests::FoldingRanges.new(document).run
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
267
|
sig do
|
272
268
|
params(
|
273
269
|
uri: URI::Generic,
|
@@ -276,8 +272,6 @@ module RubyLsp
|
|
276
272
|
end
|
277
273
|
def hover(uri, position)
|
278
274
|
document = @store.get(uri)
|
279
|
-
return if document.syntax_error?
|
280
|
-
|
281
275
|
target, parent, nesting = document.locate_node(
|
282
276
|
position,
|
283
277
|
node_types: Requests::Hover::ALLOWED_TARGETS,
|
@@ -285,7 +279,7 @@ module RubyLsp
|
|
285
279
|
|
286
280
|
if (Requests::Hover::ALLOWED_TARGETS.include?(parent.class) &&
|
287
281
|
!Requests::Hover::ALLOWED_TARGETS.include?(target.class)) ||
|
288
|
-
(parent.is_a?(
|
282
|
+
(parent.is_a?(YARP::ConstantPathNode) && target.is_a?(YARP::ConstantReadNode))
|
289
283
|
target = parent
|
290
284
|
end
|
291
285
|
|
@@ -371,7 +365,6 @@ module RubyLsp
|
|
371
365
|
end
|
372
366
|
def document_highlight(uri, position)
|
373
367
|
document = @store.get(uri)
|
374
|
-
return if document.syntax_error?
|
375
368
|
|
376
369
|
target, parent = document.locate_node(position)
|
377
370
|
emitter = EventEmitter.new
|
@@ -383,7 +376,6 @@ module RubyLsp
|
|
383
376
|
sig { params(uri: URI::Generic, range: Document::RangeShape).returns(T.nilable(T::Array[Interface::InlayHint])) }
|
384
377
|
def inlay_hint(uri, range)
|
385
378
|
document = @store.get(uri)
|
386
|
-
return if document.syntax_error?
|
387
379
|
|
388
380
|
start_line = range.dig(:start, :line)
|
389
381
|
end_line = range.dig(:end, :line)
|
@@ -443,7 +435,7 @@ module RubyLsp
|
|
443
435
|
Requests::Diagnostics.new(document).run
|
444
436
|
end
|
445
437
|
|
446
|
-
Interface::FullDocumentDiagnosticReport.new(kind: "full", items: response
|
438
|
+
Interface::FullDocumentDiagnosticReport.new(kind: "full", items: response) if response
|
447
439
|
end
|
448
440
|
|
449
441
|
sig { params(uri: URI::Generic, range: Document::RangeShape).returns(Interface::SemanticTokens) }
|
@@ -458,7 +450,7 @@ module RubyLsp
|
|
458
450
|
@message_queue,
|
459
451
|
range: start_line..end_line,
|
460
452
|
)
|
461
|
-
emitter.visit(document.tree)
|
453
|
+
emitter.visit(document.tree)
|
462
454
|
|
463
455
|
Requests::Support::SemanticTokenEncoder.new.encode(listener.response)
|
464
456
|
end
|
@@ -471,7 +463,6 @@ module RubyLsp
|
|
471
463
|
end
|
472
464
|
def completion(uri, position)
|
473
465
|
document = @store.get(uri)
|
474
|
-
return unless document.parsed?
|
475
466
|
|
476
467
|
char_position = document.create_scanner.find_char_position(position)
|
477
468
|
|
@@ -480,35 +471,29 @@ module RubyLsp
|
|
480
471
|
# the node, as it could not be a constant
|
481
472
|
target_node_types = if ("A".."Z").cover?(document.source[char_position - 1])
|
482
473
|
char_position -= 1
|
483
|
-
[
|
474
|
+
[YARP::ConstantReadNode, YARP::ConstantPathNode]
|
484
475
|
else
|
485
|
-
[
|
476
|
+
[YARP::CallNode]
|
486
477
|
end
|
487
478
|
|
488
|
-
matched, parent, nesting = document.locate(
|
479
|
+
matched, parent, nesting = document.locate(document.tree, char_position, node_types: target_node_types)
|
489
480
|
return unless matched && parent
|
490
481
|
|
491
482
|
target = case matched
|
492
|
-
when
|
483
|
+
when YARP::CallNode
|
493
484
|
message = matched.message
|
494
|
-
return
|
495
|
-
return unless message.value == "require"
|
496
|
-
|
497
|
-
args = matched.arguments
|
498
|
-
args = args.arguments if args.is_a?(SyntaxTree::ArgParen)
|
499
|
-
return if args.nil? || args.is_a?(SyntaxTree::ArgsForward)
|
485
|
+
return unless message == "require"
|
500
486
|
|
501
|
-
|
502
|
-
return
|
487
|
+
args = matched.arguments&.arguments
|
488
|
+
return if args.nil? || args.is_a?(YARP::ForwardingArgumentsNode)
|
503
489
|
|
504
|
-
|
505
|
-
return unless
|
506
|
-
return unless (
|
490
|
+
argument = args.first
|
491
|
+
return unless argument.is_a?(YARP::StringNode)
|
492
|
+
return unless (argument.location.start_offset..argument.location.end_offset).cover?(char_position)
|
507
493
|
|
508
|
-
|
509
|
-
when
|
510
|
-
if
|
511
|
-
matched.is_a?(SyntaxTree::Const)
|
494
|
+
argument
|
495
|
+
when YARP::ConstantReadNode, YARP::ConstantPathNode
|
496
|
+
if parent.is_a?(YARP::ConstantPathNode) && matched.is_a?(YARP::ConstantReadNode)
|
512
497
|
parent
|
513
498
|
else
|
514
499
|
matched
|
@@ -518,7 +503,12 @@ module RubyLsp
|
|
518
503
|
return unless target
|
519
504
|
|
520
505
|
emitter = EventEmitter.new
|
521
|
-
listener = Requests::Completion.new(
|
506
|
+
listener = Requests::Completion.new(
|
507
|
+
@index,
|
508
|
+
nesting,
|
509
|
+
emitter,
|
510
|
+
@message_queue,
|
511
|
+
)
|
522
512
|
emitter.emit_for_target(target)
|
523
513
|
listener.response
|
524
514
|
end
|
@@ -570,7 +560,7 @@ module RubyLsp
|
|
570
560
|
@store.supports_progress = options.dig(:capabilities, :window, :workDoneProgress) || true
|
571
561
|
formatter = options.dig(:initializationOptions, :formatter) || "auto"
|
572
562
|
@store.formatter = if formatter == "auto"
|
573
|
-
DependencyDetector.detected_formatter
|
563
|
+
DependencyDetector.instance.detected_formatter
|
574
564
|
else
|
575
565
|
formatter
|
576
566
|
end
|