ruby-lsp 0.16.2 → 0.16.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/ruby_lsp/document.rb +6 -6
- data/lib/ruby_lsp/global_state.rb +38 -7
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +1 -1
- data/lib/ruby_lsp/server.rb +21 -24
- data/lib/ruby_lsp/setup_bundler.rb +13 -1
- data/lib/ruby_lsp/store.rb +3 -7
- 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: 906f8ef7ff4c3c0da126b61e41772b36989c93e391575099121c7a31184de81c
|
4
|
+
data.tar.gz: 67eb8cd92613348b9b2bf7163b458ed0ba7772e4c0304c01b80e3b0c4e8b34c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6b28979f399686bf62943bb49036ed26411a11439120f8ddf52f7c86310ecc8964d32de8fffe98c12686021f8d2b019c49347de4ced546a1a2e4e1b47726bfd
|
7
|
+
data.tar.gz: 3339ddda6a9450cf4449a0336a38ec4bdd95b4d81e9b2aa834bfd87db11f3bb2d0caf02e5ad4d0366f040d4718046e36744750e46ef9638b78a4235f0dfad1b7
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.16.
|
1
|
+
0.16.3
|
data/lib/ruby_lsp/document.rb
CHANGED
@@ -20,13 +20,13 @@ module RubyLsp
|
|
20
20
|
sig { returns(URI::Generic) }
|
21
21
|
attr_reader :uri
|
22
22
|
|
23
|
-
sig { returns(
|
23
|
+
sig { returns(Encoding) }
|
24
24
|
attr_reader :encoding
|
25
25
|
|
26
|
-
sig { params(source: String, version: Integer, uri: URI::Generic, encoding:
|
27
|
-
def initialize(source:, version:, uri:, encoding:
|
26
|
+
sig { params(source: String, version: Integer, uri: URI::Generic, encoding: Encoding).void }
|
27
|
+
def initialize(source:, version:, uri:, encoding: Encoding::UTF_8)
|
28
28
|
@cache = T.let({}, T::Hash[String, T.untyped])
|
29
|
-
@encoding = T.let(encoding,
|
29
|
+
@encoding = T.let(encoding, Encoding)
|
30
30
|
@source = T.let(source, String)
|
31
31
|
@version = T.let(version, Integer)
|
32
32
|
@uri = T.let(uri, URI::Generic)
|
@@ -187,7 +187,7 @@ module RubyLsp
|
|
187
187
|
# After character 0xFFFF, UTF-16 considers characters to have length 2 and we have to account for that
|
188
188
|
SURROGATE_PAIR_START = T.let(0xFFFF, Integer)
|
189
189
|
|
190
|
-
sig { params(source: String, encoding:
|
190
|
+
sig { params(source: String, encoding: Encoding).void }
|
191
191
|
def initialize(source, encoding)
|
192
192
|
@current_line = T.let(0, Integer)
|
193
193
|
@pos = T.let(0, Integer)
|
@@ -209,7 +209,7 @@ module RubyLsp
|
|
209
209
|
# need to adjust for surrogate pairs
|
210
210
|
requested_position = @pos + position[:character]
|
211
211
|
|
212
|
-
if @encoding ==
|
212
|
+
if @encoding == Encoding::UTF_16LE
|
213
213
|
requested_position -= utf_16_character_position_correction(@pos, requested_position)
|
214
214
|
end
|
215
215
|
|
@@ -17,9 +17,13 @@ module RubyLsp
|
|
17
17
|
sig { returns(RubyIndexer::Index) }
|
18
18
|
attr_reader :index
|
19
19
|
|
20
|
+
sig { returns(Encoding) }
|
21
|
+
attr_reader :encoding
|
22
|
+
|
20
23
|
sig { void }
|
21
24
|
def initialize
|
22
25
|
@workspace_uri = T.let(URI::Generic.from_path(path: Dir.pwd), URI::Generic)
|
26
|
+
@encoding = T.let(Encoding::UTF_8, Encoding)
|
23
27
|
|
24
28
|
@formatter = T.let("auto", String)
|
25
29
|
@test_library = T.let(detect_test_library, String)
|
@@ -46,6 +50,17 @@ module RubyLsp
|
|
46
50
|
specified_formatter = options.dig(:initializationOptions, :formatter)
|
47
51
|
@formatter = specified_formatter if specified_formatter
|
48
52
|
@formatter = detect_formatter if @formatter == "auto"
|
53
|
+
|
54
|
+
encodings = options.dig(:capabilities, :general, :positionEncodings)
|
55
|
+
@encoding = if !encodings || encodings.empty?
|
56
|
+
Encoding::UTF_16LE
|
57
|
+
elsif encodings.include?(Constant::PositionEncodingKind::UTF8)
|
58
|
+
Encoding::UTF_8
|
59
|
+
elsif encodings.include?(Constant::PositionEncodingKind::UTF16)
|
60
|
+
Encoding::UTF_16LE
|
61
|
+
else
|
62
|
+
Encoding::UTF_32
|
63
|
+
end
|
49
64
|
end
|
50
65
|
|
51
66
|
sig { returns(String) }
|
@@ -53,6 +68,25 @@ module RubyLsp
|
|
53
68
|
T.must(@workspace_uri.to_standardized_path)
|
54
69
|
end
|
55
70
|
|
71
|
+
sig { returns(String) }
|
72
|
+
def encoding_name
|
73
|
+
case @encoding
|
74
|
+
when Encoding::UTF_8
|
75
|
+
Constant::PositionEncodingKind::UTF8
|
76
|
+
when Encoding::UTF_16LE
|
77
|
+
Constant::PositionEncodingKind::UTF16
|
78
|
+
else
|
79
|
+
Constant::PositionEncodingKind::UTF32
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
sig { params(gem_pattern: Regexp).returns(T::Boolean) }
|
84
|
+
def direct_dependency?(gem_pattern)
|
85
|
+
dependencies.any?(gem_pattern)
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
56
90
|
sig { returns(String) }
|
57
91
|
def detect_formatter
|
58
92
|
# NOTE: Intentionally no $ at end, since we want to match rubocop-shopify, etc.
|
@@ -70,8 +104,10 @@ module RubyLsp
|
|
70
104
|
if direct_dependency?(/^rspec/)
|
71
105
|
"rspec"
|
72
106
|
# A Rails app may have a dependency on minitest, but we would instead want to use the Rails test runner provided
|
73
|
-
# by ruby-lsp-rails.
|
74
|
-
|
107
|
+
# by ruby-lsp-rails. A Rails app doesn't need to depend on the rails gem itself, individual components like
|
108
|
+
# activestorage may be added to the gemfile so that other components aren't downloaded. Check for the presence
|
109
|
+
# of bin/rails to support these cases.
|
110
|
+
elsif File.exist?(File.join(workspace_path, "bin/rails"))
|
75
111
|
"rails"
|
76
112
|
# NOTE: Intentionally ends with $ to avoid mis-matching minitest-reporters, etc. in a Rails app.
|
77
113
|
elsif direct_dependency?(/^minitest$/)
|
@@ -83,11 +119,6 @@ module RubyLsp
|
|
83
119
|
end
|
84
120
|
end
|
85
121
|
|
86
|
-
sig { params(gem_pattern: Regexp).returns(T::Boolean) }
|
87
|
-
def direct_dependency?(gem_pattern)
|
88
|
-
dependencies.any?(gem_pattern)
|
89
|
-
end
|
90
|
-
|
91
122
|
sig { returns(T::Boolean) }
|
92
123
|
def detect_typechecker
|
93
124
|
return false if ENV["RUBY_LSP_BYPASS_TYPECHECKER"]
|
@@ -163,7 +163,7 @@ module RubyLsp
|
|
163
163
|
|
164
164
|
sig { params(line: String).returns(Integer) }
|
165
165
|
def length_of_line(line)
|
166
|
-
if @document.encoding ==
|
166
|
+
if @document.encoding == Encoding::UTF_16LE
|
167
167
|
line_length = 0
|
168
168
|
line.codepoints.each do |codepoint|
|
169
169
|
line_length += 1
|
data/lib/ruby_lsp/server.rb
CHANGED
@@ -118,15 +118,6 @@ module RubyLsp
|
|
118
118
|
client_name = options.dig(:clientInfo, :name)
|
119
119
|
@store.client_name = client_name if client_name
|
120
120
|
|
121
|
-
encodings = options.dig(:capabilities, :general, :positionEncodings)
|
122
|
-
@store.encoding = if encodings.nil? || encodings.empty?
|
123
|
-
Constant::PositionEncodingKind::UTF16
|
124
|
-
elsif encodings.include?(Constant::PositionEncodingKind::UTF8)
|
125
|
-
Constant::PositionEncodingKind::UTF8
|
126
|
-
else
|
127
|
-
encodings.first
|
128
|
-
end
|
129
|
-
|
130
121
|
progress = options.dig(:capabilities, :window, :workDoneProgress)
|
131
122
|
@store.supports_progress = progress.nil? ? true : progress
|
132
123
|
configured_features = options.dig(:initializationOptions, :enabledFeatures)
|
@@ -168,7 +159,7 @@ module RubyLsp
|
|
168
159
|
change: Constant::TextDocumentSyncKind::INCREMENTAL,
|
169
160
|
open_close: true,
|
170
161
|
),
|
171
|
-
position_encoding: @
|
162
|
+
position_encoding: @global_state.encoding_name,
|
172
163
|
selection_range_provider: enabled_features["selectionRanges"],
|
173
164
|
hover_provider: hover_provider,
|
174
165
|
document_symbol_provider: document_symbol_provider,
|
@@ -269,25 +260,31 @@ module RubyLsp
|
|
269
260
|
|
270
261
|
sig { params(message: T::Hash[Symbol, T.untyped]).void }
|
271
262
|
def text_document_did_open(message)
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
263
|
+
@mutex.synchronize do
|
264
|
+
text_document = message.dig(:params, :textDocument)
|
265
|
+
@store.set(
|
266
|
+
uri: text_document[:uri],
|
267
|
+
source: text_document[:text],
|
268
|
+
version: text_document[:version],
|
269
|
+
encoding: @global_state.encoding,
|
270
|
+
)
|
271
|
+
end
|
277
272
|
end
|
278
273
|
|
279
274
|
sig { params(message: T::Hash[Symbol, T.untyped]).void }
|
280
275
|
def text_document_did_close(message)
|
281
|
-
|
282
|
-
|
276
|
+
@mutex.synchronize do
|
277
|
+
uri = message.dig(:params, :textDocument, :uri)
|
278
|
+
@store.delete(uri)
|
283
279
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
280
|
+
# Clear diagnostics for the closed file, so that they no longer appear in the problems tab
|
281
|
+
send_message(
|
282
|
+
Notification.new(
|
283
|
+
method: "textDocument/publishDiagnostics",
|
284
|
+
params: Interface::PublishDiagnosticsParams.new(uri: uri.to_s, diagnostics: []),
|
285
|
+
),
|
286
|
+
)
|
287
|
+
end
|
291
288
|
end
|
292
289
|
|
293
290
|
sig { params(message: T::Hash[Symbol, T.untyped]).void }
|
@@ -19,6 +19,7 @@ module RubyLsp
|
|
19
19
|
extend T::Sig
|
20
20
|
|
21
21
|
class BundleNotLocked < StandardError; end
|
22
|
+
class BundleInstallFailure < StandardError; end
|
22
23
|
|
23
24
|
FOUR_HOURS = T.let(4 * 60 * 60, Integer)
|
24
25
|
|
@@ -49,6 +50,7 @@ module RubyLsp
|
|
49
50
|
@last_updated_path = T.let(@custom_dir + "last_updated", Pathname)
|
50
51
|
|
51
52
|
@dependencies = T.let(load_dependencies, T::Hash[String, T.untyped])
|
53
|
+
@retry = T.let(false, T::Boolean)
|
52
54
|
end
|
53
55
|
|
54
56
|
# Sets up the custom bundle and returns the `BUNDLE_GEMFILE`, `BUNDLE_PATH` and `BUNDLE_APP_CONFIG` that should be
|
@@ -224,7 +226,17 @@ module RubyLsp
|
|
224
226
|
# Add bundle update
|
225
227
|
$stderr.puts("Ruby LSP> Running bundle install for the custom bundle. This may take a while...")
|
226
228
|
$stderr.puts("Ruby LSP> Command: #{command}")
|
227
|
-
|
229
|
+
|
230
|
+
# Try to run the bundle install or update command. If that fails, it normally means that the custom lockfile is in
|
231
|
+
# a bad state that no longer reflects the top level one. In that case, we can remove the whole directory, try
|
232
|
+
# another time and give up if it fails again
|
233
|
+
if !system(env, command) && !@retry && @custom_dir.exist?
|
234
|
+
@retry = true
|
235
|
+
@custom_dir.rmtree
|
236
|
+
$stderr.puts("Ruby LSP> Running bundle install failed. Trying to re-generate the custom bundle from scratch")
|
237
|
+
return setup!
|
238
|
+
end
|
239
|
+
|
228
240
|
[bundle_gemfile.to_s, expanded_path, env["BUNDLE_APP_CONFIG"]]
|
229
241
|
end
|
230
242
|
|
data/lib/ruby_lsp/store.rb
CHANGED
@@ -5,9 +5,6 @@ module RubyLsp
|
|
5
5
|
class Store
|
6
6
|
extend T::Sig
|
7
7
|
|
8
|
-
sig { returns(String) }
|
9
|
-
attr_accessor :encoding
|
10
|
-
|
11
8
|
sig { returns(T::Boolean) }
|
12
9
|
attr_accessor :supports_progress
|
13
10
|
|
@@ -23,7 +20,6 @@ module RubyLsp
|
|
23
20
|
sig { void }
|
24
21
|
def initialize
|
25
22
|
@state = T.let({}, T::Hash[String, Document])
|
26
|
-
@encoding = T.let(Constant::PositionEncodingKind::UTF8, String)
|
27
23
|
@supports_progress = T.let(true, T::Boolean)
|
28
24
|
@experimental_features = T.let(false, T::Boolean)
|
29
25
|
@features_configuration = T.let(
|
@@ -49,9 +45,9 @@ module RubyLsp
|
|
49
45
|
T.must(@state[uri.to_s])
|
50
46
|
end
|
51
47
|
|
52
|
-
sig { params(uri: URI::Generic, source: String, version: Integer).void }
|
53
|
-
def set(uri:, source:, version:)
|
54
|
-
document = RubyDocument.new(source: source, version: version, uri: uri, encoding:
|
48
|
+
sig { params(uri: URI::Generic, source: String, version: Integer, encoding: Encoding).void }
|
49
|
+
def set(uri:, source:, version:, encoding: Encoding::UTF_8)
|
50
|
+
document = RubyDocument.new(source: source, version: version, uri: uri, encoding: encoding)
|
55
51
|
@state[uri.to_s] = document
|
56
52
|
end
|
57
53
|
|
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.16.
|
4
|
+
version: 0.16.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-04-
|
11
|
+
date: 2024-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: language_server-protocol
|