ruby-lsp 0.3.1 → 0.3.2
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/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/lib/ruby_lsp/queue.rb +29 -46
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +4 -0
- data/lib/ruby_lsp/server.rb +2 -4
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3e09a85000549c0b7b7dd2886b49d44ca2e32b830616a4af7181a2d7952f948f
|
|
4
|
+
data.tar.gz: f19b017ebffce3a090d9fe9c39c94cb0dad75a7a74856c099443839524d513f3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e0b75fa95c43a4a15a46e3cd663b5dd637c9288497116b356eb69dc3f831cfdbb3e167c1c578b68feee715e85c72d26c7d63236e3250552ddbf0f2db334e8f46
|
|
7
|
+
data.tar.gz: c80518dba77375f07f9944f0401f6836ca69bba60ba6723677e33e366104dd69b70832e8ce76c05312b47c3a032a5308711505e88be2ce69f3f837bec2db3c21
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,11 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.2]
|
|
10
|
+
|
|
11
|
+
- Make the diagnostic request parallel (https://github.com/Shopify/ruby-lsp/pull/293)
|
|
12
|
+
- Improve worker stability (https://github.com/Shopify/ruby-lsp/pull/295)
|
|
13
|
+
|
|
9
14
|
## [0.3.1]
|
|
10
15
|
|
|
11
16
|
- Resolve TODO for LSP v3.17 (https://github.com/Shopify/ruby-lsp/pull/268)
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.2
|
data/lib/ruby_lsp/queue.rb
CHANGED
|
@@ -7,8 +7,6 @@ module RubyLsp
|
|
|
7
7
|
class Queue
|
|
8
8
|
extend T::Sig
|
|
9
9
|
|
|
10
|
-
class Cancelled < StandardError; end
|
|
11
|
-
|
|
12
10
|
class Result < T::Struct
|
|
13
11
|
const :response, T.untyped # rubocop:disable Sorbet/ForbidUntypedStructProps
|
|
14
12
|
const :error, T.nilable(Exception)
|
|
@@ -40,8 +38,6 @@ module RubyLsp
|
|
|
40
38
|
@job_queue = T.let(Thread::Queue.new, Thread::Queue)
|
|
41
39
|
# The jobs hash is just a way of keeping a handle to jobs based on the request ID, so we can cancel them
|
|
42
40
|
@jobs = T.let({}, T::Hash[T.any(String, Integer), Job])
|
|
43
|
-
# The current job is a handle to cancel jobs that are currently being processed
|
|
44
|
-
@current_job = T.let(nil, T.nilable(Job))
|
|
45
41
|
@mutex = T.let(Mutex.new, Mutex)
|
|
46
42
|
@worker = T.let(new_worker, Thread)
|
|
47
43
|
|
|
@@ -65,11 +61,6 @@ module RubyLsp
|
|
|
65
61
|
@mutex.synchronize do
|
|
66
62
|
# Cancel the job if it's still in the queue
|
|
67
63
|
@jobs[id]&.cancel
|
|
68
|
-
|
|
69
|
-
# Cancel the job if we're in the middle of processing it
|
|
70
|
-
if @current_job&.request&.dig(:id) == id
|
|
71
|
-
@worker.raise(Cancelled)
|
|
72
|
-
end
|
|
73
64
|
end
|
|
74
65
|
end
|
|
75
66
|
|
|
@@ -92,8 +83,6 @@ module RubyLsp
|
|
|
92
83
|
|
|
93
84
|
request_time = Benchmark.realtime do
|
|
94
85
|
response = T.must(@handlers[request[:method]]).action.call(request)
|
|
95
|
-
rescue Cancelled
|
|
96
|
-
raise
|
|
97
86
|
rescue StandardError, LoadError => e
|
|
98
87
|
error = e
|
|
99
88
|
end
|
|
@@ -109,25 +98,27 @@ module RubyLsp
|
|
|
109
98
|
).void
|
|
110
99
|
end
|
|
111
100
|
def finalize_request(result, request)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
101
|
+
@mutex.synchronize do
|
|
102
|
+
error = result.error
|
|
103
|
+
if error
|
|
104
|
+
T.must(@handlers[request[:method]]).error_handler&.call(error, request)
|
|
105
|
+
|
|
106
|
+
@writer.write(
|
|
107
|
+
id: request[:id],
|
|
108
|
+
error: {
|
|
109
|
+
code: LanguageServer::Protocol::Constant::ErrorCodes::INTERNAL_ERROR,
|
|
110
|
+
message: result.error.inspect,
|
|
111
|
+
data: request.to_json,
|
|
112
|
+
},
|
|
113
|
+
)
|
|
114
|
+
elsif result.response != Handler::VOID
|
|
115
|
+
@writer.write(id: request[:id], result: result.response)
|
|
116
|
+
end
|
|
127
117
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
118
|
+
request_time = result.request_time
|
|
119
|
+
if request_time
|
|
120
|
+
@writer.write(method: "telemetry/event", params: telemetry_params(request, request_time, result.error))
|
|
121
|
+
end
|
|
131
122
|
end
|
|
132
123
|
end
|
|
133
124
|
|
|
@@ -139,28 +130,20 @@ module RubyLsp
|
|
|
139
130
|
# Thread::Queue#pop is thread safe and will wait until an item is available
|
|
140
131
|
loop do
|
|
141
132
|
job = T.let(@job_queue.pop, T.nilable(Job))
|
|
142
|
-
break if job.nil?
|
|
143
|
-
|
|
144
133
|
# The only time when the job is nil is when the queue is closed and we can then terminate the thread
|
|
134
|
+
break if job.nil?
|
|
145
135
|
|
|
146
136
|
request = job.request
|
|
147
|
-
@mutex.synchronize
|
|
148
|
-
@jobs.delete(request[:id])
|
|
149
|
-
@current_job = job
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
next if job.cancelled
|
|
137
|
+
@mutex.synchronize { @jobs.delete(request[:id]) }
|
|
153
138
|
|
|
154
|
-
result =
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
139
|
+
result = if job.cancelled
|
|
140
|
+
# We need to return nil to the client even if the request was cancelled
|
|
141
|
+
Queue::Result.new(response: nil, error: nil, request_time: nil)
|
|
142
|
+
else
|
|
143
|
+
execute(request)
|
|
144
|
+
end
|
|
160
145
|
|
|
161
|
-
|
|
162
|
-
# after
|
|
163
|
-
finalize_request(result, request) unless result.nil? || request.nil?
|
|
146
|
+
finalize_request(result, request)
|
|
164
147
|
end
|
|
165
148
|
end
|
|
166
149
|
end
|
|
@@ -14,6 +14,8 @@ module RubyLsp
|
|
|
14
14
|
class RuboCopRunner < RuboCop::Runner
|
|
15
15
|
extend T::Sig
|
|
16
16
|
|
|
17
|
+
class ConfigurationError < StandardError; end
|
|
18
|
+
|
|
17
19
|
sig { returns(T::Array[RuboCop::Cop::Offense]) }
|
|
18
20
|
attr_reader :offenses
|
|
19
21
|
|
|
@@ -50,6 +52,8 @@ module RubyLsp
|
|
|
50
52
|
super([path])
|
|
51
53
|
rescue RuboCop::Runner::InfiniteCorrectionLoop => error
|
|
52
54
|
raise Formatting::Error, error.message
|
|
55
|
+
rescue RuboCop::ValidationError => error
|
|
56
|
+
raise ConfigurationError, error.message
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
sig { returns(String) }
|
data/lib/ruby_lsp/server.rb
CHANGED
|
@@ -191,7 +191,7 @@ module RubyLsp
|
|
|
191
191
|
Handler::VOID
|
|
192
192
|
end
|
|
193
193
|
|
|
194
|
-
on("textDocument/diagnostic") do |request|
|
|
194
|
+
on("textDocument/diagnostic", parallel: true) do |request|
|
|
195
195
|
uri = request.dig(:params, :textDocument, :uri)
|
|
196
196
|
response = store.cache_fetch(uri, :diagnostics) do |document|
|
|
197
197
|
Requests::Diagnostics.new(uri, document).run
|
|
@@ -199,9 +199,7 @@ module RubyLsp
|
|
|
199
199
|
|
|
200
200
|
{ kind: "full", items: response.map(&:to_lsp_diagnostic) } if response
|
|
201
201
|
end.on_error do |error|
|
|
202
|
-
|
|
203
|
-
show_message(Constant::MessageType::ERROR, "Error in RuboCop configuration file: #{error.message}")
|
|
204
|
-
end
|
|
202
|
+
show_message(Constant::MessageType::ERROR, "Error running diagnostics: #{error.message}")
|
|
205
203
|
end
|
|
206
204
|
|
|
207
205
|
on("shutdown") { shutdown }
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ruby-lsp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Shopify
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-09-
|
|
11
|
+
date: 2022-09-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: language_server-protocol
|