Class: RubyLsp::EventEmitter

Inherits:
YARP::Visitor
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/ruby_lsp/event_emitter.rb

Overview

EventEmitter is an intermediary between our requests and YARP visitors. It’s used to visit the document’s AST and emit events that the requests can listen to for providing functionality. Usages:

  • For positional requests, locate the target node and use ‘emit_for_target` to fire events for each listener

  • For nonpositional requests, use ‘visit` to go through the AST, which will fire events for each listener as nodes

are found

# Example

“‘ruby target_node = document.locate_node(position) emitter = EventEmitter.new listener = Requests::Hover.new(emitter, @message_queue) emitter.emit_for_target(target_node) listener.response “`

Instance Method Summary collapse

Constructor Details

#initializeEventEmitter

Returns a new instance of EventEmitter.



25
26
27
28
# File 'lib/ruby_lsp/event_emitter.rb', line 25

def initialize
  @listeners = T.let(Hash.new { |h, k| h[k] = [] }, T::Hash[Symbol, T::Array[Listener[T.untyped]]])
  super()
end

Instance Method Details

#emit_for_target(node) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/ruby_lsp/event_emitter.rb', line 38

def emit_for_target(node)
  case node
  when YARP::CallNode
    @listeners[:on_call]&.each { |l| T.unsafe(l).on_call(node) }
  when YARP::ConstantPathNode
    @listeners[:on_constant_path]&.each { |l| T.unsafe(l).on_constant_path(node) }
  when YARP::StringNode
    @listeners[:on_string]&.each { |l| T.unsafe(l).on_string(node) }
  when YARP::ClassNode
    @listeners[:on_class]&.each { |l| T.unsafe(l).on_class(node) }
  when YARP::ModuleNode
    @listeners[:on_module]&.each { |l| T.unsafe(l).on_module(node) }
  when YARP::ConstantWriteNode
    @listeners[:on_constant_write]&.each { |l| T.unsafe(l).on_constant_write(node) }
  when YARP::ConstantReadNode
    @listeners[:on_constant_read]&.each { |l| T.unsafe(l).on_constant_read(node) }
  end
end

#register(listener, *events) ⇒ Object



31
32
33
# File 'lib/ruby_lsp/event_emitter.rb', line 31

def register(listener, *events)
  events.each { |event| T.must(@listeners[event]) << listener }
end

#visit(node) ⇒ Object



60
61
62
63
# File 'lib/ruby_lsp/event_emitter.rb', line 60

def visit(node)
  @listeners[:on_node]&.each { |l| T.unsafe(l).on_node(node) }
  super
end

#visit_all(nodes) ⇒ Object



66
67
68
# File 'lib/ruby_lsp/event_emitter.rb', line 66

def visit_all(nodes)
  nodes.each { |node| visit(node) }
end

#visit_array_node(node) ⇒ Object



280
281
282
283
# File 'lib/ruby_lsp/event_emitter.rb', line 280

def visit_array_node(node)
  @listeners[:on_array]&.each { |l| T.unsafe(l).on_array(node) }
  super
end

#visit_begin_node(node) ⇒ Object



340
341
342
343
# File 'lib/ruby_lsp/event_emitter.rb', line 340

def visit_begin_node(node)
  @listeners[:on_begin]&.each { |l| T.unsafe(l).on_begin(node) }
  super
end

#visit_block_local_variable_node(node) ⇒ Object



250
251
252
253
# File 'lib/ruby_lsp/event_emitter.rb', line 250

def visit_block_local_variable_node(node)
  @listeners[:on_block_local_variable]&.each { |l| T.unsafe(l).on_block_local_variable(node) }
  super
end

#visit_block_node(node) ⇒ Object



111
112
113
114
115
# File 'lib/ruby_lsp/event_emitter.rb', line 111

def visit_block_node(node)
  @listeners[:on_block]&.each { |l| T.unsafe(l).on_block(node) }
  super
  @listeners[:after_block]&.each { |l| T.unsafe(l).after_block(node) }
end

#visit_block_parameter_node(node) ⇒ Object



130
131
132
133
# File 'lib/ruby_lsp/event_emitter.rb', line 130

def visit_block_parameter_node(node)
  @listeners[:on_block_parameter]&.each { |l| T.unsafe(l).on_block_parameter(node) }
  super
end

#visit_call_node(node) ⇒ Object



85
86
87
88
89
# File 'lib/ruby_lsp/event_emitter.rb', line 85

def visit_call_node(node)
  @listeners[:on_call]&.each { |l| T.unsafe(l).on_call(node) }
  super
  @listeners[:after_call]&.each { |l| T.unsafe(l).after_call(node) }
end

#visit_case_node(node) ⇒ Object



286
287
288
289
# File 'lib/ruby_lsp/event_emitter.rb', line 286

def visit_case_node(node)
  @listeners[:on_case]&.each { |l| T.unsafe(l).on_case(node) }
  super
end

#visit_class_node(node) ⇒ Object



71
72
73
74
75
# File 'lib/ruby_lsp/event_emitter.rb', line 71

def visit_class_node(node)
  @listeners[:on_class]&.each { |l| T.unsafe(l).on_class(node) }
  super
  @listeners[:after_class]&.each { |l| T.unsafe(l).after_class(node) }
end

#visit_class_variable_write_node(node) ⇒ Object



98
99
100
101
# File 'lib/ruby_lsp/event_emitter.rb', line 98

def visit_class_variable_write_node(node)
  @listeners[:on_class_variable_write]&.each { |l| T.unsafe(l).on_class_variable_write(node) }
  super
end

#visit_constant_and_write_node(node) ⇒ Object



190
191
192
193
# File 'lib/ruby_lsp/event_emitter.rb', line 190

def visit_constant_and_write_node(node)
  @listeners[:on_constant_and_write]&.each { |l| T.unsafe(l).on_constant_and_write(node) }
  super
end

#visit_constant_operator_write_node(node) ⇒ Object



196
197
198
199
# File 'lib/ruby_lsp/event_emitter.rb', line 196

def visit_constant_operator_write_node(node)
  @listeners[:on_constant_operator_write]&.each { |l| T.unsafe(l).on_constant_operator_write(node) }
  super
end

#visit_constant_or_write_node(node) ⇒ Object



202
203
204
205
# File 'lib/ruby_lsp/event_emitter.rb', line 202

def visit_constant_or_write_node(node)
  @listeners[:on_constant_or_write]&.each { |l| T.unsafe(l).on_constant_or_write(node) }
  super
end

#visit_constant_path_node(node) ⇒ Object



172
173
174
175
# File 'lib/ruby_lsp/event_emitter.rb', line 172

def visit_constant_path_node(node)
  @listeners[:on_constant_path]&.each { |l| T.unsafe(l).on_constant_path(node) }
  super
end

#visit_constant_path_write_node(node) ⇒ Object



178
179
180
181
# File 'lib/ruby_lsp/event_emitter.rb', line 178

def visit_constant_path_write_node(node)
  @listeners[:on_constant_path_write]&.each { |l| T.unsafe(l).on_constant_path_write(node) }
  super
end

#visit_constant_read_node(node) ⇒ Object



166
167
168
169
# File 'lib/ruby_lsp/event_emitter.rb', line 166

def visit_constant_read_node(node)
  @listeners[:on_constant_read]&.each { |l| T.unsafe(l).on_constant_read(node) }
  super
end

#visit_constant_target_node(node) ⇒ Object



208
209
210
211
# File 'lib/ruby_lsp/event_emitter.rb', line 208

def visit_constant_target_node(node)
  @listeners[:on_constant_target]&.each { |l| T.unsafe(l).on_constant_target(node) }
  super
end

#visit_constant_write_node(node) ⇒ Object



184
185
186
187
# File 'lib/ruby_lsp/event_emitter.rb', line 184

def visit_constant_write_node(node)
  @listeners[:on_constant_write]&.each { |l| T.unsafe(l).on_constant_write(node) }
  super
end

#visit_def_node(node) ⇒ Object



104
105
106
107
108
# File 'lib/ruby_lsp/event_emitter.rb', line 104

def visit_def_node(node)
  @listeners[:on_def]&.each { |l| T.unsafe(l).on_def(node) }
  super
  @listeners[:after_def]&.each { |l| T.unsafe(l).after_def(node) }
end

#visit_else_node(node) ⇒ Object



328
329
330
331
# File 'lib/ruby_lsp/event_emitter.rb', line 328

def visit_else_node(node)
  @listeners[:on_else]&.each { |l| T.unsafe(l).on_else(node) }
  super
end

#visit_ensure_node(node) ⇒ Object



334
335
336
337
# File 'lib/ruby_lsp/event_emitter.rb', line 334

def visit_ensure_node(node)
  @listeners[:on_ensure]&.each { |l| T.unsafe(l).on_ensure(node) }
  super
end

#visit_for_node(node) ⇒ Object



292
293
294
295
# File 'lib/ruby_lsp/event_emitter.rb', line 292

def visit_for_node(node)
  @listeners[:on_for]&.each { |l| T.unsafe(l).on_for(node) }
  super
end

#visit_hash_node(node) ⇒ Object



298
299
300
301
# File 'lib/ruby_lsp/event_emitter.rb', line 298

def visit_hash_node(node)
  @listeners[:on_hash]&.each { |l| T.unsafe(l).on_hash(node) }
  super
end

#visit_if_node(node) ⇒ Object



256
257
258
259
# File 'lib/ruby_lsp/event_emitter.rb', line 256

def visit_if_node(node)
  @listeners[:on_if]&.each { |l| T.unsafe(l).on_if(node) }
  super
end

#visit_in_node(node) ⇒ Object



262
263
264
265
# File 'lib/ruby_lsp/event_emitter.rb', line 262

def visit_in_node(node)
  @listeners[:on_in]&.each { |l| T.unsafe(l).on_in(node) }
  super
end

#visit_instance_variable_write_node(node) ⇒ Object



92
93
94
95
# File 'lib/ruby_lsp/event_emitter.rb', line 92

def visit_instance_variable_write_node(node)
  @listeners[:on_instance_variable_write]&.each { |l| T.unsafe(l).on_instance_variable_write(node) }
  super
end

#visit_interpolated_string_node(node) ⇒ Object



274
275
276
277
# File 'lib/ruby_lsp/event_emitter.rb', line 274

def visit_interpolated_string_node(node)
  @listeners[:on_interpolated_string]&.each { |l| T.unsafe(l).on_interpolated_string(node) }
  super
end

#visit_keyword_parameter_node(node) ⇒ Object



136
137
138
139
# File 'lib/ruby_lsp/event_emitter.rb', line 136

def visit_keyword_parameter_node(node)
  @listeners[:on_keyword_parameter]&.each { |l| T.unsafe(l).on_keyword_parameter(node) }
  super
end

#visit_keyword_rest_parameter_node(node) ⇒ Object



142
143
144
145
# File 'lib/ruby_lsp/event_emitter.rb', line 142

def visit_keyword_rest_parameter_node(node)
  @listeners[:on_keyword_rest_parameter]&.each { |l| T.unsafe(l).on_keyword_rest_parameter(node) }
  super
end

#visit_local_variable_and_write_node(node) ⇒ Object



226
227
228
229
# File 'lib/ruby_lsp/event_emitter.rb', line 226

def visit_local_variable_and_write_node(node)
  @listeners[:on_local_variable_and_write]&.each { |l| T.unsafe(l).on_local_variable_and_write(node) }
  super
end

#visit_local_variable_operator_write_node(node) ⇒ Object



232
233
234
235
# File 'lib/ruby_lsp/event_emitter.rb', line 232

def visit_local_variable_operator_write_node(node)
  @listeners[:on_local_variable_operator_write]&.each { |l| T.unsafe(l).on_local_variable_operator_write(node) }
  super
end

#visit_local_variable_or_write_node(node) ⇒ Object



238
239
240
241
# File 'lib/ruby_lsp/event_emitter.rb', line 238

def visit_local_variable_or_write_node(node)
  @listeners[:on_local_variable_or_write]&.each { |l| T.unsafe(l).on_local_variable_or_write(node) }
  super
end

#visit_local_variable_read_node(node) ⇒ Object



220
221
222
223
# File 'lib/ruby_lsp/event_emitter.rb', line 220

def visit_local_variable_read_node(node)
  @listeners[:on_local_variable_read]&.each { |l| T.unsafe(l).on_local_variable_read(node) }
  super
end

#visit_local_variable_target_node(node) ⇒ Object



244
245
246
247
# File 'lib/ruby_lsp/event_emitter.rb', line 244

def visit_local_variable_target_node(node)
  @listeners[:on_local_variable_target]&.each { |l| T.unsafe(l).on_local_variable_target(node) }
  super
end

#visit_local_variable_write_node(node) ⇒ Object



214
215
216
217
# File 'lib/ruby_lsp/event_emitter.rb', line 214

def visit_local_variable_write_node(node)
  @listeners[:on_local_variable_write]&.each { |l| T.unsafe(l).on_local_variable_write(node) }
  super
end

#visit_module_node(node) ⇒ Object



78
79
80
81
82
# File 'lib/ruby_lsp/event_emitter.rb', line 78

def visit_module_node(node)
  @listeners[:on_module]&.each { |l| T.unsafe(l).on_module(node) }
  super
  @listeners[:after_module]&.each { |l| T.unsafe(l).after_module(node) }
end

#visit_optional_parameter_node(node) ⇒ Object



148
149
150
151
# File 'lib/ruby_lsp/event_emitter.rb', line 148

def visit_optional_parameter_node(node)
  @listeners[:on_optional_parameter]&.each { |l| T.unsafe(l).on_optional_parameter(node) }
  super
end

#visit_required_parameter_node(node) ⇒ Object



154
155
156
157
# File 'lib/ruby_lsp/event_emitter.rb', line 154

def visit_required_parameter_node(node)
  @listeners[:on_required_parameter]&.each { |l| T.unsafe(l).on_required_parameter(node) }
  super
end

#visit_rescue_node(node) ⇒ Object



124
125
126
127
# File 'lib/ruby_lsp/event_emitter.rb', line 124

def visit_rescue_node(node)
  @listeners[:on_rescue]&.each { |l| T.unsafe(l).on_rescue(node) }
  super
end

#visit_rest_parameter_node(node) ⇒ Object



160
161
162
163
# File 'lib/ruby_lsp/event_emitter.rb', line 160

def visit_rest_parameter_node(node)
  @listeners[:on_rest_parameter]&.each { |l| T.unsafe(l).on_rest_parameter(node) }
  super
end

#visit_self_node(node) ⇒ Object



118
119
120
121
# File 'lib/ruby_lsp/event_emitter.rb', line 118

def visit_self_node(node)
  @listeners[:on_self]&.each { |l| T.unsafe(l).on_self(node) }
  super
end

#visit_singleton_class_node(node) ⇒ Object



304
305
306
307
# File 'lib/ruby_lsp/event_emitter.rb', line 304

def visit_singleton_class_node(node)
  @listeners[:on_singleton_class]&.each { |l| T.unsafe(l).on_singleton_class(node) }
  super
end

#visit_string_concat_node(node) ⇒ Object



346
347
348
349
# File 'lib/ruby_lsp/event_emitter.rb', line 346

def visit_string_concat_node(node)
  @listeners[:on_string_concat]&.each { |l| T.unsafe(l).on_string_concat(node) }
  super
end

#visit_unless_node(node) ⇒ Object



310
311
312
313
# File 'lib/ruby_lsp/event_emitter.rb', line 310

def visit_unless_node(node)
  @listeners[:on_unless]&.each { |l| T.unsafe(l).on_unless(node) }
  super
end

#visit_until_node(node) ⇒ Object



316
317
318
319
# File 'lib/ruby_lsp/event_emitter.rb', line 316

def visit_until_node(node)
  @listeners[:on_until]&.each { |l| T.unsafe(l).on_until(node) }
  super
end

#visit_when_node(node) ⇒ Object



268
269
270
271
# File 'lib/ruby_lsp/event_emitter.rb', line 268

def visit_when_node(node)
  @listeners[:on_when]&.each { |l| T.unsafe(l).on_when(node) }
  super
end

#visit_while_node(node) ⇒ Object



322
323
324
325
# File 'lib/ruby_lsp/event_emitter.rb', line 322

def visit_while_node(node)
  @listeners[:on_while]&.each { |l| T.unsafe(l).on_while(node) }
  super
end