ruby-lsp 0.17.4 → 0.17.6
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 +4 -0
- data/VERSION +1 -1
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +40 -39
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +120 -25
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +266 -68
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +115 -34
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +33 -3
- data/lib/ruby_indexer/test/index_test.rb +248 -7
- data/lib/ruby_indexer/test/method_test.rb +58 -25
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +259 -0
- data/lib/ruby_indexer/test/test_case.rb +1 -5
- data/lib/ruby_lsp/addon.rb +13 -1
- data/lib/ruby_lsp/document.rb +13 -15
- data/lib/ruby_lsp/erb_document.rb +125 -0
- data/lib/ruby_lsp/global_state.rb +4 -1
- data/lib/ruby_lsp/internal.rb +2 -0
- data/lib/ruby_lsp/listeners/completion.rb +26 -30
- data/lib/ruby_lsp/listeners/definition.rb +24 -17
- data/lib/ruby_lsp/requests/code_action_resolve.rb +2 -2
- data/lib/ruby_lsp/requests/completion.rb +1 -1
- data/lib/ruby_lsp/requests/completion_resolve.rb +2 -7
- data/lib/ruby_lsp/requests/definition.rb +4 -3
- data/lib/ruby_lsp/requests/formatting.rb +2 -0
- data/lib/ruby_lsp/requests/selection_ranges.rb +1 -1
- data/lib/ruby_lsp/requests/show_syntax_tree.rb +3 -2
- data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +2 -6
- data/lib/ruby_lsp/ruby_document.rb +10 -0
- data/lib/ruby_lsp/server.rb +41 -11
- data/lib/ruby_lsp/store.rb +23 -8
- data/lib/ruby_lsp/test_helper.rb +2 -0
- metadata +7 -6
@@ -11,19 +11,24 @@ module RubyLsp
|
|
11
11
|
|
12
12
|
sig do
|
13
13
|
params(
|
14
|
-
response_builder: ResponseBuilders::CollectionResponseBuilder[
|
14
|
+
response_builder: ResponseBuilders::CollectionResponseBuilder[T.any(
|
15
|
+
Interface::Location,
|
16
|
+
Interface::LocationLink,
|
17
|
+
)],
|
15
18
|
global_state: GlobalState,
|
19
|
+
language_id: Document::LanguageId,
|
16
20
|
uri: URI::Generic,
|
17
21
|
node_context: NodeContext,
|
18
22
|
dispatcher: Prism::Dispatcher,
|
19
23
|
typechecker_enabled: T::Boolean,
|
20
24
|
).void
|
21
25
|
end
|
22
|
-
def initialize(response_builder, global_state, uri, node_context, dispatcher, typechecker_enabled) # rubocop:disable Metrics/ParameterLists
|
26
|
+
def initialize(response_builder, global_state, language_id, uri, node_context, dispatcher, typechecker_enabled) # rubocop:disable Metrics/ParameterLists
|
23
27
|
@response_builder = response_builder
|
24
28
|
@global_state = global_state
|
25
29
|
@index = T.let(global_state.index, RubyIndexer::Index)
|
26
30
|
@type_inferrer = T.let(global_state.type_inferrer, TypeInferrer)
|
31
|
+
@language_id = language_id
|
27
32
|
@uri = uri
|
28
33
|
@node_context = node_context
|
29
34
|
@typechecker_enabled = typechecker_enabled
|
@@ -49,7 +54,15 @@ module RubyLsp
|
|
49
54
|
message = node.message
|
50
55
|
return unless message
|
51
56
|
|
52
|
-
|
57
|
+
inferrer_receiver_type = @type_inferrer.infer_receiver_type(@node_context)
|
58
|
+
|
59
|
+
# Until we can properly infer the receiver type in erb files (maybe with ruby-lsp-rails),
|
60
|
+
# treating method calls' type as `nil` will allow users to get some completion support first
|
61
|
+
if @language_id == Document::LanguageId::ERB && inferrer_receiver_type == "Object"
|
62
|
+
inferrer_receiver_type = nil
|
63
|
+
end
|
64
|
+
|
65
|
+
handle_method_definition(message, inferrer_receiver_type)
|
53
66
|
end
|
54
67
|
|
55
68
|
sig { params(node: Prism::StringNode).void }
|
@@ -158,16 +171,13 @@ module RubyLsp
|
|
158
171
|
return unless methods
|
159
172
|
|
160
173
|
methods.each do |target_method|
|
161
|
-
location = target_method.location
|
162
174
|
file_path = target_method.file_path
|
163
175
|
next if @typechecker_enabled && not_in_dependencies?(file_path)
|
164
176
|
|
165
|
-
@response_builder << Interface::
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
end: Interface::Position.new(line: location.end_line - 1, character: location.end_column),
|
170
|
-
),
|
177
|
+
@response_builder << Interface::LocationLink.new(
|
178
|
+
target_uri: URI::Generic.from_path(path: file_path).to_s,
|
179
|
+
target_range: range_from_location(target_method.location),
|
180
|
+
target_selection_range: range_from_location(target_method.name_location),
|
171
181
|
)
|
172
182
|
end
|
173
183
|
end
|
@@ -218,19 +228,16 @@ module RubyLsp
|
|
218
228
|
return if first_entry.private? && first_entry.name != "#{@node_context.fully_qualified_name}::#{value}"
|
219
229
|
|
220
230
|
entries.each do |entry|
|
221
|
-
location = entry.location
|
222
231
|
# If the project has Sorbet, then we only want to handle go to definition for constants defined in gems, as an
|
223
232
|
# additional behavior on top of jumping to RBIs. Sorbet can already handle go to definition for all constants
|
224
233
|
# in the project, even if the files are typed false
|
225
234
|
file_path = entry.file_path
|
226
235
|
next if @typechecker_enabled && not_in_dependencies?(file_path)
|
227
236
|
|
228
|
-
@response_builder << Interface::
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
end: Interface::Position.new(line: location.end_line - 1, character: location.end_column),
|
233
|
-
),
|
237
|
+
@response_builder << Interface::LocationLink.new(
|
238
|
+
target_uri: URI::Generic.from_path(path: file_path).to_s,
|
239
|
+
target_range: range_from_location(entry.location),
|
240
|
+
target_selection_range: range_from_location(entry.name_location),
|
234
241
|
)
|
235
242
|
end
|
236
243
|
end
|
@@ -69,7 +69,7 @@ module RubyLsp
|
|
69
69
|
|
70
70
|
# Find the closest statements node, so that we place the refactor in a valid position
|
71
71
|
node_context = @document
|
72
|
-
.locate(@document.
|
72
|
+
.locate(@document.parse_result.value, start_index, node_types: [Prism::StatementsNode, Prism::BlockNode])
|
73
73
|
|
74
74
|
closest_statements = node_context.node
|
75
75
|
parent_statements = node_context.parent
|
@@ -164,7 +164,7 @@ module RubyLsp
|
|
164
164
|
extracted_source = T.must(@document.source[start_index...end_index])
|
165
165
|
|
166
166
|
# Find the closest method declaration node, so that we place the refactor in a valid position
|
167
|
-
node_context = @document.locate(@document.
|
167
|
+
node_context = @document.locate(@document.parse_result.value, start_index, node_types: [Prism::DefNode])
|
168
168
|
closest_def = T.cast(node_context.node, Prism::DefNode)
|
169
169
|
return Error::InvalidTargetRange if closest_def.nil?
|
170
170
|
|
@@ -61,7 +61,7 @@ module RubyLsp
|
|
61
61
|
# back by 1, so that we find the right node
|
62
62
|
char_position = document.create_scanner.find_char_position(params[:position]) - 1
|
63
63
|
node_context = document.locate(
|
64
|
-
document.
|
64
|
+
document.parse_result.value,
|
65
65
|
char_position,
|
66
66
|
node_types: [
|
67
67
|
Prism::CallNode,
|
@@ -40,7 +40,8 @@ module RubyLsp
|
|
40
40
|
def perform
|
41
41
|
# Based on the spec https://microsoft.github.io/language-server-protocol/specification#textDocument_completion,
|
42
42
|
# a completion resolve request must always return the original completion item without modifying ANY fields
|
43
|
-
# other than
|
43
|
+
# other than detail and documentation (NOT labelDetails). If we modify anything, the completion behaviour might
|
44
|
+
# be broken.
|
44
45
|
#
|
45
46
|
# For example, forgetting to return the `insertText` included in the original item will make the editor use the
|
46
47
|
# `label` for the text edit instead
|
@@ -59,15 +60,9 @@ module RubyLsp
|
|
59
60
|
first_entry = T.must(entries.first)
|
60
61
|
|
61
62
|
if first_entry.is_a?(RubyIndexer::Entry::Member)
|
62
|
-
detail = first_entry.decorated_parameters
|
63
63
|
label = "#{label}#{first_entry.decorated_parameters}"
|
64
64
|
end
|
65
65
|
|
66
|
-
@item[:labelDetails] = Interface::CompletionItemLabelDetails.new(
|
67
|
-
description: entries.take(MAX_DOCUMENTATION_ENTRIES).map(&:file_name).join(","),
|
68
|
-
detail: detail,
|
69
|
-
)
|
70
|
-
|
71
66
|
@item[:documentation] = Interface::MarkupContent.new(
|
72
67
|
kind: "markdown",
|
73
68
|
value: markdown_from_index_entries(label, entries, MAX_DOCUMENTATION_ENTRIES),
|
@@ -42,8 +42,8 @@ module RubyLsp
|
|
42
42
|
def initialize(document, global_state, position, dispatcher, typechecker_enabled)
|
43
43
|
super()
|
44
44
|
@response_builder = T.let(
|
45
|
-
ResponseBuilders::CollectionResponseBuilder[Interface::Location].new,
|
46
|
-
ResponseBuilders::CollectionResponseBuilder[Interface::Location],
|
45
|
+
ResponseBuilders::CollectionResponseBuilder[T.any(Interface::Location, Interface::LocationLink)].new,
|
46
|
+
ResponseBuilders::CollectionResponseBuilder[T.any(Interface::Location, Interface::LocationLink)],
|
47
47
|
)
|
48
48
|
@dispatcher = dispatcher
|
49
49
|
|
@@ -90,6 +90,7 @@ module RubyLsp
|
|
90
90
|
Listeners::Definition.new(
|
91
91
|
@response_builder,
|
92
92
|
global_state,
|
93
|
+
document.language_id,
|
93
94
|
document.uri,
|
94
95
|
node_context,
|
95
96
|
dispatcher,
|
@@ -104,7 +105,7 @@ module RubyLsp
|
|
104
105
|
@target = T.let(target, T.nilable(Prism::Node))
|
105
106
|
end
|
106
107
|
|
107
|
-
sig { override.returns(T::Array[Interface::Location]) }
|
108
|
+
sig { override.returns(T::Array[T.any(Interface::Location, Interface::LocationLink)]) }
|
108
109
|
def perform
|
109
110
|
@dispatcher.dispatch_once(@target) if @target
|
110
111
|
@response_builder.response
|
@@ -34,7 +34,7 @@ module RubyLsp
|
|
34
34
|
sig { override.returns(T.all(T::Array[Support::SelectionRange], Object)) }
|
35
35
|
def perform
|
36
36
|
# [node, parent]
|
37
|
-
queue = [[@document.
|
37
|
+
queue = [[@document.parse_result.value, nil]]
|
38
38
|
|
39
39
|
until queue.empty?
|
40
40
|
node, parent = queue.shift
|
@@ -25,6 +25,7 @@ module RubyLsp
|
|
25
25
|
super()
|
26
26
|
@document = document
|
27
27
|
@range = range
|
28
|
+
@tree = T.let(document.parse_result.value, Prism::ProgramNode)
|
28
29
|
end
|
29
30
|
|
30
31
|
sig { override.returns(String) }
|
@@ -32,7 +33,7 @@ module RubyLsp
|
|
32
33
|
return ast_for_range if @range
|
33
34
|
|
34
35
|
output_string = +""
|
35
|
-
PP.pp(@
|
36
|
+
PP.pp(@tree, output_string)
|
36
37
|
output_string
|
37
38
|
end
|
38
39
|
|
@@ -46,7 +47,7 @@ module RubyLsp
|
|
46
47
|
start_char = scanner.find_char_position(range[:start])
|
47
48
|
end_char = scanner.find_char_position(range[:end])
|
48
49
|
|
49
|
-
queue = @
|
50
|
+
queue = @tree.statements.body.dup
|
50
51
|
found_nodes = []
|
51
52
|
|
52
53
|
until queue.empty?
|
@@ -54,8 +54,6 @@ module RubyLsp
|
|
54
54
|
end
|
55
55
|
|
56
56
|
entry.mixin_operations.each do |mixin_operation|
|
57
|
-
next if mixin_operation.is_a?(RubyIndexer::Entry::Extend)
|
58
|
-
|
59
57
|
mixin_name = mixin_operation.module_name
|
60
58
|
resolved_mixin_entries = @index.resolve(mixin_name, entry.nesting)
|
61
59
|
next unless resolved_mixin_entries
|
@@ -75,14 +73,12 @@ module RubyLsp
|
|
75
73
|
|
76
74
|
sig { params(entry: RubyIndexer::Entry).returns(Interface::TypeHierarchyItem) }
|
77
75
|
def hierarchy_item(entry)
|
78
|
-
range = range_from_location(entry.location)
|
79
|
-
|
80
76
|
Interface::TypeHierarchyItem.new(
|
81
77
|
name: entry.name,
|
82
78
|
kind: kind_for_entry(entry),
|
83
79
|
uri: URI::Generic.from_path(path: entry.file_path).to_s,
|
84
|
-
range:
|
85
|
-
selection_range:
|
80
|
+
range: range_from_location(entry.location),
|
81
|
+
selection_range: range_from_location(entry.name_location),
|
86
82
|
detail: entry.file_name,
|
87
83
|
)
|
88
84
|
end
|
@@ -10,5 +10,15 @@ module RubyLsp
|
|
10
10
|
@needs_parsing = false
|
11
11
|
@parse_result = Prism.parse(@source)
|
12
12
|
end
|
13
|
+
|
14
|
+
sig { override.returns(T::Boolean) }
|
15
|
+
def syntax_error?
|
16
|
+
@parse_result.failure?
|
17
|
+
end
|
18
|
+
|
19
|
+
sig { override.returns(LanguageId) }
|
20
|
+
def language_id
|
21
|
+
LanguageId::Ruby
|
22
|
+
end
|
13
23
|
end
|
14
24
|
end
|
data/lib/ruby_lsp/server.rb
CHANGED
@@ -98,7 +98,16 @@ module RubyLsp
|
|
98
98
|
rescue StandardError, LoadError => e
|
99
99
|
# If an error occurred in a request, we have to return an error response or else the editor will hang
|
100
100
|
if message[:id]
|
101
|
-
send_message(Error.new(
|
101
|
+
send_message(Error.new(
|
102
|
+
id: message[:id],
|
103
|
+
code: Constant::ErrorCodes::INTERNAL_ERROR,
|
104
|
+
message: e.full_message,
|
105
|
+
data: {
|
106
|
+
errorClass: e.class.name,
|
107
|
+
errorMessage: e.message,
|
108
|
+
backtrace: e.backtrace&.join("\n"),
|
109
|
+
},
|
110
|
+
))
|
102
111
|
end
|
103
112
|
|
104
113
|
$stderr.puts("Error processing #{message[:method]}: #{e.full_message}")
|
@@ -137,7 +146,6 @@ module RubyLsp
|
|
137
146
|
progress = options.dig(:capabilities, :window, :workDoneProgress)
|
138
147
|
@store.supports_progress = progress.nil? ? true : progress
|
139
148
|
configured_features = options.dig(:initializationOptions, :enabledFeatures)
|
140
|
-
@store.experimental_features = options.dig(:initializationOptions, :experimentalFeaturesEnabled) || false
|
141
149
|
|
142
150
|
configured_hints = options.dig(:initializationOptions, :featuresConfiguration, :inlayHint)
|
143
151
|
T.must(@store.features_configuration.dig(:inlayHint)).configuration.merge!(configured_hints) if configured_hints
|
@@ -280,11 +288,18 @@ module RubyLsp
|
|
280
288
|
def text_document_did_open(message)
|
281
289
|
@mutex.synchronize do
|
282
290
|
text_document = message.dig(:params, :textDocument)
|
291
|
+
language_id = case text_document[:languageId]
|
292
|
+
when "erb"
|
293
|
+
Document::LanguageId::ERB
|
294
|
+
else
|
295
|
+
Document::LanguageId::Ruby
|
296
|
+
end
|
283
297
|
@store.set(
|
284
298
|
uri: text_document[:uri],
|
285
299
|
source: text_document[:text],
|
286
300
|
version: text_document[:version],
|
287
301
|
encoding: @global_state.encoding,
|
302
|
+
language_id: language_id,
|
288
303
|
)
|
289
304
|
end
|
290
305
|
end
|
@@ -348,15 +363,17 @@ module RubyLsp
|
|
348
363
|
return
|
349
364
|
end
|
350
365
|
|
366
|
+
parse_result = document.parse_result
|
367
|
+
|
351
368
|
# Run requests for the document
|
352
369
|
dispatcher = Prism::Dispatcher.new
|
353
|
-
folding_range = Requests::FoldingRanges.new(
|
370
|
+
folding_range = Requests::FoldingRanges.new(parse_result.comments, dispatcher)
|
354
371
|
document_symbol = Requests::DocumentSymbol.new(uri, dispatcher)
|
355
|
-
document_link = Requests::DocumentLink.new(uri,
|
372
|
+
document_link = Requests::DocumentLink.new(uri, parse_result.comments, dispatcher)
|
356
373
|
code_lens = Requests::CodeLens.new(@global_state, uri, dispatcher)
|
357
374
|
|
358
375
|
semantic_highlighting = Requests::SemanticHighlighting.new(@global_state, dispatcher)
|
359
|
-
dispatcher.dispatch(
|
376
|
+
dispatcher.dispatch(parse_result.value)
|
360
377
|
|
361
378
|
# Store all responses retrieve in this round of visits in the cache and then return the response for the request
|
362
379
|
# we actually received
|
@@ -388,7 +405,7 @@ module RubyLsp
|
|
388
405
|
|
389
406
|
dispatcher = Prism::Dispatcher.new
|
390
407
|
request = Requests::SemanticHighlighting.new(@global_state, dispatcher, range: start_line..end_line)
|
391
|
-
dispatcher.visit(document.
|
408
|
+
dispatcher.visit(document.parse_result.value)
|
392
409
|
|
393
410
|
response = request.perform
|
394
411
|
send_message(Result.new(id: message[:id], response: response))
|
@@ -411,7 +428,11 @@ module RubyLsp
|
|
411
428
|
return
|
412
429
|
end
|
413
430
|
|
414
|
-
|
431
|
+
document = @store.get(uri)
|
432
|
+
|
433
|
+
return send_empty_response(message[:id]) if document.is_a?(ERBDocument)
|
434
|
+
|
435
|
+
response = Requests::Formatting.new(@global_state, document).perform
|
415
436
|
send_message(Result.new(id: message[:id], response: response))
|
416
437
|
rescue Requests::Request::InvalidFormatter => error
|
417
438
|
send_message(Notification.window_show_error("Configuration error: #{error.message}"))
|
@@ -427,19 +448,22 @@ module RubyLsp
|
|
427
448
|
dispatcher = Prism::Dispatcher.new
|
428
449
|
document = @store.get(params.dig(:textDocument, :uri))
|
429
450
|
request = Requests::DocumentHighlight.new(document, params[:position], dispatcher)
|
430
|
-
dispatcher.dispatch(document.
|
451
|
+
dispatcher.dispatch(document.parse_result.value)
|
431
452
|
send_message(Result.new(id: message[:id], response: request.perform))
|
432
453
|
end
|
433
454
|
|
434
455
|
sig { params(message: T::Hash[Symbol, T.untyped]).void }
|
435
456
|
def text_document_on_type_formatting(message)
|
436
457
|
params = message[:params]
|
458
|
+
document = @store.get(params.dig(:textDocument, :uri))
|
459
|
+
|
460
|
+
return send_empty_response(message[:id]) if document.is_a?(ERBDocument)
|
437
461
|
|
438
462
|
send_message(
|
439
463
|
Result.new(
|
440
464
|
id: message[:id],
|
441
465
|
response: Requests::OnTypeFormatting.new(
|
442
|
-
|
466
|
+
document,
|
443
467
|
params[:position],
|
444
468
|
params[:ch],
|
445
469
|
@store.client_name,
|
@@ -480,7 +504,7 @@ module RubyLsp
|
|
480
504
|
dispatcher = Prism::Dispatcher.new
|
481
505
|
document = @store.get(params.dig(:textDocument, :uri))
|
482
506
|
request = Requests::InlayHints.new(document, params[:range], hints_configurations, dispatcher)
|
483
|
-
dispatcher.visit(document.
|
507
|
+
dispatcher.visit(document.parse_result.value)
|
484
508
|
send_message(Result.new(id: message[:id], response: request.perform))
|
485
509
|
end
|
486
510
|
|
@@ -489,6 +513,8 @@ module RubyLsp
|
|
489
513
|
params = message[:params]
|
490
514
|
document = @store.get(params.dig(:textDocument, :uri))
|
491
515
|
|
516
|
+
return send_empty_response(message[:id]) if document.is_a?(ERBDocument)
|
517
|
+
|
492
518
|
send_message(
|
493
519
|
Result.new(
|
494
520
|
id: message[:id],
|
@@ -542,7 +568,11 @@ module RubyLsp
|
|
542
568
|
return
|
543
569
|
end
|
544
570
|
|
545
|
-
|
571
|
+
document = @store.get(uri)
|
572
|
+
|
573
|
+
return send_empty_response(message[:id]) if document.is_a?(ERBDocument)
|
574
|
+
|
575
|
+
response = document.cache_fetch("textDocument/diagnostic") do |document|
|
546
576
|
Requests::Diagnostics.new(@global_state, document).perform
|
547
577
|
end
|
548
578
|
|
data/lib/ruby_lsp/store.rb
CHANGED
@@ -8,9 +8,6 @@ module RubyLsp
|
|
8
8
|
sig { returns(T::Boolean) }
|
9
9
|
attr_accessor :supports_progress
|
10
10
|
|
11
|
-
sig { returns(T::Boolean) }
|
12
|
-
attr_accessor :experimental_features
|
13
|
-
|
14
11
|
sig { returns(T::Hash[Symbol, RequestConfig]) }
|
15
12
|
attr_accessor :features_configuration
|
16
13
|
|
@@ -21,7 +18,6 @@ module RubyLsp
|
|
21
18
|
def initialize
|
22
19
|
@state = T.let({}, T::Hash[String, Document])
|
23
20
|
@supports_progress = T.let(true, T::Boolean)
|
24
|
-
@experimental_features = T.let(false, T::Boolean)
|
25
21
|
@features_configuration = T.let(
|
26
22
|
{
|
27
23
|
inlayHint: RequestConfig.new({
|
@@ -41,13 +37,32 @@ module RubyLsp
|
|
41
37
|
return document unless document.nil?
|
42
38
|
|
43
39
|
path = T.must(uri.to_standardized_path)
|
44
|
-
|
40
|
+
ext = File.extname(path)
|
41
|
+
language_id = if ext == ".erb" || ext == ".rhtml"
|
42
|
+
Document::LanguageId::ERB
|
43
|
+
else
|
44
|
+
Document::LanguageId::Ruby
|
45
|
+
end
|
46
|
+
set(uri: uri, source: File.binread(path), version: 0, language_id: language_id)
|
45
47
|
T.must(@state[uri.to_s])
|
46
48
|
end
|
47
49
|
|
48
|
-
sig
|
49
|
-
|
50
|
-
|
50
|
+
sig do
|
51
|
+
params(
|
52
|
+
uri: URI::Generic,
|
53
|
+
source: String,
|
54
|
+
version: Integer,
|
55
|
+
language_id: Document::LanguageId,
|
56
|
+
encoding: Encoding,
|
57
|
+
).void
|
58
|
+
end
|
59
|
+
def set(uri:, source:, version:, language_id:, encoding: Encoding::UTF_8)
|
60
|
+
document = case language_id
|
61
|
+
when Document::LanguageId::ERB
|
62
|
+
ERBDocument.new(source: source, version: version, uri: uri, encoding: encoding)
|
63
|
+
else
|
64
|
+
RubyDocument.new(source: source, version: version, uri: uri, encoding: encoding)
|
65
|
+
end
|
51
66
|
@state[uri.to_s] = document
|
52
67
|
end
|
53
68
|
|
data/lib/ruby_lsp/test_helper.rb
CHANGED
@@ -22,6 +22,7 @@ module RubyLsp
|
|
22
22
|
server = RubyLsp::Server.new(test_mode: true)
|
23
23
|
server.global_state.stubs(:has_type_checker).returns(false) if stub_no_typechecker
|
24
24
|
server.global_state.apply_options({})
|
25
|
+
language_id = uri.to_s.end_with?(".erb") ? "erb" : "ruby"
|
25
26
|
|
26
27
|
if source
|
27
28
|
server.process_message({
|
@@ -31,6 +32,7 @@ module RubyLsp
|
|
31
32
|
uri: uri,
|
32
33
|
text: source,
|
33
34
|
version: 1,
|
35
|
+
languageId: language_id,
|
34
36
|
},
|
35
37
|
},
|
36
38
|
})
|
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.17.
|
4
|
+
version: 0.17.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: language_server-protocol
|
@@ -120,6 +120,7 @@ files:
|
|
120
120
|
- lib/ruby_lsp/base_server.rb
|
121
121
|
- lib/ruby_lsp/check_docs.rb
|
122
122
|
- lib/ruby_lsp/document.rb
|
123
|
+
- lib/ruby_lsp/erb_document.rb
|
123
124
|
- lib/ruby_lsp/global_state.rb
|
124
125
|
- lib/ruby_lsp/internal.rb
|
125
126
|
- lib/ruby_lsp/listeners/code_lens.rb
|
@@ -190,7 +191,7 @@ licenses:
|
|
190
191
|
metadata:
|
191
192
|
allowed_push_host: https://rubygems.org
|
192
193
|
documentation_uri: https://shopify.github.io/ruby-lsp/
|
193
|
-
post_install_message:
|
194
|
+
post_install_message:
|
194
195
|
rdoc_options: []
|
195
196
|
require_paths:
|
196
197
|
- lib
|
@@ -205,8 +206,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
205
206
|
- !ruby/object:Gem::Version
|
206
207
|
version: '0'
|
207
208
|
requirements: []
|
208
|
-
rubygems_version: 3.5.
|
209
|
-
signing_key:
|
209
|
+
rubygems_version: 3.5.14
|
210
|
+
signing_key:
|
210
211
|
specification_version: 4
|
211
212
|
summary: An opinionated language server for Ruby
|
212
213
|
test_files: []
|