ruby-lsp 0.11.2 → 0.12.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/VERSION +1 -1
- data/exe/ruby-lsp +2 -1
- data/exe/ruby-lsp-doctor +16 -0
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +5 -1
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +205 -0
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +23 -106
- data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +6 -6
- data/lib/ruby_indexer/lib/ruby_indexer/visitor.rb +101 -49
- data/lib/ruby_indexer/ruby_indexer.rb +1 -0
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +49 -16
- data/lib/ruby_indexer/test/constant_test.rb +99 -36
- data/lib/ruby_indexer/test/index_test.rb +1 -1
- data/lib/ruby_indexer/test/method_test.rb +73 -0
- data/lib/ruby_indexer/test/test_case.rb +5 -1
- data/lib/ruby_lsp/addon.rb +8 -8
- data/lib/ruby_lsp/document.rb +14 -14
- data/lib/ruby_lsp/executor.rb +89 -53
- data/lib/ruby_lsp/internal.rb +7 -2
- data/lib/ruby_lsp/listener.rb +6 -6
- data/lib/ruby_lsp/requests/base_request.rb +1 -9
- data/lib/ruby_lsp/requests/code_action_resolve.rb +3 -3
- data/lib/ruby_lsp/requests/code_lens.rb +30 -30
- data/lib/ruby_lsp/requests/completion.rb +83 -32
- data/lib/ruby_lsp/requests/definition.rb +21 -15
- data/lib/ruby_lsp/requests/diagnostics.rb +1 -1
- data/lib/ruby_lsp/requests/document_highlight.rb +508 -31
- data/lib/ruby_lsp/requests/document_link.rb +24 -17
- data/lib/ruby_lsp/requests/document_symbol.rb +42 -42
- data/lib/ruby_lsp/requests/folding_ranges.rb +83 -77
- data/lib/ruby_lsp/requests/hover.rb +22 -17
- data/lib/ruby_lsp/requests/inlay_hints.rb +6 -6
- data/lib/ruby_lsp/requests/selection_ranges.rb +13 -105
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +92 -92
- data/lib/ruby_lsp/requests/support/annotation.rb +3 -3
- data/lib/ruby_lsp/requests/support/common.rb +5 -5
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +12 -0
- data/lib/ruby_lsp/requests/support/semantic_token_encoder.rb +10 -7
- data/lib/ruby_lsp/requests/support/sorbet.rb +28 -28
- data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
- data/lib/ruby_lsp/requests.rb +0 -1
- data/lib/ruby_lsp/setup_bundler.rb +8 -5
- metadata +19 -17
- data/lib/ruby_lsp/event_emitter.rb +0 -351
- data/lib/ruby_lsp/requests/support/highlight_target.rb +0 -118
@@ -32,7 +32,7 @@ module RubyLsp
|
|
32
32
|
|
33
33
|
ResponseType = type_member { { fixed: T::Array[Interface::DocumentSymbol] } }
|
34
34
|
|
35
|
-
ATTR_ACCESSORS = T.let([
|
35
|
+
ATTR_ACCESSORS = T.let([:attr_reader, :attr_writer, :attr_accessor].freeze, T::Array[Symbol])
|
36
36
|
|
37
37
|
class SymbolHierarchyRoot
|
38
38
|
extend T::Sig
|
@@ -49,8 +49,8 @@ module RubyLsp
|
|
49
49
|
sig { override.returns(T::Array[Interface::DocumentSymbol]) }
|
50
50
|
attr_reader :_response
|
51
51
|
|
52
|
-
sig { params(
|
53
|
-
def initialize(
|
52
|
+
sig { params(dispatcher: Prism::Dispatcher, message_queue: Thread::Queue).void }
|
53
|
+
def initialize(dispatcher, message_queue)
|
54
54
|
@root = T.let(SymbolHierarchyRoot.new, SymbolHierarchyRoot)
|
55
55
|
@_response = T.let(@root.children, T::Array[Interface::DocumentSymbol])
|
56
56
|
@stack = T.let(
|
@@ -60,25 +60,25 @@ module RubyLsp
|
|
60
60
|
|
61
61
|
super
|
62
62
|
|
63
|
-
|
63
|
+
dispatcher.register(
|
64
64
|
self,
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
75
|
-
:
|
65
|
+
:on_class_node_enter,
|
66
|
+
:on_class_node_leave,
|
67
|
+
:on_call_node_enter,
|
68
|
+
:on_constant_path_write_node_enter,
|
69
|
+
:on_constant_write_node_enter,
|
70
|
+
:on_def_node_enter,
|
71
|
+
:on_def_node_leave,
|
72
|
+
:on_module_node_enter,
|
73
|
+
:on_module_node_leave,
|
74
|
+
:on_instance_variable_write_node_enter,
|
75
|
+
:on_class_variable_write_node_enter,
|
76
76
|
)
|
77
77
|
end
|
78
78
|
|
79
79
|
sig { override.params(addon: Addon).returns(T.nilable(Listener[ResponseType])) }
|
80
80
|
def initialize_external_listener(addon)
|
81
|
-
addon.create_document_symbol_listener(@
|
81
|
+
addon.create_document_symbol_listener(@dispatcher, @message_queue)
|
82
82
|
end
|
83
83
|
|
84
84
|
# Merges responses from other listeners
|
@@ -88,8 +88,8 @@ module RubyLsp
|
|
88
88
|
self
|
89
89
|
end
|
90
90
|
|
91
|
-
sig { params(node:
|
92
|
-
def
|
91
|
+
sig { params(node: Prism::ClassNode).void }
|
92
|
+
def on_class_node_enter(node)
|
93
93
|
@stack << create_document_symbol(
|
94
94
|
name: node.constant_path.location.slice,
|
95
95
|
kind: Constant::SymbolKind::CLASS,
|
@@ -98,20 +98,20 @@ module RubyLsp
|
|
98
98
|
)
|
99
99
|
end
|
100
100
|
|
101
|
-
sig { params(node:
|
102
|
-
def
|
101
|
+
sig { params(node: Prism::ClassNode).void }
|
102
|
+
def on_class_node_leave(node)
|
103
103
|
@stack.pop
|
104
104
|
end
|
105
105
|
|
106
|
-
sig { params(node:
|
107
|
-
def
|
106
|
+
sig { params(node: Prism::CallNode).void }
|
107
|
+
def on_call_node_enter(node)
|
108
108
|
return unless ATTR_ACCESSORS.include?(node.name) && node.receiver.nil?
|
109
109
|
|
110
110
|
arguments = node.arguments
|
111
111
|
return unless arguments
|
112
112
|
|
113
113
|
arguments.arguments.each do |argument|
|
114
|
-
next unless argument.is_a?(
|
114
|
+
next unless argument.is_a?(Prism::SymbolNode)
|
115
115
|
|
116
116
|
name = argument.value
|
117
117
|
next unless name
|
@@ -125,8 +125,8 @@ module RubyLsp
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
sig { params(node:
|
129
|
-
def
|
128
|
+
sig { params(node: Prism::ConstantPathWriteNode).void }
|
129
|
+
def on_constant_path_write_node_enter(node)
|
130
130
|
create_document_symbol(
|
131
131
|
name: node.target.location.slice,
|
132
132
|
kind: Constant::SymbolKind::CONSTANT,
|
@@ -135,8 +135,8 @@ module RubyLsp
|
|
135
135
|
)
|
136
136
|
end
|
137
137
|
|
138
|
-
sig { params(node:
|
139
|
-
def
|
138
|
+
sig { params(node: Prism::ConstantWriteNode).void }
|
139
|
+
def on_constant_write_node_enter(node)
|
140
140
|
create_document_symbol(
|
141
141
|
name: node.name.to_s,
|
142
142
|
kind: Constant::SymbolKind::CONSTANT,
|
@@ -145,13 +145,13 @@ module RubyLsp
|
|
145
145
|
)
|
146
146
|
end
|
147
147
|
|
148
|
-
sig { params(node:
|
149
|
-
def
|
148
|
+
sig { params(node: Prism::DefNode).void }
|
149
|
+
def on_def_node_leave(node)
|
150
150
|
@stack.pop
|
151
151
|
end
|
152
152
|
|
153
|
-
sig { params(node:
|
154
|
-
def
|
153
|
+
sig { params(node: Prism::ModuleNode).void }
|
154
|
+
def on_module_node_enter(node)
|
155
155
|
@stack << create_document_symbol(
|
156
156
|
name: node.constant_path.location.slice,
|
157
157
|
kind: Constant::SymbolKind::MODULE,
|
@@ -160,11 +160,11 @@ module RubyLsp
|
|
160
160
|
)
|
161
161
|
end
|
162
162
|
|
163
|
-
sig { params(node:
|
164
|
-
def
|
163
|
+
sig { params(node: Prism::DefNode).void }
|
164
|
+
def on_def_node_enter(node)
|
165
165
|
receiver = node.receiver
|
166
166
|
|
167
|
-
if receiver.is_a?(
|
167
|
+
if receiver.is_a?(Prism::SelfNode)
|
168
168
|
name = "self.#{node.name}"
|
169
169
|
kind = Constant::SymbolKind::METHOD
|
170
170
|
else
|
@@ -182,13 +182,13 @@ module RubyLsp
|
|
182
182
|
@stack << symbol
|
183
183
|
end
|
184
184
|
|
185
|
-
sig { params(node:
|
186
|
-
def
|
185
|
+
sig { params(node: Prism::ModuleNode).void }
|
186
|
+
def on_module_node_leave(node)
|
187
187
|
@stack.pop
|
188
188
|
end
|
189
189
|
|
190
|
-
sig { params(node:
|
191
|
-
def
|
190
|
+
sig { params(node: Prism::InstanceVariableWriteNode).void }
|
191
|
+
def on_instance_variable_write_node_enter(node)
|
192
192
|
create_document_symbol(
|
193
193
|
name: node.name.to_s,
|
194
194
|
kind: Constant::SymbolKind::VARIABLE,
|
@@ -197,8 +197,8 @@ module RubyLsp
|
|
197
197
|
)
|
198
198
|
end
|
199
199
|
|
200
|
-
sig { params(node:
|
201
|
-
def
|
200
|
+
sig { params(node: Prism::ClassVariableWriteNode).void }
|
201
|
+
def on_class_variable_write_node_enter(node)
|
202
202
|
create_document_symbol(
|
203
203
|
name: node.name.to_s,
|
204
204
|
kind: Constant::SymbolKind::VARIABLE,
|
@@ -213,8 +213,8 @@ module RubyLsp
|
|
213
213
|
params(
|
214
214
|
name: String,
|
215
215
|
kind: Integer,
|
216
|
-
range_location:
|
217
|
-
selection_range_location:
|
216
|
+
range_location: Prism::Location,
|
217
|
+
selection_range_location: Prism::Location,
|
218
218
|
).returns(Interface::DocumentSymbol)
|
219
219
|
end
|
220
220
|
def create_document_symbol(name:, kind:, range_location:, selection_range_location:)
|
@@ -21,39 +21,40 @@ module RubyLsp
|
|
21
21
|
|
22
22
|
ResponseType = type_member { { fixed: T::Array[Interface::FoldingRange] } }
|
23
23
|
|
24
|
-
sig { params(comments: T::Array[
|
25
|
-
def initialize(comments,
|
26
|
-
super(
|
24
|
+
sig { params(comments: T::Array[Prism::Comment], dispatcher: Prism::Dispatcher, queue: Thread::Queue).void }
|
25
|
+
def initialize(comments, dispatcher, queue)
|
26
|
+
super(dispatcher, queue)
|
27
27
|
|
28
28
|
@_response = T.let([], ResponseType)
|
29
|
-
@requires = T.let([], T::Array[
|
29
|
+
@requires = T.let([], T::Array[Prism::CallNode])
|
30
30
|
@finalized_response = T.let(false, T::Boolean)
|
31
31
|
@comments = comments
|
32
32
|
|
33
|
-
|
33
|
+
dispatcher.register(
|
34
34
|
self,
|
35
|
-
:
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
44
|
-
:
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:
|
49
|
-
:
|
50
|
-
:
|
51
|
-
:
|
52
|
-
:
|
53
|
-
:
|
54
|
-
:
|
55
|
-
:
|
56
|
-
:
|
35
|
+
:on_if_node_enter,
|
36
|
+
:on_in_node_enter,
|
37
|
+
:on_rescue_node_enter,
|
38
|
+
:on_when_node_enter,
|
39
|
+
:on_interpolated_string_node_enter,
|
40
|
+
:on_array_node_enter,
|
41
|
+
:on_block_node_enter,
|
42
|
+
:on_case_node_enter,
|
43
|
+
:on_class_node_enter,
|
44
|
+
:on_module_node_enter,
|
45
|
+
:on_for_node_enter,
|
46
|
+
:on_hash_node_enter,
|
47
|
+
:on_singleton_class_node_enter,
|
48
|
+
:on_unless_node_enter,
|
49
|
+
:on_until_node_enter,
|
50
|
+
:on_while_node_enter,
|
51
|
+
:on_else_node_enter,
|
52
|
+
:on_ensure_node_enter,
|
53
|
+
:on_begin_node_enter,
|
54
|
+
:on_string_concat_node_enter,
|
55
|
+
:on_def_node_enter,
|
56
|
+
:on_call_node_enter,
|
57
|
+
:on_lambda_node_enter,
|
57
58
|
)
|
58
59
|
end
|
59
60
|
|
@@ -68,114 +69,114 @@ module RubyLsp
|
|
68
69
|
@_response
|
69
70
|
end
|
70
71
|
|
71
|
-
sig { params(node:
|
72
|
-
def
|
72
|
+
sig { params(node: Prism::IfNode).void }
|
73
|
+
def on_if_node_enter(node)
|
73
74
|
add_statements_range(node)
|
74
75
|
end
|
75
76
|
|
76
|
-
sig { params(node:
|
77
|
-
def
|
77
|
+
sig { params(node: Prism::InNode).void }
|
78
|
+
def on_in_node_enter(node)
|
78
79
|
add_statements_range(node)
|
79
80
|
end
|
80
81
|
|
81
|
-
sig { params(node:
|
82
|
-
def
|
82
|
+
sig { params(node: Prism::RescueNode).void }
|
83
|
+
def on_rescue_node_enter(node)
|
83
84
|
add_statements_range(node)
|
84
85
|
end
|
85
86
|
|
86
|
-
sig { params(node:
|
87
|
-
def
|
87
|
+
sig { params(node: Prism::WhenNode).void }
|
88
|
+
def on_when_node_enter(node)
|
88
89
|
add_statements_range(node)
|
89
90
|
end
|
90
91
|
|
91
|
-
sig { params(node:
|
92
|
-
def
|
92
|
+
sig { params(node: Prism::InterpolatedStringNode).void }
|
93
|
+
def on_interpolated_string_node_enter(node)
|
93
94
|
opening_loc = node.opening_loc
|
94
95
|
closing_loc = node.closing_loc
|
95
96
|
|
96
97
|
add_lines_range(opening_loc.start_line, closing_loc.end_line - 1) if opening_loc && closing_loc
|
97
98
|
end
|
98
99
|
|
99
|
-
sig { params(node:
|
100
|
-
def
|
100
|
+
sig { params(node: Prism::ArrayNode).void }
|
101
|
+
def on_array_node_enter(node)
|
101
102
|
add_simple_range(node)
|
102
103
|
end
|
103
104
|
|
104
|
-
sig { params(node:
|
105
|
-
def
|
105
|
+
sig { params(node: Prism::BlockNode).void }
|
106
|
+
def on_block_node_enter(node)
|
106
107
|
add_simple_range(node)
|
107
108
|
end
|
108
109
|
|
109
|
-
sig { params(node:
|
110
|
-
def
|
110
|
+
sig { params(node: Prism::CaseNode).void }
|
111
|
+
def on_case_node_enter(node)
|
111
112
|
add_simple_range(node)
|
112
113
|
end
|
113
114
|
|
114
|
-
sig { params(node:
|
115
|
-
def
|
115
|
+
sig { params(node: Prism::ClassNode).void }
|
116
|
+
def on_class_node_enter(node)
|
116
117
|
add_simple_range(node)
|
117
118
|
end
|
118
119
|
|
119
|
-
sig { params(node:
|
120
|
-
def
|
120
|
+
sig { params(node: Prism::ModuleNode).void }
|
121
|
+
def on_module_node_enter(node)
|
121
122
|
add_simple_range(node)
|
122
123
|
end
|
123
124
|
|
124
|
-
sig { params(node:
|
125
|
-
def
|
125
|
+
sig { params(node: Prism::ForNode).void }
|
126
|
+
def on_for_node_enter(node)
|
126
127
|
add_simple_range(node)
|
127
128
|
end
|
128
129
|
|
129
|
-
sig { params(node:
|
130
|
-
def
|
130
|
+
sig { params(node: Prism::HashNode).void }
|
131
|
+
def on_hash_node_enter(node)
|
131
132
|
add_simple_range(node)
|
132
133
|
end
|
133
134
|
|
134
|
-
sig { params(node:
|
135
|
-
def
|
135
|
+
sig { params(node: Prism::SingletonClassNode).void }
|
136
|
+
def on_singleton_class_node_enter(node)
|
136
137
|
add_simple_range(node)
|
137
138
|
end
|
138
139
|
|
139
|
-
sig { params(node:
|
140
|
-
def
|
140
|
+
sig { params(node: Prism::UnlessNode).void }
|
141
|
+
def on_unless_node_enter(node)
|
141
142
|
add_simple_range(node)
|
142
143
|
end
|
143
144
|
|
144
|
-
sig { params(node:
|
145
|
-
def
|
145
|
+
sig { params(node: Prism::UntilNode).void }
|
146
|
+
def on_until_node_enter(node)
|
146
147
|
add_simple_range(node)
|
147
148
|
end
|
148
149
|
|
149
|
-
sig { params(node:
|
150
|
-
def
|
150
|
+
sig { params(node: Prism::WhileNode).void }
|
151
|
+
def on_while_node_enter(node)
|
151
152
|
add_simple_range(node)
|
152
153
|
end
|
153
154
|
|
154
|
-
sig { params(node:
|
155
|
-
def
|
155
|
+
sig { params(node: Prism::ElseNode).void }
|
156
|
+
def on_else_node_enter(node)
|
156
157
|
add_simple_range(node)
|
157
158
|
end
|
158
159
|
|
159
|
-
sig { params(node:
|
160
|
-
def
|
160
|
+
sig { params(node: Prism::EnsureNode).void }
|
161
|
+
def on_ensure_node_enter(node)
|
161
162
|
add_simple_range(node)
|
162
163
|
end
|
163
164
|
|
164
|
-
sig { params(node:
|
165
|
-
def
|
165
|
+
sig { params(node: Prism::BeginNode).void }
|
166
|
+
def on_begin_node_enter(node)
|
166
167
|
add_simple_range(node)
|
167
168
|
end
|
168
169
|
|
169
|
-
sig { params(node:
|
170
|
-
def
|
171
|
-
left = T.let(node.left,
|
172
|
-
left = left.left while left.is_a?(
|
170
|
+
sig { params(node: Prism::StringConcatNode).void }
|
171
|
+
def on_string_concat_node_enter(node)
|
172
|
+
left = T.let(node.left, Prism::Node)
|
173
|
+
left = left.left while left.is_a?(Prism::StringConcatNode)
|
173
174
|
|
174
175
|
add_lines_range(left.location.start_line, node.right.location.end_line - 1)
|
175
176
|
end
|
176
177
|
|
177
|
-
sig { params(node:
|
178
|
-
def
|
178
|
+
sig { params(node: Prism::DefNode).void }
|
179
|
+
def on_def_node_enter(node)
|
179
180
|
params = node.parameters
|
180
181
|
parameter_loc = params&.location
|
181
182
|
location = node.location
|
@@ -189,8 +190,8 @@ module RubyLsp
|
|
189
190
|
end
|
190
191
|
end
|
191
192
|
|
192
|
-
sig { params(node:
|
193
|
-
def
|
193
|
+
sig { params(node: Prism::CallNode).void }
|
194
|
+
def on_call_node_enter(node)
|
194
195
|
# If we find a require, don't visit the child nodes (prevent `super`), so that we can keep accumulating into
|
195
196
|
# the `@requires` array and then push the range whenever we find a node that isn't a CallNode
|
196
197
|
if require?(node)
|
@@ -202,6 +203,11 @@ module RubyLsp
|
|
202
203
|
add_lines_range(location.start_line, location.end_line - 1)
|
203
204
|
end
|
204
205
|
|
206
|
+
sig { params(node: Prism::LambdaNode).void }
|
207
|
+
def on_lambda_node_enter(node)
|
208
|
+
add_simple_range(node)
|
209
|
+
end
|
210
|
+
|
205
211
|
private
|
206
212
|
|
207
213
|
sig { void }
|
@@ -233,7 +239,7 @@ module RubyLsp
|
|
233
239
|
@requires.clear
|
234
240
|
end
|
235
241
|
|
236
|
-
sig { params(node:
|
242
|
+
sig { params(node: Prism::CallNode).returns(T::Boolean) }
|
237
243
|
def require?(node)
|
238
244
|
message = node.message
|
239
245
|
return false unless message == "require" || message == "require_relative"
|
@@ -244,10 +250,10 @@ module RubyLsp
|
|
244
250
|
arguments = node.arguments&.arguments
|
245
251
|
return false unless arguments
|
246
252
|
|
247
|
-
arguments.length == 1 && arguments.first.is_a?(
|
253
|
+
arguments.length == 1 && arguments.first.is_a?(Prism::StringNode)
|
248
254
|
end
|
249
255
|
|
250
|
-
sig { params(node: T.any(
|
256
|
+
sig { params(node: T.any(Prism::IfNode, Prism::InNode, Prism::RescueNode, Prism::WhenNode)).void }
|
251
257
|
def add_statements_range(node)
|
252
258
|
statements = node.statements
|
253
259
|
return unless statements
|
@@ -258,7 +264,7 @@ module RubyLsp
|
|
258
264
|
add_lines_range(node.location.start_line, T.must(body.last).location.end_line)
|
259
265
|
end
|
260
266
|
|
261
|
-
sig { params(node:
|
267
|
+
sig { params(node: Prism::Node).void }
|
262
268
|
def add_simple_range(node)
|
263
269
|
location = node.location
|
264
270
|
add_lines_range(location.start_line, location.end_line - 1)
|
@@ -21,12 +21,12 @@ module RubyLsp
|
|
21
21
|
|
22
22
|
ALLOWED_TARGETS = T.let(
|
23
23
|
[
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
Prism::CallNode,
|
25
|
+
Prism::ConstantReadNode,
|
26
|
+
Prism::ConstantWriteNode,
|
27
|
+
Prism::ConstantPathNode,
|
28
28
|
],
|
29
|
-
T::Array[T.class_of(
|
29
|
+
T::Array[T.class_of(Prism::Node)],
|
30
30
|
)
|
31
31
|
|
32
32
|
sig { override.returns(ResponseType) }
|
@@ -36,22 +36,27 @@ module RubyLsp
|
|
36
36
|
params(
|
37
37
|
index: RubyIndexer::Index,
|
38
38
|
nesting: T::Array[String],
|
39
|
-
|
39
|
+
dispatcher: Prism::Dispatcher,
|
40
40
|
message_queue: Thread::Queue,
|
41
41
|
).void
|
42
42
|
end
|
43
|
-
def initialize(index, nesting,
|
43
|
+
def initialize(index, nesting, dispatcher, message_queue)
|
44
44
|
@index = index
|
45
45
|
@nesting = nesting
|
46
46
|
@_response = T.let(nil, ResponseType)
|
47
47
|
|
48
|
-
super(
|
49
|
-
|
48
|
+
super(dispatcher, message_queue)
|
49
|
+
dispatcher.register(
|
50
|
+
self,
|
51
|
+
:on_constant_read_node_enter,
|
52
|
+
:on_constant_write_node_enter,
|
53
|
+
:on_constant_path_node_enter,
|
54
|
+
)
|
50
55
|
end
|
51
56
|
|
52
57
|
sig { override.params(addon: Addon).returns(T.nilable(Listener[ResponseType])) }
|
53
58
|
def initialize_external_listener(addon)
|
54
|
-
addon.create_hover_listener(@nesting, @index, @
|
59
|
+
addon.create_hover_listener(@nesting, @index, @dispatcher, @message_queue)
|
55
60
|
end
|
56
61
|
|
57
62
|
# Merges responses from other hover listeners
|
@@ -69,22 +74,22 @@ module RubyLsp
|
|
69
74
|
self
|
70
75
|
end
|
71
76
|
|
72
|
-
sig { params(node:
|
73
|
-
def
|
77
|
+
sig { params(node: Prism::ConstantReadNode).void }
|
78
|
+
def on_constant_read_node_enter(node)
|
74
79
|
return if DependencyDetector.instance.typechecker
|
75
80
|
|
76
81
|
generate_hover(node.slice, node.location)
|
77
82
|
end
|
78
83
|
|
79
|
-
sig { params(node:
|
80
|
-
def
|
84
|
+
sig { params(node: Prism::ConstantWriteNode).void }
|
85
|
+
def on_constant_write_node_enter(node)
|
81
86
|
return if DependencyDetector.instance.typechecker
|
82
87
|
|
83
88
|
generate_hover(node.name.to_s, node.name_loc)
|
84
89
|
end
|
85
90
|
|
86
|
-
sig { params(node:
|
87
|
-
def
|
91
|
+
sig { params(node: Prism::ConstantPathNode).void }
|
92
|
+
def on_constant_path_node_enter(node)
|
88
93
|
return if DependencyDetector.instance.typechecker
|
89
94
|
|
90
95
|
generate_hover(node.slice, node.location)
|
@@ -92,7 +97,7 @@ module RubyLsp
|
|
92
97
|
|
93
98
|
private
|
94
99
|
|
95
|
-
sig { params(name: String, location:
|
100
|
+
sig { params(name: String, location: Prism::Location).void }
|
96
101
|
def generate_hover(name, location)
|
97
102
|
entries = @index.resolve(name, @nesting)
|
98
103
|
return unless entries
|
@@ -29,18 +29,18 @@ module RubyLsp
|
|
29
29
|
sig { override.returns(ResponseType) }
|
30
30
|
attr_reader :_response
|
31
31
|
|
32
|
-
sig { params(range: T::Range[Integer],
|
33
|
-
def initialize(range,
|
34
|
-
super(
|
32
|
+
sig { params(range: T::Range[Integer], dispatcher: Prism::Dispatcher, message_queue: Thread::Queue).void }
|
33
|
+
def initialize(range, dispatcher, message_queue)
|
34
|
+
super(dispatcher, message_queue)
|
35
35
|
|
36
36
|
@_response = T.let([], ResponseType)
|
37
37
|
@range = range
|
38
38
|
|
39
|
-
|
39
|
+
dispatcher.register(self, :on_rescue_node_enter)
|
40
40
|
end
|
41
41
|
|
42
|
-
sig { params(node:
|
43
|
-
def
|
42
|
+
sig { params(node: Prism::RescueNode).void }
|
43
|
+
def on_rescue_node_enter(node)
|
44
44
|
return unless node.exceptions.empty?
|
45
45
|
|
46
46
|
loc = node.location
|