ruby-lsp 0.23.15 → 0.26.9
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/VERSION +1 -1
- data/exe/ruby-lsp +17 -14
- data/exe/ruby-lsp-check +0 -4
- data/exe/ruby-lsp-launcher +41 -14
- data/exe/ruby-lsp-test-exec +6 -0
- data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +0 -1
- data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +0 -1
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +4 -3
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +42 -20
- data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +1 -7
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +49 -62
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +84 -74
- data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +6 -9
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +9 -14
- data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +12 -8
- data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +4 -4
- data/lib/ruby_lsp/addon.rb +44 -15
- data/lib/ruby_lsp/base_server.rb +56 -37
- data/lib/ruby_lsp/client_capabilities.rb +6 -1
- data/lib/ruby_lsp/document.rb +174 -62
- data/lib/ruby_lsp/erb_document.rb +10 -8
- data/lib/ruby_lsp/global_state.rb +86 -33
- data/lib/ruby_lsp/internal.rb +6 -3
- data/lib/ruby_lsp/listeners/completion.rb +22 -11
- data/lib/ruby_lsp/listeners/definition.rb +41 -21
- data/lib/ruby_lsp/listeners/document_highlight.rb +26 -1
- data/lib/ruby_lsp/listeners/document_link.rb +64 -28
- data/lib/ruby_lsp/listeners/hover.rb +27 -16
- data/lib/ruby_lsp/listeners/inlay_hints.rb +5 -3
- data/lib/ruby_lsp/listeners/semantic_highlighting.rb +2 -2
- data/lib/ruby_lsp/listeners/signature_help.rb +2 -2
- data/lib/ruby_lsp/listeners/spec_style.rb +155 -79
- data/lib/ruby_lsp/listeners/test_discovery.rb +39 -21
- data/lib/ruby_lsp/listeners/test_style.rb +75 -35
- data/lib/ruby_lsp/rbs_document.rb +3 -6
- data/lib/ruby_lsp/requests/code_action_resolve.rb +83 -58
- data/lib/ruby_lsp/requests/code_actions.rb +20 -5
- data/lib/ruby_lsp/requests/code_lens.rb +27 -6
- data/lib/ruby_lsp/requests/completion.rb +3 -3
- data/lib/ruby_lsp/requests/completion_resolve.rb +8 -6
- data/lib/ruby_lsp/requests/definition.rb +4 -7
- data/lib/ruby_lsp/requests/discover_tests.rb +2 -2
- data/lib/ruby_lsp/requests/document_highlight.rb +2 -2
- data/lib/ruby_lsp/requests/document_link.rb +1 -1
- data/lib/ruby_lsp/requests/folding_ranges.rb +1 -1
- data/lib/ruby_lsp/requests/go_to_relevant_file.rb +64 -12
- data/lib/ruby_lsp/requests/hover.rb +3 -6
- data/lib/ruby_lsp/requests/inlay_hints.rb +4 -4
- data/lib/ruby_lsp/requests/on_type_formatting.rb +1 -1
- data/lib/ruby_lsp/requests/prepare_rename.rb +1 -1
- data/lib/ruby_lsp/requests/references.rb +10 -21
- data/lib/ruby_lsp/requests/rename.rb +9 -10
- data/lib/ruby_lsp/requests/request.rb +8 -8
- data/lib/ruby_lsp/requests/selection_ranges.rb +2 -2
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +1 -1
- data/lib/ruby_lsp/requests/show_syntax_tree.rb +2 -2
- data/lib/ruby_lsp/requests/signature_help.rb +2 -2
- data/lib/ruby_lsp/requests/support/annotation.rb +1 -1
- data/lib/ruby_lsp/requests/support/common.rb +9 -12
- data/lib/ruby_lsp/requests/support/formatter.rb +16 -15
- data/lib/ruby_lsp/requests/support/package_url.rb +414 -0
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +7 -1
- data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +2 -2
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +13 -3
- data/lib/ruby_lsp/requests/support/source_uri.rb +7 -4
- data/lib/ruby_lsp/requests/support/test_item.rb +7 -1
- data/lib/ruby_lsp/requests/workspace_symbol.rb +20 -12
- data/lib/ruby_lsp/response_builders/collection_response_builder.rb +1 -4
- data/lib/ruby_lsp/response_builders/document_symbol.rb +2 -3
- data/lib/ruby_lsp/response_builders/hover.rb +1 -4
- data/lib/ruby_lsp/response_builders/response_builder.rb +6 -7
- data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +4 -5
- data/lib/ruby_lsp/response_builders/signature_help.rb +1 -2
- data/lib/ruby_lsp/response_builders/test_collection.rb +29 -3
- data/lib/ruby_lsp/ruby_document.rb +14 -42
- data/lib/ruby_lsp/scripts/compose_bundle.rb +3 -3
- data/lib/ruby_lsp/scripts/compose_bundle_windows.rb +3 -1
- data/lib/ruby_lsp/server.rb +173 -130
- data/lib/ruby_lsp/setup_bundler.rb +114 -47
- data/lib/ruby_lsp/static_docs.rb +1 -0
- data/lib/ruby_lsp/store.rb +6 -16
- data/lib/ruby_lsp/test_helper.rb +1 -4
- data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +121 -17
- data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +65 -25
- data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +16 -18
- data/lib/ruby_lsp/utils.rb +102 -13
- data/static_docs/break.md +103 -0
- metadata +8 -33
- data/lib/ruby_indexer/test/class_variables_test.rb +0 -140
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +0 -770
- data/lib/ruby_indexer/test/configuration_test.rb +0 -280
- data/lib/ruby_indexer/test/constant_test.rb +0 -402
- data/lib/ruby_indexer/test/enhancements_test.rb +0 -325
- data/lib/ruby_indexer/test/global_variable_test.rb +0 -49
- data/lib/ruby_indexer/test/index_test.rb +0 -2190
- data/lib/ruby_indexer/test/instance_variables_test.rb +0 -240
- data/lib/ruby_indexer/test/method_test.rb +0 -973
- data/lib/ruby_indexer/test/prefix_tree_test.rb +0 -150
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +0 -380
- data/lib/ruby_indexer/test/reference_finder_test.rb +0 -330
- data/lib/ruby_indexer/test/test_case.rb +0 -51
- data/lib/ruby_indexer/test/uri_test.rb +0 -85
- data/lib/ruby_lsp/load_sorbet.rb +0 -62
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
module RubyLsp
|
|
5
5
|
module ResponseBuilders
|
|
6
|
+
#: [ResponseType = Interface::SemanticTokens]
|
|
6
7
|
class SemanticHighlighting < ResponseBuilder
|
|
7
8
|
class UndefinedTokenType < StandardError; end
|
|
8
9
|
|
|
@@ -42,11 +43,9 @@ module RubyLsp
|
|
|
42
43
|
async: 6,
|
|
43
44
|
modification: 7,
|
|
44
45
|
documentation: 8,
|
|
45
|
-
|
|
46
|
+
defaultLibrary: 9,
|
|
46
47
|
}.freeze #: Hash[Symbol, Integer]
|
|
47
48
|
|
|
48
|
-
ResponseType = type_member { { fixed: Interface::SemanticTokens } }
|
|
49
|
-
|
|
50
49
|
#: ((^(Integer arg0) -> Integer | Prism::CodeUnitsCache) code_units_cache) -> void
|
|
51
50
|
def initialize(code_units_cache)
|
|
52
51
|
super()
|
|
@@ -185,8 +184,8 @@ module RubyLsp
|
|
|
185
184
|
end
|
|
186
185
|
|
|
187
186
|
# Encode an array of modifiers to positions onto a bit flag
|
|
188
|
-
# For example, [:
|
|
189
|
-
# 0b1000000000, as :
|
|
187
|
+
# For example, [:defaultLibrary] will be encoded as
|
|
188
|
+
# 0b1000000000, as :defaultLibrary is the 10th bit according
|
|
190
189
|
# to the token modifiers index map.
|
|
191
190
|
#: (Array[Integer] modifiers) -> Integer
|
|
192
191
|
def encode_modifiers(modifiers)
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
module RubyLsp
|
|
5
5
|
module ResponseBuilders
|
|
6
|
+
#: [ResponseType = Requests::Support::TestItem]
|
|
6
7
|
class TestCollection < ResponseBuilder
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
ResponseType = type_member { { fixed: Requests::Support::TestItem } }
|
|
8
|
+
#: Array[Interface::CodeLens]
|
|
9
|
+
attr_reader :code_lens
|
|
10
10
|
|
|
11
11
|
#: -> void
|
|
12
12
|
def initialize
|
|
13
13
|
super
|
|
14
14
|
@items = {} #: Hash[String, ResponseType]
|
|
15
|
+
@code_lens = [] #: Array[Interface::CodeLens]
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
#: (ResponseType item) -> void
|
|
@@ -19,6 +20,31 @@ module RubyLsp
|
|
|
19
20
|
@items[item.id] = item
|
|
20
21
|
end
|
|
21
22
|
|
|
23
|
+
#: (ResponseType item) -> void
|
|
24
|
+
def add_code_lens(item)
|
|
25
|
+
arguments = [item.uri.to_standardized_path, item.id]
|
|
26
|
+
start = item.range.start
|
|
27
|
+
range = Interface::Range.new(
|
|
28
|
+
start: start,
|
|
29
|
+
end: Interface::Position.new(line: start.line, character: start.character + 1),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
@code_lens << Interface::CodeLens.new(
|
|
33
|
+
range: range,
|
|
34
|
+
data: { arguments: arguments, kind: "run_test" },
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
@code_lens << Interface::CodeLens.new(
|
|
38
|
+
range: range,
|
|
39
|
+
data: { arguments: arguments, kind: "run_test_in_terminal" },
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
@code_lens << Interface::CodeLens.new(
|
|
43
|
+
range: range,
|
|
44
|
+
data: { arguments: arguments, kind: "debug_test" },
|
|
45
|
+
)
|
|
46
|
+
end
|
|
47
|
+
|
|
22
48
|
#: (String id) -> ResponseType?
|
|
23
49
|
def [](id)
|
|
24
50
|
@items[id]
|
|
@@ -2,11 +2,8 @@
|
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
module RubyLsp
|
|
5
|
+
#: [ParseResultType = Prism::ParseLexResult]
|
|
5
6
|
class RubyDocument < Document
|
|
6
|
-
extend T::Generic
|
|
7
|
-
|
|
8
|
-
ParseResultType = type_member { { fixed: Prism::ParseResult } }
|
|
9
|
-
|
|
10
7
|
METHODS_THAT_CHANGE_DECLARATIONS = [
|
|
11
8
|
:private_constant,
|
|
12
9
|
:attr_reader,
|
|
@@ -23,23 +20,13 @@ module RubyLsp
|
|
|
23
20
|
:private_class_method,
|
|
24
21
|
].freeze
|
|
25
22
|
|
|
26
|
-
class SorbetLevel < T::Enum
|
|
27
|
-
enums do
|
|
28
|
-
None = new("none")
|
|
29
|
-
Ignore = new("ignore")
|
|
30
|
-
False = new("false")
|
|
31
|
-
True = new("true")
|
|
32
|
-
Strict = new("strict")
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
23
|
class << self
|
|
37
24
|
#: (Prism::Node node, Integer char_position, code_units_cache: (^(Integer arg0) -> Integer | Prism::CodeUnitsCache), ?node_types: Array[singleton(Prism::Node)]) -> NodeContext
|
|
38
25
|
def locate(node, char_position, code_units_cache:, node_types: [])
|
|
39
26
|
queue = node.child_nodes.compact #: Array[Prism::Node?]
|
|
40
27
|
closest = node
|
|
41
28
|
parent = nil #: Prism::Node?
|
|
42
|
-
nesting_nodes = [] #: Array[(Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode | Prism::DefNode | Prism::BlockNode | Prism::LambdaNode | Prism::ProgramNode)]
|
|
29
|
+
nesting_nodes = [] #: Array[(Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode | Prism::DefNode | Prism::BlockNode | Prism::LambdaNode | Prism::ProgramNode)]
|
|
43
30
|
|
|
44
31
|
nesting_nodes << node if node.is_a?(Prism::ProgramNode)
|
|
45
32
|
call_node = nil #: Prism::CallNode?
|
|
@@ -53,7 +40,7 @@ module RubyLsp
|
|
|
53
40
|
# Add the next child_nodes to the queue to be processed. The order here is important! We want to move in the
|
|
54
41
|
# same order as the visiting mechanism, which means searching the child nodes before moving on to the next
|
|
55
42
|
# sibling
|
|
56
|
-
|
|
43
|
+
queue.unshift(*candidate.child_nodes)
|
|
57
44
|
|
|
58
45
|
# Skip if the current node doesn't cover the desired position
|
|
59
46
|
loc = candidate.location
|
|
@@ -142,11 +129,16 @@ module RubyLsp
|
|
|
142
129
|
return false unless @needs_parsing
|
|
143
130
|
|
|
144
131
|
@needs_parsing = false
|
|
145
|
-
@parse_result = Prism.
|
|
132
|
+
@parse_result = Prism.parse_lex(@source)
|
|
146
133
|
@code_units_cache = @parse_result.code_units_cache(@encoding)
|
|
147
134
|
true
|
|
148
135
|
end
|
|
149
136
|
|
|
137
|
+
#: -> Prism::ProgramNode
|
|
138
|
+
def ast
|
|
139
|
+
@parse_result.value.first
|
|
140
|
+
end
|
|
141
|
+
|
|
150
142
|
# @override
|
|
151
143
|
#: -> bool
|
|
152
144
|
def syntax_error?
|
|
@@ -154,29 +146,9 @@ module RubyLsp
|
|
|
154
146
|
end
|
|
155
147
|
|
|
156
148
|
# @override
|
|
157
|
-
#: ->
|
|
149
|
+
#: -> Symbol
|
|
158
150
|
def language_id
|
|
159
|
-
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
#: -> SorbetLevel
|
|
163
|
-
def sorbet_level
|
|
164
|
-
sigil = parse_result.magic_comments.find do |comment|
|
|
165
|
-
comment.key == "typed"
|
|
166
|
-
end&.value
|
|
167
|
-
|
|
168
|
-
case sigil
|
|
169
|
-
when "ignore"
|
|
170
|
-
SorbetLevel::Ignore
|
|
171
|
-
when "false"
|
|
172
|
-
SorbetLevel::False
|
|
173
|
-
when "true"
|
|
174
|
-
SorbetLevel::True
|
|
175
|
-
when "strict", "strong"
|
|
176
|
-
SorbetLevel::Strict
|
|
177
|
-
else
|
|
178
|
-
SorbetLevel::None
|
|
179
|
-
end
|
|
151
|
+
:ruby
|
|
180
152
|
end
|
|
181
153
|
|
|
182
154
|
#: (Hash[Symbol, untyped] range, ?node_types: Array[singleton(Prism::Node)]) -> Prism::Node?
|
|
@@ -184,7 +156,7 @@ module RubyLsp
|
|
|
184
156
|
start_position, end_position = find_index_by_position(range[:start], range[:end])
|
|
185
157
|
|
|
186
158
|
desired_range = (start_position...end_position)
|
|
187
|
-
queue =
|
|
159
|
+
queue = ast.child_nodes.compact #: Array[Prism::Node?]
|
|
188
160
|
|
|
189
161
|
until queue.empty?
|
|
190
162
|
candidate = queue.shift
|
|
@@ -195,7 +167,7 @@ module RubyLsp
|
|
|
195
167
|
# Add the next child_nodes to the queue to be processed. The order here is important! We want to move in the
|
|
196
168
|
# same order as the visiting mechanism, which means searching the child nodes before moving on to the next
|
|
197
169
|
# sibling
|
|
198
|
-
|
|
170
|
+
queue.unshift(*candidate.child_nodes)
|
|
199
171
|
|
|
200
172
|
# Skip if the current node doesn't cover the desired position
|
|
201
173
|
loc = candidate.location
|
|
@@ -212,7 +184,7 @@ module RubyLsp
|
|
|
212
184
|
char_position, _ = find_index_by_position(position)
|
|
213
185
|
|
|
214
186
|
RubyDocument.locate(
|
|
215
|
-
|
|
187
|
+
ast,
|
|
216
188
|
char_position,
|
|
217
189
|
code_units_cache: @code_units_cache,
|
|
218
190
|
node_types: node_types,
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# typed: true
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
|
-
def compose(raw_initialize)
|
|
4
|
+
def compose(raw_initialize, **options)
|
|
5
5
|
require_relative "../setup_bundler"
|
|
6
6
|
require "json"
|
|
7
7
|
require "uri"
|
|
8
|
-
|
|
8
|
+
require_relative "../../ruby_indexer/lib/ruby_indexer/uri"
|
|
9
9
|
|
|
10
10
|
initialize_request = JSON.parse(raw_initialize, symbolize_names: true)
|
|
11
11
|
workspace_uri = initialize_request.dig(:params, :workspaceFolders, 0, :uri)
|
|
12
12
|
workspace_path = workspace_uri && URI(workspace_uri).to_standardized_path
|
|
13
13
|
workspace_path ||= Dir.pwd
|
|
14
14
|
|
|
15
|
-
env = RubyLsp::SetupBundler.new(workspace_path, launcher: true).setup!
|
|
15
|
+
env = RubyLsp::SetupBundler.new(workspace_path, launcher: true, **options).setup!
|
|
16
16
|
|
|
17
17
|
File.open(File.join(".ruby-lsp", "bundle_env"), "w") do |f|
|
|
18
18
|
f.flock(File::LOCK_EX)
|
|
@@ -5,4 +5,6 @@ require_relative "compose_bundle"
|
|
|
5
5
|
|
|
6
6
|
# When this is invoked on Windows, we pass the raw initialize as an argument to this script. On other platforms, we
|
|
7
7
|
# invoke the compose method from inside a forked process
|
|
8
|
-
|
|
8
|
+
options = {}
|
|
9
|
+
options[:beta] = true if ARGV.include?("--beta")
|
|
10
|
+
compose(ARGV.first, **options)
|