Skip to content

Commit b47335b

Browse files
authored
Preperation for server addons (#440)
1 parent 371a492 commit b47335b

File tree

4 files changed

+26
-19
lines changed

4 files changed

+26
-19
lines changed

lib/ruby_lsp/ruby_lsp_rails/addon.rb

+13-9
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,27 @@ def initialize
2626

2727
# We first initialize the client as a NullClient, so that we can start the server in a background thread. Until
2828
# the real client is initialized, features that depend on it will not be blocked by using the NullClient
29-
@client = T.let(NullClient.new, RunnerClient)
29+
@rails_runner_client = T.let(NullClient.new, RunnerClient)
30+
@global_state = T.let(nil, T.nilable(GlobalState))
3031
end
3132

33+
sig { returns(RunnerClient) }
34+
attr_reader :rails_runner_client
35+
3236
sig { override.params(global_state: GlobalState, message_queue: Thread::Queue).void }
3337
def activate(global_state, message_queue)
34-
@global_state = T.let(global_state, T.nilable(RubyLsp::GlobalState))
38+
@global_state = global_state
3539
$stderr.puts("Activating Ruby LSP Rails addon v#{VERSION}")
3640
# Start booting the real client in a background thread. Until this completes, the client will be a NullClient
37-
Thread.new { @client = RunnerClient.create_client }
41+
Thread.new { @rails_runner_client = RunnerClient.create_client }
3842
register_additional_file_watchers(global_state: global_state, message_queue: message_queue)
3943

40-
T.must(@global_state).index.register_enhancement(IndexingEnhancement.new)
44+
@global_state.index.register_enhancement(IndexingEnhancement.new)
4145
end
4246

4347
sig { override.void }
4448
def deactivate
45-
@client.shutdown
49+
@rails_runner_client.shutdown
4650
end
4751

4852
# Creates a new CodeLens listener. This method is invoked on every CodeLens request
@@ -54,7 +58,7 @@ def deactivate
5458
).void
5559
end
5660
def create_code_lens_listener(response_builder, uri, dispatcher)
57-
CodeLens.new(@client, T.must(@global_state), response_builder, uri, dispatcher)
61+
CodeLens.new(@rails_runner_client, T.must(@global_state), response_builder, uri, dispatcher)
5862
end
5963

6064
sig do
@@ -65,7 +69,7 @@ def create_code_lens_listener(response_builder, uri, dispatcher)
6569
).void
6670
end
6771
def create_hover_listener(response_builder, node_context, dispatcher)
68-
Hover.new(@client, response_builder, node_context, T.must(@global_state), dispatcher)
72+
Hover.new(@rails_runner_client, response_builder, node_context, T.must(@global_state), dispatcher)
6973
end
7074

7175
sig do
@@ -90,15 +94,15 @@ def create_document_symbol_listener(response_builder, dispatcher)
9094
end
9195
def create_definition_listener(response_builder, uri, node_context, dispatcher)
9296
index = T.must(@global_state).index
93-
Definition.new(@client, response_builder, node_context, index, dispatcher)
97+
Definition.new(@rails_runner_client, response_builder, node_context, index, dispatcher)
9498
end
9599

96100
sig { params(changes: T::Array[{ uri: String, type: Integer }]).void }
97101
def workspace_did_change_watched_files(changes)
98102
if changes.any? do |change|
99103
change[:uri].end_with?("db/schema.rb") || change[:uri].end_with?("structure.sql")
100104
end
101-
@client.trigger_reload
105+
@rails_runner_client.trigger_reload
102106
end
103107
end
104108

lib/ruby_lsp/ruby_lsp_rails/runner_client.rb

+11-8
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,11 @@ def initialize
6363
@stdout = T.let(stdout, IO)
6464
@stderr = T.let(stderr, IO)
6565
@wait_thread = T.let(wait_thread, Process::Waiter)
66-
@stdin.binmode # for Windows compatibility
67-
@stdout.binmode # for Windows compatibility
66+
67+
# We set binmode for Windows compatibility
68+
@stdin.binmode
69+
@stdout.binmode
70+
@stderr.binmode
6871

6972
$stderr.puts("Ruby LSP Rails booting server")
7073
count = 0
@@ -158,8 +161,6 @@ def stopped?
158161
[@stdin, @stdout, @stderr].all?(&:closed?) && !@wait_thread.alive?
159162
end
160163

161-
private
162-
163164
sig do
164165
params(
165166
request: String,
@@ -171,6 +172,12 @@ def make_request(request, params = nil)
171172
read_response
172173
end
173174

175+
# Notifications are like messages, but one-way, with no response sent back.
176+
sig { params(request: String, params: T.nilable(T::Hash[Symbol, T.untyped])).void }
177+
def send_notification(request, params = nil) = send_message(request, params)
178+
179+
private
180+
174181
sig { overridable.params(request: String, params: T.nilable(T::Hash[Symbol, T.untyped])).void }
175182
def send_message(request, params = nil)
176183
message = { method: request }
@@ -184,10 +191,6 @@ def send_message(request, params = nil)
184191
# The server connection died
185192
end
186193

187-
# Notifications are like messages, but one-way, with no response sent back.
188-
sig { params(request: String, params: T.nilable(T::Hash[Symbol, T.untyped])).void }
189-
def send_notification(request, params = nil) = send_message(request, params)
190-
191194
sig { overridable.returns(T.nilable(T::Hash[Symbol, T.untyped])) }
192195
def read_response
193196
raw_response = @mutex.synchronize do

test/ruby_lsp_rails/code_lens_test.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ def index
384384

385385
def generate_code_lens_for_source(source, file: "/fake.rb")
386386
with_server(source, URI(file)) do |server, uri|
387-
sleep(0.1) while RubyLsp::Addon.addons.first.instance_variable_get(:@client).is_a?(NullClient)
387+
sleep(0.1) while RubyLsp::Addon.addons.first.instance_variable_get(:@rails_runner_client).is_a?(NullClient)
388388

389389
server.process_message(
390390
id: 1,

test/ruby_lsp_rails/definition_test.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def baz; end
225225

226226
def generate_definitions_for_source(source, position)
227227
with_server(source) do |server, uri|
228-
sleep(0.1) while RubyLsp::Addon.addons.first.instance_variable_get(:@client).is_a?(NullClient)
228+
sleep(0.1) while RubyLsp::Addon.addons.first.instance_variable_get(:@rails_runner_client).is_a?(NullClient)
229229

230230
server.process_message(
231231
id: 1,

0 commit comments

Comments
 (0)