ruby-lsp 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -4
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp-check +1 -1
  5. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +35 -5
  6. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +141 -5
  7. data/lib/ruby_indexer/lib/ruby_indexer/visitor.rb +66 -18
  8. data/lib/ruby_indexer/test/classes_and_modules_test.rb +39 -16
  9. data/lib/ruby_indexer/test/configuration_test.rb +2 -0
  10. data/lib/ruby_indexer/test/constant_test.rb +213 -11
  11. data/lib/ruby_indexer/test/index_test.rb +20 -0
  12. data/lib/ruby_lsp/{extension.rb → addon.rb} +27 -25
  13. data/lib/ruby_lsp/check_docs.rb +7 -8
  14. data/lib/ruby_lsp/document.rb +35 -38
  15. data/lib/ruby_lsp/event_emitter.rb +239 -77
  16. data/lib/ruby_lsp/executor.rb +45 -55
  17. data/lib/ruby_lsp/internal.rb +2 -3
  18. data/lib/ruby_lsp/listener.rb +8 -7
  19. data/lib/ruby_lsp/parameter_scope.rb +33 -0
  20. data/lib/ruby_lsp/requests/base_request.rb +3 -3
  21. data/lib/ruby_lsp/requests/code_action_resolve.rb +14 -14
  22. data/lib/ruby_lsp/requests/code_lens.rb +39 -63
  23. data/lib/ruby_lsp/requests/completion.rb +54 -32
  24. data/lib/ruby_lsp/requests/definition.rb +30 -27
  25. data/lib/ruby_lsp/requests/diagnostics.rb +26 -3
  26. data/lib/ruby_lsp/requests/document_highlight.rb +18 -19
  27. data/lib/ruby_lsp/requests/document_link.rb +53 -10
  28. data/lib/ruby_lsp/requests/document_symbol.rb +82 -75
  29. data/lib/ruby_lsp/requests/folding_ranges.rb +199 -222
  30. data/lib/ruby_lsp/requests/formatting.rb +5 -6
  31. data/lib/ruby_lsp/requests/hover.rb +33 -22
  32. data/lib/ruby_lsp/requests/inlay_hints.rb +2 -3
  33. data/lib/ruby_lsp/requests/selection_ranges.rb +65 -40
  34. data/lib/ruby_lsp/requests/semantic_highlighting.rb +187 -145
  35. data/lib/ruby_lsp/requests/show_syntax_tree.rb +3 -4
  36. data/lib/ruby_lsp/requests/support/annotation.rb +18 -17
  37. data/lib/ruby_lsp/requests/support/common.rb +17 -26
  38. data/lib/ruby_lsp/requests/support/dependency_detector.rb +67 -42
  39. data/lib/ruby_lsp/requests/support/highlight_target.rb +64 -45
  40. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +9 -4
  41. data/lib/ruby_lsp/requests/support/selection_range.rb +5 -4
  42. data/lib/ruby_lsp/requests/support/sorbet.rb +2 -57
  43. data/lib/ruby_lsp/requests/support/syntax_tree_formatting_runner.rb +7 -1
  44. data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -1
  45. data/lib/ruby_lsp/server.rb +6 -44
  46. data/lib/ruby_lsp/setup_bundler.rb +22 -11
  47. data/lib/ruby_lsp/utils.rb +2 -12
  48. 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 Syntax Tree visitors. It's used to visit the document's AST
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 < SyntaxTree::Visitor
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(SyntaxTree::Node)).void }
37
+ sig { params(node: T.nilable(YARP::Node)).void }
39
38
  def emit_for_target(node)
40
39
  case node
41
- when SyntaxTree::Command
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 SyntaxTree::TStringContent
46
- @listeners[:on_tstring_content]&.each { |l| T.unsafe(l).on_tstring_content(node) }
47
- when SyntaxTree::ConstPathRef
48
- @listeners[:on_const_path_ref]&.each { |l| T.unsafe(l).on_const_path_ref(node) }
49
- when SyntaxTree::Const
50
- @listeners[:on_const]&.each { |l| T.unsafe(l).on_const(node) }
51
- when SyntaxTree::TopConstRef
52
- @listeners[:on_top_const_ref]&.each { |l| T.unsafe(l).on_top_const_ref(node) }
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(SyntaxTree::Node)).void }
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 { override.params(node: SyntaxTree::ClassDeclaration).void }
65
- def visit_class(node)
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: SyntaxTree::ModuleDeclaration).void }
72
- def visit_module(node)
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: SyntaxTree::Command).void }
79
- def visit_command(node)
80
- @listeners[:on_command]&.each { |l| T.unsafe(l).on_command(node) }
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[:after_command]&.each { |l| T.unsafe(l).after_command(node) }
88
+ @listeners[:after_call]&.each { |l| T.unsafe(l).after_call(node) }
83
89
  end
84
90
 
85
- sig { override.params(node: SyntaxTree::CommandCall).void }
86
- def visit_command_call(node)
87
- @listeners[:on_command_call]&.each { |l| T.unsafe(l).on_command_call(node) }
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: SyntaxTree::CallNode).void }
92
- def visit_call(node)
93
- @listeners[:on_call]&.each { |l| T.unsafe(l).on_call(node) }
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: SyntaxTree::VCall).void }
99
- def visit_vcall(node)
100
- @listeners[:on_vcall]&.each { |l| T.unsafe(l).on_vcall(node) }
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: SyntaxTree::ConstPathField).void }
105
- def visit_const_path_field(node)
106
- @listeners[:on_const_path_field]&.each { |l| T.unsafe(l).on_const_path_field(node) }
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: SyntaxTree::TopConstField).void }
111
- def visit_top_const_field(node)
112
- @listeners[:on_top_const_field]&.each { |l| T.unsafe(l).on_top_const_field(node) }
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: SyntaxTree::DefNode).void }
117
- def visit_def(node)
118
- @listeners[:on_def]&.each { |l| T.unsafe(l).on_def(node) }
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: SyntaxTree::VarField).void }
124
- def visit_var_field(node)
125
- @listeners[:on_var_field]&.each { |l| T.unsafe(l).on_var_field(node) }
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: SyntaxTree::Comment).void }
130
- def visit_comment(node)
131
- @listeners[:on_comment]&.each { |l| T.unsafe(l).on_comment(node) }
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: SyntaxTree::Rescue).void }
136
- def visit_rescue(node)
137
- @listeners[:on_rescue]&.each { |l| T.unsafe(l).on_rescue(node) }
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: SyntaxTree::Kw).void }
142
- def visit_kw(node)
143
- @listeners[:on_kw]&.each { |l| T.unsafe(l).on_kw(node) }
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: SyntaxTree::Params).void }
148
- def visit_params(node)
149
- @listeners[:on_params]&.each { |l| T.unsafe(l).on_params(node) }
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: SyntaxTree::Field).void }
154
- def visit_field(node)
155
- @listeners[:on_field]&.each { |l| T.unsafe(l).on_field(node) }
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: SyntaxTree::VarRef).void }
160
- def visit_var_ref(node)
161
- @listeners[:on_var_ref]&.each { |l| T.unsafe(l).on_var_ref(node) }
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: SyntaxTree::BlockVar).void }
166
- def visit_block_var(node)
167
- @listeners[:on_block_var]&.each { |l| T.unsafe(l).on_block_var(node) }
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: SyntaxTree::LambdaVar).void }
172
- def visit_lambda_var(node)
173
- @listeners[:on_lambda_var]&.each { |l| T.unsafe(l).on_lambda_var(node) }
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: SyntaxTree::Binary).void }
178
- def visit_binary(node)
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: SyntaxTree::Const).void }
184
- def visit_const(node)
185
- @listeners[:on_const]&.each { |l| T.unsafe(l).on_const(node) }
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
@@ -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
- request_time = Benchmark.realtime do
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, request_time: request_time)
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
- Extension.load_extensions
44
+ Addon.load_addons
46
45
 
47
- errored_extensions = Extension.extensions.select(&:error?)
46
+ errored_addons = Addon.addons.select(&:error?)
48
47
 
49
- if errored_extensions.any?
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 extensions:\n\n#{errored_extensions.map(&:formatted_errors).join("\n\n")}",
53
+ message: "Error loading addons:\n\n#{errored_addons.map(&:formatted_errors).join("\n\n")}",
55
54
  ),
56
55
  )
57
56
 
58
- warn(errored_extensions.map(&:backtraces).join("\n\n"))
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, @test_library)
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) if document.parsed?
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: [SyntaxTree::Command, SyntaxTree::Const, SyntaxTree::ConstPathRef],
250
+ node_types: [YARP::CallNode, YARP::ConstantReadNode, YARP::ConstantPathNode],
254
251
  )
255
252
 
256
- target = parent if target.is_a?(SyntaxTree::Const) && parent.is_a?(SyntaxTree::ConstPathRef)
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(uri, nesting, @index, emitter, @message_queue)
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?(SyntaxTree::ConstPathRef) && target.is_a?(SyntaxTree::Const))
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.map(&:to_lsp_diagnostic)) if 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) if document.parsed?
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
- [SyntaxTree::Const, SyntaxTree::ConstPathRef, SyntaxTree::TopConstRef]
474
+ [YARP::ConstantReadNode, YARP::ConstantPathNode]
484
475
  else
485
- [SyntaxTree::Command, SyntaxTree::CommandCall, SyntaxTree::CallNode]
476
+ [YARP::CallNode]
486
477
  end
487
478
 
488
- matched, parent, nesting = document.locate(T.must(document.tree), char_position, node_types: target_node_types)
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 SyntaxTree::Command, SyntaxTree::CallNode, SyntaxTree::CommandCall
483
+ when YARP::CallNode
493
484
  message = matched.message
494
- return if message.is_a?(Symbol)
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
- argument = args.parts.first
502
- return unless argument.is_a?(SyntaxTree::StringLiteral)
487
+ args = matched.arguments&.arguments
488
+ return if args.nil? || args.is_a?(YARP::ForwardingArgumentsNode)
503
489
 
504
- path_node = argument.parts.first
505
- return unless path_node.is_a?(SyntaxTree::TStringContent)
506
- return unless (path_node.location.start_char..path_node.location.end_char).cover?(char_position)
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
- path_node
509
- when SyntaxTree::Const, SyntaxTree::ConstPathRef
510
- if (parent.is_a?(SyntaxTree::ConstPathRef) || parent.is_a?(SyntaxTree::TopConstRef)) &&
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(@index, nesting, emitter, @message_queue)
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