ruby-lsp 0.14.0 → 0.14.1
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/README.md +3 -0
- data/VERSION +1 -1
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +5 -5
- data/lib/ruby_indexer/test/index_test.rb +33 -9
- data/lib/ruby_lsp/listeners/completion.rb +5 -2
- data/lib/ruby_lsp/listeners/definition.rb +22 -14
- data/lib/ruby_lsp/listeners/document_symbol.rb +111 -12
- data/lib/ruby_lsp/listeners/hover.rb +11 -5
- data/lib/ruby_lsp/listeners/signature_help.rb +5 -2
- data/lib/ruby_lsp/requests/code_lens.rb +2 -2
- data/lib/ruby_lsp/requests/support/common.rb +15 -0
- data/lib/ruby_lsp/setup_bundler.rb +34 -18
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5881826c3ac1a810dd585343edde142df892845da187fa12bb6e95073441b1c3
|
4
|
+
data.tar.gz: 4fb97013a3ed44bef08cf0a42e1ed3439af38849cf36c1649bcdae317ff62e01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3cd87e2979f87711c141dcf78a9041e783d903289ce4edbef0cec238a4ed8291e936935cce043e8c455c8a0dfd1da8f57decf0765391b2c49a7c7e9b79fd3136
|
7
|
+
data.tar.gz: 5a427cb75dd28cadd4d92992f4ba679510c281ca92ba8c39af973d4498cd575e3b4f5b30bc58e6417ad57f396a761fb5a0f37ce9a956f2ef616d43c0168aee90
|
data/README.md
CHANGED
@@ -85,6 +85,9 @@ features. This is the mechanism that powers addons like
|
|
85
85
|
- [Ruby LSP RSpec](https://github.com/st0012/ruby-lsp-rspec)
|
86
86
|
- [Ruby LSP rubyfmt](https://github.com/jscharf/ruby-lsp-rubyfmt)
|
87
87
|
|
88
|
+
Other community driven addons can be found in [rubygems](https://rubygems.org/search?query=name%3A+ruby-lsp) by
|
89
|
+
searching for the `ruby-lsp` prefix.
|
90
|
+
|
88
91
|
For instructions on how to create addons, see the [addons documentation](ADDONS.md).
|
89
92
|
|
90
93
|
## Learn More
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.14.
|
1
|
+
0.14.1
|
@@ -237,9 +237,9 @@ module RubyIndexer
|
|
237
237
|
real_parts.join("::")
|
238
238
|
end
|
239
239
|
|
240
|
-
# Attempts to find
|
241
|
-
# exist on that receiver
|
242
|
-
sig { params(method_name: String, receiver_name: String).returns(T.nilable(Entry::Member)) }
|
240
|
+
# Attempts to find methods for a resolved fully qualified receiver name.
|
241
|
+
# Returns `nil` if the method does not exist on that receiver
|
242
|
+
sig { params(method_name: String, receiver_name: String).returns(T.nilable(T::Array[Entry::Member])) }
|
243
243
|
def resolve_method(method_name, receiver_name)
|
244
244
|
method_entries = self[method_name]
|
245
245
|
owner_entries = self[receiver_name]
|
@@ -247,10 +247,10 @@ module RubyIndexer
|
|
247
247
|
|
248
248
|
owner_name = T.must(owner_entries.first).name
|
249
249
|
T.cast(
|
250
|
-
method_entries.grep(Entry::Member).
|
250
|
+
method_entries.grep(Entry::Member).select do |entry|
|
251
251
|
T.cast(entry, Entry::Member).owner&.name == owner_name
|
252
252
|
end,
|
253
|
-
T
|
253
|
+
T::Array[Entry::Member],
|
254
254
|
)
|
255
255
|
end
|
256
256
|
|
@@ -226,9 +226,9 @@ module RubyIndexer
|
|
226
226
|
end
|
227
227
|
RUBY
|
228
228
|
|
229
|
-
|
230
|
-
assert_equal("baz",
|
231
|
-
assert_equal("Foo::Bar", T.must(
|
229
|
+
entries = T.must(@index.resolve_method("baz", "Foo::Bar"))
|
230
|
+
assert_equal("baz", entries.first.name)
|
231
|
+
assert_equal("Foo::Bar", T.must(entries.first.owner).name)
|
232
232
|
end
|
233
233
|
|
234
234
|
def test_resolve_method_with_class_name_conflict
|
@@ -241,9 +241,9 @@ module RubyIndexer
|
|
241
241
|
end
|
242
242
|
RUBY
|
243
243
|
|
244
|
-
|
245
|
-
assert_equal("Array",
|
246
|
-
assert_equal("Foo", T.must(
|
244
|
+
entries = T.must(@index.resolve_method("Array", "Foo"))
|
245
|
+
assert_equal("Array", entries.first.name)
|
246
|
+
assert_equal("Foo", T.must(entries.first.owner).name)
|
247
247
|
end
|
248
248
|
|
249
249
|
def test_resolve_method_attribute
|
@@ -253,9 +253,33 @@ module RubyIndexer
|
|
253
253
|
end
|
254
254
|
RUBY
|
255
255
|
|
256
|
-
|
257
|
-
assert_equal("bar",
|
258
|
-
assert_equal("Foo", T.must(
|
256
|
+
entries = T.must(@index.resolve_method("bar", "Foo"))
|
257
|
+
assert_equal("bar", entries.first.name)
|
258
|
+
assert_equal("Foo", T.must(entries.first.owner).name)
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_resolve_method_with_two_definitions
|
262
|
+
index(<<~RUBY)
|
263
|
+
class Foo
|
264
|
+
# Hello from first `bar`
|
265
|
+
def bar; end
|
266
|
+
end
|
267
|
+
|
268
|
+
class Foo
|
269
|
+
# Hello from second `bar`
|
270
|
+
def bar; end
|
271
|
+
end
|
272
|
+
RUBY
|
273
|
+
|
274
|
+
first_entry, second_entry = T.must(@index.resolve_method("bar", "Foo"))
|
275
|
+
|
276
|
+
assert_equal("bar", first_entry.name)
|
277
|
+
assert_equal("Foo", T.must(first_entry.owner).name)
|
278
|
+
assert_includes(first_entry.comments, "Hello from first `bar`")
|
279
|
+
|
280
|
+
assert_equal("bar", second_entry.name)
|
281
|
+
assert_equal("Foo", T.must(second_entry.owner).name)
|
282
|
+
assert_includes(second_entry.comments, "Hello from second `bar`")
|
259
283
|
end
|
260
284
|
|
261
285
|
def test_prefix_search_for_methods
|
@@ -43,7 +43,9 @@ module RubyLsp
|
|
43
43
|
def on_constant_read_node_enter(node)
|
44
44
|
return if DependencyDetector.instance.typechecker
|
45
45
|
|
46
|
-
name = node
|
46
|
+
name = constant_name(node)
|
47
|
+
return if name.nil?
|
48
|
+
|
47
49
|
candidates = @index.prefix_search(name, @nesting)
|
48
50
|
candidates.each do |entries|
|
49
51
|
complete_name = T.must(entries.first).name
|
@@ -62,7 +64,8 @@ module RubyLsp
|
|
62
64
|
def on_constant_path_node_enter(node)
|
63
65
|
return if DependencyDetector.instance.typechecker
|
64
66
|
|
65
|
-
name = node
|
67
|
+
name = constant_name(node)
|
68
|
+
return if name.nil?
|
66
69
|
|
67
70
|
top_level_reference = if name.start_with?("::")
|
68
71
|
name = name.delete_prefix("::")
|
@@ -45,12 +45,18 @@ module RubyLsp
|
|
45
45
|
|
46
46
|
sig { params(node: Prism::ConstantPathNode).void }
|
47
47
|
def on_constant_path_node_enter(node)
|
48
|
-
|
48
|
+
name = constant_name(node)
|
49
|
+
return if name.nil?
|
50
|
+
|
51
|
+
find_in_index(name)
|
49
52
|
end
|
50
53
|
|
51
54
|
sig { params(node: Prism::ConstantReadNode).void }
|
52
55
|
def on_constant_read_node_enter(node)
|
53
|
-
|
56
|
+
name = constant_name(node)
|
57
|
+
return if name.nil?
|
58
|
+
|
59
|
+
find_in_index(name)
|
54
60
|
end
|
55
61
|
|
56
62
|
private
|
@@ -62,20 +68,22 @@ module RubyLsp
|
|
62
68
|
message = node.message
|
63
69
|
return unless message
|
64
70
|
|
65
|
-
|
66
|
-
return unless
|
71
|
+
methods = @index.resolve_method(message, @nesting.join("::"))
|
72
|
+
return unless methods
|
67
73
|
|
68
|
-
|
69
|
-
|
70
|
-
|
74
|
+
methods.each do |target_method|
|
75
|
+
location = target_method.location
|
76
|
+
file_path = target_method.file_path
|
77
|
+
next if @typechecker_enabled && not_in_dependencies?(file_path)
|
71
78
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
+
@response_builder << Interface::Location.new(
|
80
|
+
uri: URI::Generic.from_path(path: file_path).to_s,
|
81
|
+
range: Interface::Range.new(
|
82
|
+
start: Interface::Position.new(line: location.start_line - 1, character: location.start_column),
|
83
|
+
end: Interface::Position.new(line: location.end_line - 1, character: location.end_column),
|
84
|
+
),
|
85
|
+
)
|
86
|
+
end
|
79
87
|
end
|
80
88
|
|
81
89
|
sig { params(node: Prism::CallNode).void }
|
@@ -25,6 +25,14 @@ module RubyLsp
|
|
25
25
|
:on_call_node_enter,
|
26
26
|
:on_constant_path_write_node_enter,
|
27
27
|
:on_constant_write_node_enter,
|
28
|
+
:on_constant_path_or_write_node_enter,
|
29
|
+
:on_constant_path_operator_write_node_enter,
|
30
|
+
:on_constant_path_and_write_node_enter,
|
31
|
+
:on_constant_or_write_node_enter,
|
32
|
+
:on_constant_operator_write_node_enter,
|
33
|
+
:on_constant_and_write_node_enter,
|
34
|
+
:on_constant_target_node_enter,
|
35
|
+
:on_constant_path_target_node_enter,
|
28
36
|
:on_def_node_enter,
|
29
37
|
:on_def_node_leave,
|
30
38
|
:on_module_node_enter,
|
@@ -98,6 +106,86 @@ module RubyLsp
|
|
98
106
|
)
|
99
107
|
end
|
100
108
|
|
109
|
+
sig { params(node: Prism::ConstantPathAndWriteNode).void }
|
110
|
+
def on_constant_path_and_write_node_enter(node)
|
111
|
+
create_document_symbol(
|
112
|
+
name: node.target.location.slice,
|
113
|
+
kind: Constant::SymbolKind::CONSTANT,
|
114
|
+
range_location: node.location,
|
115
|
+
selection_range_location: node.target.location,
|
116
|
+
)
|
117
|
+
end
|
118
|
+
|
119
|
+
sig { params(node: Prism::ConstantPathOrWriteNode).void }
|
120
|
+
def on_constant_path_or_write_node_enter(node)
|
121
|
+
create_document_symbol(
|
122
|
+
name: node.target.location.slice,
|
123
|
+
kind: Constant::SymbolKind::CONSTANT,
|
124
|
+
range_location: node.location,
|
125
|
+
selection_range_location: node.target.location,
|
126
|
+
)
|
127
|
+
end
|
128
|
+
|
129
|
+
sig { params(node: Prism::ConstantPathOperatorWriteNode).void }
|
130
|
+
def on_constant_path_operator_write_node_enter(node)
|
131
|
+
create_document_symbol(
|
132
|
+
name: node.target.location.slice,
|
133
|
+
kind: Constant::SymbolKind::CONSTANT,
|
134
|
+
range_location: node.location,
|
135
|
+
selection_range_location: node.target.location,
|
136
|
+
)
|
137
|
+
end
|
138
|
+
|
139
|
+
sig { params(node: Prism::ConstantOrWriteNode).void }
|
140
|
+
def on_constant_or_write_node_enter(node)
|
141
|
+
create_document_symbol(
|
142
|
+
name: node.name.to_s,
|
143
|
+
kind: Constant::SymbolKind::CONSTANT,
|
144
|
+
range_location: node.location,
|
145
|
+
selection_range_location: node.name_loc,
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
149
|
+
sig { params(node: Prism::ConstantAndWriteNode).void }
|
150
|
+
def on_constant_and_write_node_enter(node)
|
151
|
+
create_document_symbol(
|
152
|
+
name: node.name.to_s,
|
153
|
+
kind: Constant::SymbolKind::CONSTANT,
|
154
|
+
range_location: node.location,
|
155
|
+
selection_range_location: node.name_loc,
|
156
|
+
)
|
157
|
+
end
|
158
|
+
|
159
|
+
sig { params(node: Prism::ConstantOperatorWriteNode).void }
|
160
|
+
def on_constant_operator_write_node_enter(node)
|
161
|
+
create_document_symbol(
|
162
|
+
name: node.name.to_s,
|
163
|
+
kind: Constant::SymbolKind::CONSTANT,
|
164
|
+
range_location: node.location,
|
165
|
+
selection_range_location: node.name_loc,
|
166
|
+
)
|
167
|
+
end
|
168
|
+
|
169
|
+
sig { params(node: Prism::ConstantTargetNode).void }
|
170
|
+
def on_constant_target_node_enter(node)
|
171
|
+
create_document_symbol(
|
172
|
+
name: node.name.to_s,
|
173
|
+
kind: Constant::SymbolKind::CONSTANT,
|
174
|
+
range_location: node.location,
|
175
|
+
selection_range_location: node.location,
|
176
|
+
)
|
177
|
+
end
|
178
|
+
|
179
|
+
sig { params(node: Prism::ConstantPathTargetNode).void }
|
180
|
+
def on_constant_path_target_node_enter(node)
|
181
|
+
create_document_symbol(
|
182
|
+
name: node.slice,
|
183
|
+
kind: Constant::SymbolKind::CONSTANT,
|
184
|
+
range_location: node.location,
|
185
|
+
selection_range_location: node.location,
|
186
|
+
)
|
187
|
+
end
|
188
|
+
|
101
189
|
sig { params(node: Prism::DefNode).void }
|
102
190
|
def on_def_node_leave(node)
|
103
191
|
@response_builder.pop
|
@@ -206,23 +294,34 @@ module RubyLsp
|
|
206
294
|
|
207
295
|
sig { params(node: Prism::CallNode).void }
|
208
296
|
def handle_attr_accessor(node)
|
209
|
-
|
297
|
+
receiver = node.receiver
|
298
|
+
return if receiver && !receiver.is_a?(Prism::SelfNode)
|
210
299
|
|
211
300
|
arguments = node.arguments
|
212
301
|
return unless arguments
|
213
302
|
|
214
303
|
arguments.arguments.each do |argument|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
)
|
304
|
+
if argument.is_a?(Prism::SymbolNode)
|
305
|
+
name = argument.value
|
306
|
+
next unless name
|
307
|
+
|
308
|
+
create_document_symbol(
|
309
|
+
name: name,
|
310
|
+
kind: Constant::SymbolKind::FIELD,
|
311
|
+
range_location: argument.location,
|
312
|
+
selection_range_location: T.must(argument.value_loc),
|
313
|
+
)
|
314
|
+
elsif argument.is_a?(Prism::StringNode)
|
315
|
+
name = argument.content
|
316
|
+
next if name.empty?
|
317
|
+
|
318
|
+
create_document_symbol(
|
319
|
+
name: name,
|
320
|
+
kind: Constant::SymbolKind::FIELD,
|
321
|
+
range_location: argument.location,
|
322
|
+
selection_range_location: argument.content_loc,
|
323
|
+
)
|
324
|
+
end
|
226
325
|
end
|
227
326
|
end
|
228
327
|
|
@@ -55,7 +55,10 @@ module RubyLsp
|
|
55
55
|
def on_constant_read_node_enter(node)
|
56
56
|
return if @typechecker_enabled
|
57
57
|
|
58
|
-
|
58
|
+
name = constant_name(node)
|
59
|
+
return if name.nil?
|
60
|
+
|
61
|
+
generate_hover(name, node.location)
|
59
62
|
end
|
60
63
|
|
61
64
|
sig { params(node: Prism::ConstantWriteNode).void }
|
@@ -69,7 +72,10 @@ module RubyLsp
|
|
69
72
|
def on_constant_path_node_enter(node)
|
70
73
|
return if DependencyDetector.instance.typechecker
|
71
74
|
|
72
|
-
|
75
|
+
name = constant_name(node)
|
76
|
+
return if name.nil?
|
77
|
+
|
78
|
+
generate_hover(name, node.location)
|
73
79
|
end
|
74
80
|
|
75
81
|
sig { params(node: Prism::CallNode).void }
|
@@ -86,10 +92,10 @@ module RubyLsp
|
|
86
92
|
message = node.message
|
87
93
|
return unless message
|
88
94
|
|
89
|
-
|
90
|
-
return unless
|
95
|
+
methods = @index.resolve_method(message, @nesting.join("::"))
|
96
|
+
return unless methods
|
91
97
|
|
92
|
-
categorized_markdown_from_index_entries(message,
|
98
|
+
categorized_markdown_from_index_entries(message, methods).each do |category, content|
|
93
99
|
@response_builder.push(content, category: category)
|
94
100
|
end
|
95
101
|
end
|
@@ -30,7 +30,10 @@ module RubyLsp
|
|
30
30
|
message = node.message
|
31
31
|
return unless message
|
32
32
|
|
33
|
-
|
33
|
+
methods = @index.resolve_method(message, @nesting.join("::"))
|
34
|
+
return unless methods
|
35
|
+
|
36
|
+
target_method = methods.first
|
34
37
|
return unless target_method
|
35
38
|
|
36
39
|
parameters = target_method.parameters
|
@@ -59,7 +62,7 @@ module RubyLsp
|
|
59
62
|
parameters: parameters.map { |param| Interface::ParameterInformation.new(label: param.name) },
|
60
63
|
documentation: Interface::MarkupContent.new(
|
61
64
|
kind: "markdown",
|
62
|
-
value: markdown_from_index_entries("",
|
65
|
+
value: markdown_from_index_entries("", methods),
|
63
66
|
),
|
64
67
|
),
|
65
68
|
],
|
@@ -11,12 +11,12 @@ module RubyLsp
|
|
11
11
|
#
|
12
12
|
# The
|
13
13
|
# [code lens](https://microsoft.github.io/language-server-protocol/specification#textDocument_codeLens)
|
14
|
-
# request informs the editor of runnable commands such as
|
14
|
+
# request informs the editor of runnable commands such as testing and debugging
|
15
15
|
#
|
16
16
|
# # Example
|
17
17
|
#
|
18
18
|
# ```ruby
|
19
|
-
# # Run
|
19
|
+
# # Run | Run in Terminal | Debug
|
20
20
|
# class Test < Minitest::Test
|
21
21
|
# end
|
22
22
|
# ```
|
@@ -132,6 +132,21 @@ module RubyLsp
|
|
132
132
|
#{categorized_markdown[:documentation]}
|
133
133
|
MARKDOWN
|
134
134
|
end
|
135
|
+
|
136
|
+
sig do
|
137
|
+
params(
|
138
|
+
node: T.any(
|
139
|
+
Prism::ConstantPathNode,
|
140
|
+
Prism::ConstantReadNode,
|
141
|
+
Prism::ConstantPathTargetNode,
|
142
|
+
),
|
143
|
+
).returns(T.nilable(String))
|
144
|
+
end
|
145
|
+
def constant_name(node)
|
146
|
+
node.full_name
|
147
|
+
rescue Prism::ConstantPathNode::DynamicPartsInConstantPathError
|
148
|
+
nil
|
149
|
+
end
|
135
150
|
end
|
136
151
|
end
|
137
152
|
end
|
@@ -57,15 +57,18 @@ module RubyLsp
|
|
57
57
|
def setup!
|
58
58
|
raise BundleNotLocked if @gemfile&.exist? && !@lockfile&.exist?
|
59
59
|
|
60
|
-
# Do not
|
61
|
-
if @dependencies["ruby-lsp"] &&
|
60
|
+
# Do not set up a custom bundle if LSP dependencies are already in the Gemfile
|
61
|
+
if @dependencies["ruby-lsp"] &&
|
62
|
+
@dependencies["debug"] &&
|
63
|
+
(@dependencies["rails"] ? @dependencies["ruby-lsp-rails"] : true)
|
62
64
|
$stderr.puts(
|
63
|
-
"Ruby LSP> Skipping custom bundle setup since
|
65
|
+
"Ruby LSP> Skipping custom bundle setup since LSP dependencies are already in #{@gemfile}",
|
64
66
|
)
|
65
67
|
|
66
|
-
# If the user decided to add
|
67
|
-
# then we need to remove the `.ruby-lsp` folder, otherwise we will run `bundle
|
68
|
-
# try to execute the Ruby LSP using the custom bundle, which will fail since the
|
68
|
+
# If the user decided to add `ruby-lsp` and `debug` (and potentially `ruby-lsp-rails`) to their Gemfile after
|
69
|
+
# having already run the Ruby LSP, then we need to remove the `.ruby-lsp` folder, otherwise we will run `bundle
|
70
|
+
# install` for the top level and try to execute the Ruby LSP using the custom bundle, which will fail since the
|
71
|
+
# gems are not installed there
|
69
72
|
@custom_dir.rmtree if @custom_dir.exist?
|
70
73
|
return run_bundle_install
|
71
74
|
end
|
@@ -143,6 +146,10 @@ module RubyLsp
|
|
143
146
|
parts << 'gem "debug", require: false, group: :development, platforms: :mri'
|
144
147
|
end
|
145
148
|
|
149
|
+
if @dependencies["rails"] && !@dependencies["ruby-lsp-rails"]
|
150
|
+
parts << 'gem "ruby-lsp-rails", require: false, group: :development'
|
151
|
+
end
|
152
|
+
|
146
153
|
content = parts.join("\n")
|
147
154
|
@custom_gemfile.write(content) unless @custom_gemfile.exist? && @custom_gemfile.read == content
|
148
155
|
end
|
@@ -183,22 +190,24 @@ module RubyLsp
|
|
183
190
|
local_config_path = File.join(Dir.pwd, ".bundle")
|
184
191
|
env["BUNDLE_APP_CONFIG"] = local_config_path if Dir.exist?(local_config_path)
|
185
192
|
|
186
|
-
# If
|
187
|
-
# produce undesired source control changes. If the custom bundle was just created
|
188
|
-
# weren't a part of the Gemfile, then we need to run `bundle
|
189
|
-
# Gemfile.lock with them included or else Bundler will complain that
|
190
|
-
# custom `.ruby-lsp/Gemfile.lock` already exists and includes
|
193
|
+
# If `ruby-lsp` and `debug` (and potentially `ruby-lsp-rails`) are already in the Gemfile, then we shouldn't try
|
194
|
+
# to upgrade them or else we'll produce undesired source control changes. If the custom bundle was just created
|
195
|
+
# and any of `ruby-lsp`, `ruby-lsp-rails` or `debug` weren't a part of the Gemfile, then we need to run `bundle
|
196
|
+
# install` for the first time to generate the Gemfile.lock with them included or else Bundler will complain that
|
197
|
+
# they're missing. We can only update if the custom `.ruby-lsp/Gemfile.lock` already exists and includes all gems
|
191
198
|
|
192
199
|
# When not updating, we run `(bundle check || bundle install)`
|
193
200
|
# When updating, we run `((bundle check && bundle update ruby-lsp debug) || bundle install)`
|
194
201
|
command = +"(bundle check"
|
195
202
|
|
196
203
|
if should_bundle_update?
|
197
|
-
# If ruby-lsp or debug are not in the Gemfile, try to update them to the latest
|
204
|
+
# If any of `ruby-lsp`, `ruby-lsp-rails` or `debug` are not in the Gemfile, try to update them to the latest
|
205
|
+
# version
|
198
206
|
command.prepend("(")
|
199
207
|
command << " && bundle update "
|
200
208
|
command << "ruby-lsp " unless @dependencies["ruby-lsp"]
|
201
209
|
command << "debug " unless @dependencies["debug"]
|
210
|
+
command << "ruby-lsp-rails " if @dependencies["rails"] && !@dependencies["ruby-lsp-rails"]
|
202
211
|
command << "--pre" if @experimental
|
203
212
|
command.delete_suffix!(" ")
|
204
213
|
command << ")"
|
@@ -221,13 +230,20 @@ module RubyLsp
|
|
221
230
|
|
222
231
|
sig { returns(T::Boolean) }
|
223
232
|
def should_bundle_update?
|
224
|
-
# If
|
225
|
-
# version control changes
|
226
|
-
|
233
|
+
# If `ruby-lsp`, `ruby-lsp-rails` and `debug` are in the Gemfile, then we shouldn't try to upgrade them or else it
|
234
|
+
# will produce version control changes
|
235
|
+
if @dependencies["rails"]
|
236
|
+
return false if @dependencies.values_at("ruby-lsp", "ruby-lsp-rails", "debug").all?
|
237
|
+
|
238
|
+
# If the custom lockfile doesn't include `ruby-lsp`, `ruby-lsp-rails` or `debug`, we need to run bundle install
|
239
|
+
# before updating
|
240
|
+
return false if custom_bundle_dependencies.values_at("ruby-lsp", "debug", "ruby-lsp-rails").any?(&:nil?)
|
241
|
+
else
|
242
|
+
return false if @dependencies.values_at("ruby-lsp", "debug").all?
|
227
243
|
|
228
|
-
|
229
|
-
|
230
|
-
|
244
|
+
# If the custom lockfile doesn't include `ruby-lsp` or `debug`, we need to run bundle install before updating
|
245
|
+
return false if custom_bundle_dependencies.values_at("ruby-lsp", "debug").any?(&:nil?)
|
246
|
+
end
|
231
247
|
|
232
248
|
# If the last updated file doesn't exist or was updated more than 4 hours ago, we should update
|
233
249
|
!@last_updated_path.exist? || Time.parse(@last_updated_path.read) < (Time.now - FOUR_HOURS)
|
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.14.
|
4
|
+
version: 0.14.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: language_server-protocol
|
@@ -30,20 +30,20 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.22.0
|
34
34
|
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: '0.
|
36
|
+
version: '0.25'
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.
|
43
|
+
version: 0.22.0
|
44
44
|
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '0.
|
46
|
+
version: '0.25'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: sorbet-runtime
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|