ruby-lsp 0.23.11 → 0.23.13
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 +2 -2
- data/VERSION +1 -1
- data/exe/ruby-lsp-launcher +12 -11
- data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -1
- data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -5
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +81 -115
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +117 -166
- data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +9 -7
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +88 -200
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +56 -192
- data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
- data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +14 -16
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +22 -45
- data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +42 -60
- data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +9 -16
- data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +5 -9
- data/lib/ruby_indexer/test/configuration_test.rb +42 -3
- data/lib/ruby_indexer/test/method_test.rb +28 -2
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +1 -1
- data/lib/ruby_lsp/addon.rb +44 -71
- data/lib/ruby_lsp/base_server.rb +29 -32
- data/lib/ruby_lsp/client_capabilities.rb +10 -12
- data/lib/ruby_lsp/document.rb +34 -45
- data/lib/ruby_lsp/erb_document.rb +24 -36
- data/lib/ruby_lsp/global_state.rb +51 -56
- data/lib/ruby_lsp/internal.rb +2 -0
- data/lib/ruby_lsp/listeners/code_lens.rb +81 -88
- data/lib/ruby_lsp/listeners/completion.rb +36 -55
- data/lib/ruby_lsp/listeners/definition.rb +37 -51
- data/lib/ruby_lsp/listeners/document_highlight.rb +123 -150
- data/lib/ruby_lsp/listeners/document_link.rb +43 -62
- data/lib/ruby_lsp/listeners/document_symbol.rb +35 -49
- data/lib/ruby_lsp/listeners/folding_ranges.rb +32 -39
- data/lib/ruby_lsp/listeners/hover.rb +81 -100
- data/lib/ruby_lsp/listeners/inlay_hints.rb +4 -11
- data/lib/ruby_lsp/listeners/semantic_highlighting.rb +42 -51
- data/lib/ruby_lsp/listeners/signature_help.rb +6 -25
- data/lib/ruby_lsp/listeners/spec_style.rb +155 -0
- data/lib/ruby_lsp/listeners/test_discovery.rb +89 -0
- data/lib/ruby_lsp/listeners/test_style.rb +160 -88
- data/lib/ruby_lsp/node_context.rb +12 -39
- data/lib/ruby_lsp/rbs_document.rb +8 -6
- data/lib/ruby_lsp/requests/code_action_resolve.rb +10 -10
- data/lib/ruby_lsp/requests/code_actions.rb +14 -26
- data/lib/ruby_lsp/requests/code_lens.rb +6 -17
- data/lib/ruby_lsp/requests/completion.rb +7 -20
- data/lib/ruby_lsp/requests/completion_resolve.rb +5 -5
- data/lib/ruby_lsp/requests/definition.rb +8 -17
- data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
- data/lib/ruby_lsp/requests/discover_tests.rb +18 -5
- data/lib/ruby_lsp/requests/document_highlight.rb +5 -15
- data/lib/ruby_lsp/requests/document_link.rb +6 -17
- data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
- data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
- data/lib/ruby_lsp/requests/formatting.rb +6 -9
- data/lib/ruby_lsp/requests/go_to_relevant_file.rb +87 -0
- data/lib/ruby_lsp/requests/hover.rb +8 -18
- data/lib/ruby_lsp/requests/inlay_hints.rb +6 -17
- data/lib/ruby_lsp/requests/on_type_formatting.rb +28 -38
- data/lib/ruby_lsp/requests/prepare_rename.rb +4 -9
- data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +4 -13
- data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
- data/lib/ruby_lsp/requests/references.rb +6 -36
- data/lib/ruby_lsp/requests/rename.rb +11 -37
- data/lib/ruby_lsp/requests/request.rb +7 -19
- data/lib/ruby_lsp/requests/selection_ranges.rb +5 -5
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +12 -31
- data/lib/ruby_lsp/requests/show_syntax_tree.rb +5 -6
- data/lib/ruby_lsp/requests/signature_help.rb +8 -26
- data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
- data/lib/ruby_lsp/requests/support/common.rb +13 -50
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
- data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +9 -12
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +22 -34
- data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
- data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
- data/lib/ruby_lsp/requests/support/source_uri.rb +16 -30
- data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
- data/lib/ruby_lsp/requests/support/test_item.rb +10 -14
- data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
- data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
- data/lib/ruby_lsp/response_builders/collection_response_builder.rb +5 -5
- data/lib/ruby_lsp/response_builders/document_symbol.rb +10 -16
- data/lib/ruby_lsp/response_builders/hover.rb +10 -13
- data/lib/ruby_lsp/response_builders/response_builder.rb +1 -1
- data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +59 -87
- data/lib/ruby_lsp/response_builders/signature_help.rb +5 -6
- data/lib/ruby_lsp/response_builders/test_collection.rb +6 -10
- data/lib/ruby_lsp/ruby_document.rb +22 -60
- data/lib/ruby_lsp/ruby_lsp_reporter_plugin.rb +109 -0
- data/lib/ruby_lsp/scope.rb +7 -11
- data/lib/ruby_lsp/server.rb +133 -74
- data/lib/ruby_lsp/setup_bundler.rb +58 -57
- data/lib/ruby_lsp/static_docs.rb +4 -7
- data/lib/ruby_lsp/store.rb +21 -40
- data/lib/ruby_lsp/test_helper.rb +3 -12
- data/lib/ruby_lsp/test_reporter.rb +207 -0
- data/lib/ruby_lsp/test_unit_test_runner.rb +98 -0
- data/lib/ruby_lsp/type_inferrer.rb +9 -13
- data/lib/ruby_lsp/utils.rb +37 -81
- metadata +9 -3
@@ -6,12 +6,8 @@ module RubyLsp
|
|
6
6
|
# The [on type formatting](https://microsoft.github.io/language-server-protocol/specification#textDocument_onTypeFormatting)
|
7
7
|
# request formats code as the user is typing. For example, automatically adding `end` to class definitions.
|
8
8
|
class OnTypeFormatting < Request
|
9
|
-
extend T::Sig
|
10
|
-
|
11
9
|
class << self
|
12
|
-
|
13
|
-
|
14
|
-
sig { returns(Interface::DocumentOnTypeFormattingRegistrationOptions) }
|
10
|
+
#: -> Interface::DocumentOnTypeFormattingRegistrationOptions
|
15
11
|
def provider
|
16
12
|
Interface::DocumentOnTypeFormattingRegistrationOptions.new(
|
17
13
|
document_selector: nil,
|
@@ -21,38 +17,29 @@ module RubyLsp
|
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
24
|
-
END_REGEXES =
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
)
|
32
|
-
|
33
|
-
sig do
|
34
|
-
params(
|
35
|
-
document: RubyDocument,
|
36
|
-
position: T::Hash[Symbol, T.untyped],
|
37
|
-
trigger_character: String,
|
38
|
-
client_name: String,
|
39
|
-
).void
|
40
|
-
end
|
20
|
+
END_REGEXES = [
|
21
|
+
/\b(if|unless|for|while|until)\b($|\s|\()/,
|
22
|
+
/\b(class|module|def|case)\b($|\s)/,
|
23
|
+
/.*\s\bdo\b($|\s)/,
|
24
|
+
] #: Array[Regexp]
|
25
|
+
|
26
|
+
#: (RubyDocument document, Hash[Symbol, untyped] position, String trigger_character, String client_name) -> void
|
41
27
|
def initialize(document, position, trigger_character, client_name)
|
42
28
|
super()
|
43
29
|
@document = document
|
44
|
-
@lines =
|
30
|
+
@lines = @document.source.lines #: Array[String]
|
45
31
|
line = @lines[[position[:line] - 1, 0].max]
|
46
32
|
|
47
|
-
@indentation =
|
48
|
-
@previous_line =
|
33
|
+
@indentation = line ? find_indentation(line) : 0 #: Integer
|
34
|
+
@previous_line = line ? line.strip.chomp : "" #: String
|
49
35
|
@position = position
|
50
|
-
@edits =
|
36
|
+
@edits = [] #: Array[Interface::TextEdit]
|
51
37
|
@trigger_character = trigger_character
|
52
38
|
@client_name = client_name
|
53
39
|
end
|
54
40
|
|
55
|
-
|
41
|
+
# @override
|
42
|
+
#: -> (Array[Interface::TextEdit] & Object)
|
56
43
|
def perform
|
57
44
|
case @trigger_character
|
58
45
|
when "{"
|
@@ -60,7 +47,10 @@ module RubyLsp
|
|
60
47
|
when "|"
|
61
48
|
handle_pipe if @document.syntax_error?
|
62
49
|
when "\n"
|
63
|
-
|
50
|
+
# If the previous line is a simple comment, we'll add a comment continuation
|
51
|
+
# But if it's a RBS signature starting with `#:`, we'll ignore it
|
52
|
+
# so users can immediately continue typing the method definition
|
53
|
+
if (comment_match = @previous_line.match(/^#(?!:)(\s*)/))
|
64
54
|
handle_comment_line(T.must(comment_match[1]))
|
65
55
|
elsif @document.syntax_error?
|
66
56
|
match = /(<<((-|~)?))(?<quote>['"`]?)(?<delimiter>\w+)\k<quote>/.match(@previous_line)
|
@@ -81,7 +71,7 @@ module RubyLsp
|
|
81
71
|
|
82
72
|
private
|
83
73
|
|
84
|
-
|
74
|
+
#: -> void
|
85
75
|
def handle_pipe
|
86
76
|
current_line = @lines[@position[:line]]
|
87
77
|
return unless /((?<=do)|(?<={))\s+\|/.match?(current_line)
|
@@ -112,7 +102,7 @@ module RubyLsp
|
|
112
102
|
move_cursor_to(@position[:line], @position[:character])
|
113
103
|
end
|
114
104
|
|
115
|
-
|
105
|
+
#: -> void
|
116
106
|
def handle_curly_brace
|
117
107
|
return unless /".*#\{/.match?(@previous_line)
|
118
108
|
|
@@ -120,7 +110,7 @@ module RubyLsp
|
|
120
110
|
move_cursor_to(@position[:line], @position[:character])
|
121
111
|
end
|
122
112
|
|
123
|
-
|
113
|
+
#: -> void
|
124
114
|
def handle_statement_end
|
125
115
|
# If a keyword occurs in a line which appears be a comment or a string, we will not try to format it, since
|
126
116
|
# it could be a coincidental match. This approach is not perfect, but it should cover most cases.
|
@@ -142,7 +132,7 @@ module RubyLsp
|
|
142
132
|
end
|
143
133
|
end
|
144
134
|
|
145
|
-
|
135
|
+
#: (String delimiter) -> void
|
146
136
|
def handle_heredoc_end(delimiter)
|
147
137
|
indents = " " * @indentation
|
148
138
|
add_edit_with_text("\n")
|
@@ -150,12 +140,12 @@ module RubyLsp
|
|
150
140
|
move_cursor_to(@position[:line], @indentation + 2)
|
151
141
|
end
|
152
142
|
|
153
|
-
|
143
|
+
#: (String spaces) -> void
|
154
144
|
def handle_comment_line(spaces)
|
155
145
|
add_edit_with_text("##{spaces}")
|
156
146
|
end
|
157
147
|
|
158
|
-
|
148
|
+
#: (String text, ?Hash[Symbol, untyped] position) -> void
|
159
149
|
def add_edit_with_text(text, position = @position)
|
160
150
|
pos = Interface::Position.new(
|
161
151
|
line: position[:line],
|
@@ -168,9 +158,9 @@ module RubyLsp
|
|
168
158
|
)
|
169
159
|
end
|
170
160
|
|
171
|
-
|
161
|
+
#: (Integer line, Integer character) -> void
|
172
162
|
def move_cursor_to(line, character)
|
173
|
-
return unless /Visual Studio Code|Cursor/.match?(@client_name)
|
163
|
+
return unless /Visual Studio Code|Cursor|VSCodium/.match?(@client_name)
|
174
164
|
|
175
165
|
position = Interface::Position.new(
|
176
166
|
line: line,
|
@@ -189,7 +179,7 @@ module RubyLsp
|
|
189
179
|
)
|
190
180
|
end
|
191
181
|
|
192
|
-
|
182
|
+
#: (String line) -> Integer
|
193
183
|
def find_indentation(line)
|
194
184
|
count = 0
|
195
185
|
|
@@ -202,7 +192,7 @@ module RubyLsp
|
|
202
192
|
count
|
203
193
|
end
|
204
194
|
|
205
|
-
|
195
|
+
#: -> void
|
206
196
|
def auto_indent_after_end_keyword
|
207
197
|
current_line = @lines[@position[:line]]
|
208
198
|
return unless current_line && current_line.strip == "end"
|
@@ -7,22 +7,17 @@ module RubyLsp
|
|
7
7
|
# [prepare_rename](https://microsoft.github.io/language-server-protocol/specification#textDocument_prepareRename)
|
8
8
|
# # request checks the validity of a rename operation at a given location.
|
9
9
|
class PrepareRename < Request
|
10
|
-
extend T::Sig
|
11
10
|
include Support::Common
|
12
11
|
|
13
|
-
|
14
|
-
params(
|
15
|
-
document: RubyDocument,
|
16
|
-
position: T::Hash[Symbol, T.untyped],
|
17
|
-
).void
|
18
|
-
end
|
12
|
+
#: (RubyDocument document, Hash[Symbol, untyped] position) -> void
|
19
13
|
def initialize(document, position)
|
20
14
|
super()
|
21
15
|
@document = document
|
22
|
-
@position =
|
16
|
+
@position = position #: Hash[Symbol, Integer]
|
23
17
|
end
|
24
18
|
|
25
|
-
|
19
|
+
# @override
|
20
|
+
#: -> Interface::Range?
|
26
21
|
def perform
|
27
22
|
char_position, _ = @document.find_index_by_position(@position)
|
28
23
|
|
@@ -9,26 +9,16 @@ module RubyLsp
|
|
9
9
|
#
|
10
10
|
# Currently only supports supertypes due to a limitation of the index.
|
11
11
|
class PrepareTypeHierarchy < Request
|
12
|
-
extend T::Sig
|
13
|
-
|
14
12
|
include Support::Common
|
15
13
|
|
16
14
|
class << self
|
17
|
-
|
18
|
-
|
19
|
-
sig { returns(Interface::TypeHierarchyOptions) }
|
15
|
+
#: -> Interface::TypeHierarchyOptions
|
20
16
|
def provider
|
21
17
|
Interface::TypeHierarchyOptions.new
|
22
18
|
end
|
23
19
|
end
|
24
20
|
|
25
|
-
|
26
|
-
params(
|
27
|
-
document: T.any(RubyDocument, ERBDocument),
|
28
|
-
index: RubyIndexer::Index,
|
29
|
-
position: T::Hash[Symbol, T.untyped],
|
30
|
-
).void
|
31
|
-
end
|
21
|
+
#: ((RubyDocument | ERBDocument) document, RubyIndexer::Index index, Hash[Symbol, untyped] position) -> void
|
32
22
|
def initialize(document, index, position)
|
33
23
|
super()
|
34
24
|
|
@@ -37,7 +27,8 @@ module RubyLsp
|
|
37
27
|
@position = position
|
38
28
|
end
|
39
29
|
|
40
|
-
|
30
|
+
# @override
|
31
|
+
#: -> Array[Interface::TypeHierarchyItem]?
|
41
32
|
def perform
|
42
33
|
context = @document.locate_node(
|
43
34
|
@position,
|
@@ -6,18 +6,17 @@ module RubyLsp
|
|
6
6
|
# The [range formatting](https://microsoft.github.io/language-server-protocol/specification#textDocument_rangeFormatting)
|
7
7
|
# is used to format a selection or to format on paste.
|
8
8
|
class RangeFormatting < Request
|
9
|
-
|
10
|
-
|
11
|
-
sig { params(global_state: GlobalState, document: RubyDocument, params: T::Hash[Symbol, T.untyped]).void }
|
9
|
+
#: (GlobalState global_state, RubyDocument document, Hash[Symbol, untyped] params) -> void
|
12
10
|
def initialize(global_state, document, params)
|
13
11
|
super()
|
14
12
|
@document = document
|
15
|
-
@uri =
|
13
|
+
@uri = document.uri #: URI::Generic
|
16
14
|
@params = params
|
17
|
-
@active_formatter =
|
15
|
+
@active_formatter = global_state.active_formatter #: Support::Formatter?
|
18
16
|
end
|
19
17
|
|
20
|
-
|
18
|
+
# @override
|
19
|
+
#: -> Array[Interface::TextEdit]?
|
21
20
|
def perform
|
22
21
|
return unless @active_formatter
|
23
22
|
return if @document.syntax_error?
|
@@ -7,27 +7,20 @@ module RubyLsp
|
|
7
7
|
# [references](https://microsoft.github.io/language-server-protocol/specification#textDocument_references)
|
8
8
|
# request finds all references for the selected symbol.
|
9
9
|
class References < Request
|
10
|
-
extend T::Sig
|
11
10
|
include Support::Common
|
12
11
|
|
13
|
-
|
14
|
-
params(
|
15
|
-
global_state: GlobalState,
|
16
|
-
store: Store,
|
17
|
-
document: T.any(RubyDocument, ERBDocument),
|
18
|
-
params: T::Hash[Symbol, T.untyped],
|
19
|
-
).void
|
20
|
-
end
|
12
|
+
#: (GlobalState global_state, Store store, (RubyDocument | ERBDocument) document, Hash[Symbol, untyped] params) -> void
|
21
13
|
def initialize(global_state, store, document, params)
|
22
14
|
super()
|
23
15
|
@global_state = global_state
|
24
16
|
@store = store
|
25
17
|
@document = document
|
26
18
|
@params = params
|
27
|
-
@locations =
|
19
|
+
@locations = [] #: Array[Interface::Location]
|
28
20
|
end
|
29
21
|
|
30
|
-
|
22
|
+
# @override
|
23
|
+
#: -> Array[Interface::Location]
|
31
24
|
def perform
|
32
25
|
position = @params[:position]
|
33
26
|
char_position, _ = @document.find_index_by_position(position)
|
@@ -103,24 +96,7 @@ module RubyLsp
|
|
103
96
|
|
104
97
|
private
|
105
98
|
|
106
|
-
|
107
|
-
params(
|
108
|
-
target_node: T.any(
|
109
|
-
Prism::ConstantReadNode,
|
110
|
-
Prism::ConstantPathNode,
|
111
|
-
Prism::ConstantPathTargetNode,
|
112
|
-
Prism::InstanceVariableAndWriteNode,
|
113
|
-
Prism::InstanceVariableOperatorWriteNode,
|
114
|
-
Prism::InstanceVariableOrWriteNode,
|
115
|
-
Prism::InstanceVariableReadNode,
|
116
|
-
Prism::InstanceVariableTargetNode,
|
117
|
-
Prism::InstanceVariableWriteNode,
|
118
|
-
Prism::CallNode,
|
119
|
-
Prism::DefNode,
|
120
|
-
),
|
121
|
-
node_context: NodeContext,
|
122
|
-
).returns(T.nilable(RubyIndexer::ReferenceFinder::Target))
|
123
|
-
end
|
99
|
+
#: ((Prism::ConstantReadNode | Prism::ConstantPathNode | Prism::ConstantPathTargetNode | Prism::InstanceVariableAndWriteNode | Prism::InstanceVariableOperatorWriteNode | Prism::InstanceVariableOrWriteNode | Prism::InstanceVariableReadNode | Prism::InstanceVariableTargetNode | Prism::InstanceVariableWriteNode | Prism::CallNode | Prism::DefNode) target_node, NodeContext node_context) -> RubyIndexer::ReferenceFinder::Target?
|
124
100
|
def create_reference_target(target_node, node_context)
|
125
101
|
case target_node
|
126
102
|
when Prism::ConstantReadNode, Prism::ConstantPathNode, Prism::ConstantPathTargetNode
|
@@ -145,13 +121,7 @@ module RubyLsp
|
|
145
121
|
end
|
146
122
|
end
|
147
123
|
|
148
|
-
|
149
|
-
params(
|
150
|
-
target: RubyIndexer::ReferenceFinder::Target,
|
151
|
-
parse_result: Prism::ParseResult,
|
152
|
-
uri: URI::Generic,
|
153
|
-
).void
|
154
|
-
end
|
124
|
+
#: (RubyIndexer::ReferenceFinder::Target target, Prism::ParseResult parse_result, URI::Generic uri) -> void
|
155
125
|
def collect_references(target, parse_result, uri)
|
156
126
|
dispatcher = Prism::Dispatcher.new
|
157
127
|
finder = RubyIndexer::ReferenceFinder.new(
|
@@ -7,38 +7,29 @@ module RubyLsp
|
|
7
7
|
# [rename](https://microsoft.github.io/language-server-protocol/specification#textDocument_rename)
|
8
8
|
# request renames all instances of a symbol in a document.
|
9
9
|
class Rename < Request
|
10
|
-
extend T::Sig
|
11
10
|
include Support::Common
|
12
11
|
|
13
12
|
class InvalidNameError < StandardError; end
|
14
13
|
|
15
14
|
class << self
|
16
|
-
|
17
|
-
|
18
|
-
sig { returns(Interface::RenameOptions) }
|
15
|
+
#: -> Interface::RenameOptions
|
19
16
|
def provider
|
20
17
|
Interface::RenameOptions.new(prepare_provider: true)
|
21
18
|
end
|
22
19
|
end
|
23
20
|
|
24
|
-
|
25
|
-
params(
|
26
|
-
global_state: GlobalState,
|
27
|
-
store: Store,
|
28
|
-
document: T.any(RubyDocument, ERBDocument),
|
29
|
-
params: T::Hash[Symbol, T.untyped],
|
30
|
-
).void
|
31
|
-
end
|
21
|
+
#: (GlobalState global_state, Store store, (RubyDocument | ERBDocument) document, Hash[Symbol, untyped] params) -> void
|
32
22
|
def initialize(global_state, store, document, params)
|
33
23
|
super()
|
34
24
|
@global_state = global_state
|
35
25
|
@store = store
|
36
26
|
@document = document
|
37
|
-
@position =
|
38
|
-
@new_name =
|
27
|
+
@position = params[:position] #: Hash[Symbol, Integer]
|
28
|
+
@new_name = params[:newName] #: String
|
39
29
|
end
|
40
30
|
|
41
|
-
|
31
|
+
# @override
|
32
|
+
#: -> Interface::WorkspaceEdit?
|
42
33
|
def perform
|
43
34
|
char_position, _ = @document.find_index_by_position(@position)
|
44
35
|
|
@@ -100,12 +91,7 @@ module RubyLsp
|
|
100
91
|
|
101
92
|
private
|
102
93
|
|
103
|
-
|
104
|
-
params(
|
105
|
-
fully_qualified_name: String,
|
106
|
-
document_changes: T::Array[T.any(Interface::RenameFile, Interface::TextDocumentEdit)],
|
107
|
-
).void
|
108
|
-
end
|
94
|
+
#: (String fully_qualified_name, Array[(Interface::RenameFile | Interface::TextDocumentEdit)] document_changes) -> void
|
109
95
|
def collect_file_renames(fully_qualified_name, document_changes)
|
110
96
|
# Check if the declarations of the symbol being renamed match the file name. In case they do, we automatically
|
111
97
|
# rename the files for the user.
|
@@ -139,12 +125,7 @@ module RubyLsp
|
|
139
125
|
end
|
140
126
|
end
|
141
127
|
|
142
|
-
|
143
|
-
params(
|
144
|
-
target: RubyIndexer::ReferenceFinder::Target,
|
145
|
-
name: String,
|
146
|
-
).returns(T::Hash[String, T::Array[Interface::TextEdit]])
|
147
|
-
end
|
128
|
+
#: (RubyIndexer::ReferenceFinder::Target target, String name) -> Hash[String, Array[Interface::TextEdit]]
|
148
129
|
def collect_text_edits(target, name)
|
149
130
|
changes = {}
|
150
131
|
|
@@ -169,14 +150,7 @@ module RubyLsp
|
|
169
150
|
changes
|
170
151
|
end
|
171
152
|
|
172
|
-
|
173
|
-
params(
|
174
|
-
target: RubyIndexer::ReferenceFinder::Target,
|
175
|
-
parse_result: Prism::ParseResult,
|
176
|
-
name: String,
|
177
|
-
uri: URI::Generic,
|
178
|
-
).returns(T::Array[Interface::TextEdit])
|
179
|
-
end
|
153
|
+
#: (RubyIndexer::ReferenceFinder::Target target, Prism::ParseResult parse_result, String name, URI::Generic uri) -> Array[Interface::TextEdit]
|
180
154
|
def collect_changes(target, parse_result, name, uri)
|
181
155
|
dispatcher = Prism::Dispatcher.new
|
182
156
|
finder = RubyIndexer::ReferenceFinder.new(target, @global_state.index, dispatcher, uri)
|
@@ -187,7 +161,7 @@ module RubyLsp
|
|
187
161
|
end
|
188
162
|
end
|
189
163
|
|
190
|
-
|
164
|
+
#: (String name, RubyIndexer::ReferenceFinder::Reference reference) -> Interface::TextEdit
|
191
165
|
def adjust_reference_for_edit(name, reference)
|
192
166
|
# The reference may include a namespace in front. We need to check if the rename new name includes namespaces
|
193
167
|
# and then adjust both the text and the location to produce the correct edit
|
@@ -197,7 +171,7 @@ module RubyLsp
|
|
197
171
|
Interface::TextEdit.new(range: range_from_location(location), new_text: new_text)
|
198
172
|
end
|
199
173
|
|
200
|
-
|
174
|
+
#: (String constant_name) -> String
|
201
175
|
def file_from_constant_name(constant_name)
|
202
176
|
constant_name
|
203
177
|
.gsub(/([a-z])([A-Z])|([A-Z])([A-Z][a-z])/, '\1\3_\2\4')
|
@@ -4,8 +4,8 @@
|
|
4
4
|
module RubyLsp
|
5
5
|
module Requests
|
6
6
|
class Request
|
7
|
-
extend T::Sig
|
8
7
|
extend T::Generic
|
8
|
+
extend T::Sig
|
9
9
|
|
10
10
|
class InvalidFormatter < StandardError; end
|
11
11
|
|
@@ -18,13 +18,7 @@ module RubyLsp
|
|
18
18
|
|
19
19
|
# Signals to the client that the request should be delegated to the language server server for the host language
|
20
20
|
# in ERB files
|
21
|
-
|
22
|
-
params(
|
23
|
-
global_state: GlobalState,
|
24
|
-
document: Document[T.untyped],
|
25
|
-
char_position: Integer,
|
26
|
-
).void
|
27
|
-
end
|
21
|
+
#: (GlobalState global_state, Document[untyped] document, Integer char_position) -> void
|
28
22
|
def delegate_request_if_needed!(global_state, document, char_position)
|
29
23
|
if global_state.client_capabilities.supports_request_delegation &&
|
30
24
|
document.is_a?(ERBDocument) &&
|
@@ -34,7 +28,7 @@ module RubyLsp
|
|
34
28
|
end
|
35
29
|
|
36
30
|
# Checks if a location covers a position
|
37
|
-
|
31
|
+
#: (Prism::Location location, untyped position) -> bool
|
38
32
|
def cover?(location, position)
|
39
33
|
start_covered =
|
40
34
|
location.start_line - 1 < position[:line] ||
|
@@ -61,18 +55,12 @@ module RubyLsp
|
|
61
55
|
# # ^ Going to definition here should go to Foo::Bar
|
62
56
|
# #^ Going to definition here should go to Foo
|
63
57
|
# ```
|
64
|
-
|
65
|
-
params(
|
66
|
-
target: Prism::Node,
|
67
|
-
parent: Prism::Node,
|
68
|
-
position: T::Hash[Symbol, Integer],
|
69
|
-
).returns(Prism::Node)
|
70
|
-
end
|
58
|
+
#: (Prism::Node target, Prism::Node parent, Hash[Symbol, Integer] position) -> Prism::Node
|
71
59
|
def determine_target(target, parent, position)
|
72
60
|
return target unless parent.is_a?(Prism::ConstantPathNode)
|
73
61
|
|
74
|
-
target =
|
75
|
-
parent = T.
|
62
|
+
target = parent #: Prism::Node
|
63
|
+
parent = T.cast(target, Prism::ConstantPathNode).parent #: Prism::Node?
|
76
64
|
|
77
65
|
while parent && cover?(parent.location, position)
|
78
66
|
target = parent
|
@@ -83,7 +71,7 @@ module RubyLsp
|
|
83
71
|
end
|
84
72
|
|
85
73
|
# Checks if a given location covers the position requested
|
86
|
-
|
74
|
+
#: (Prism::Location? location, Hash[Symbol, untyped] position) -> bool
|
87
75
|
def covers_position?(location, position)
|
88
76
|
return false unless location
|
89
77
|
|
@@ -11,18 +11,18 @@ module RubyLsp
|
|
11
11
|
#
|
12
12
|
# Note that if using VSCode Neovim, you will need to be in Insert mode for this to work correctly.
|
13
13
|
class SelectionRanges < Request
|
14
|
-
extend T::Sig
|
15
14
|
include Support::Common
|
16
15
|
|
17
|
-
|
16
|
+
#: ((RubyDocument | ERBDocument) document) -> void
|
18
17
|
def initialize(document)
|
19
18
|
super()
|
20
19
|
@document = document
|
21
|
-
@ranges =
|
22
|
-
@stack =
|
20
|
+
@ranges = [] #: Array[Support::SelectionRange]
|
21
|
+
@stack = [] #: Array[Support::SelectionRange]
|
23
22
|
end
|
24
23
|
|
25
|
-
|
24
|
+
# @override
|
25
|
+
#: -> (Array[Support::SelectionRange] & Object)
|
26
26
|
def perform
|
27
27
|
# [node, parent]
|
28
28
|
queue = [[@document.parse_result.value, nil]]
|
@@ -9,12 +9,8 @@ module RubyLsp
|
|
9
9
|
# highlighting](https://microsoft.github.io/language-server-protocol/specification#textDocument_semanticTokens)
|
10
10
|
# request informs the editor of the correct token types to provide consistent and accurate highlighting for themes.
|
11
11
|
class SemanticHighlighting < Request
|
12
|
-
extend T::Sig
|
13
|
-
|
14
12
|
class << self
|
15
|
-
|
16
|
-
|
17
|
-
sig { returns(Interface::SemanticTokensRegistrationOptions) }
|
13
|
+
#: -> Interface::SemanticTokensRegistrationOptions
|
18
14
|
def provider
|
19
15
|
Interface::SemanticTokensRegistrationOptions.new(
|
20
16
|
document_selector: nil,
|
@@ -29,13 +25,7 @@ module RubyLsp
|
|
29
25
|
|
30
26
|
# The compute_delta method receives the current semantic tokens and the previous semantic tokens and then tries
|
31
27
|
# to compute the smallest possible semantic token edit that will turn previous into current
|
32
|
-
|
33
|
-
params(
|
34
|
-
current_tokens: T::Array[Integer],
|
35
|
-
previous_tokens: T::Array[Integer],
|
36
|
-
result_id: String,
|
37
|
-
).returns(Interface::SemanticTokensDelta)
|
38
|
-
end
|
28
|
+
#: (Array[Integer] current_tokens, Array[Integer] previous_tokens, String result_id) -> Interface::SemanticTokensDelta
|
39
29
|
def compute_delta(current_tokens, previous_tokens, result_id)
|
40
30
|
# Find the index of the first token that is different between the two sets of tokens
|
41
31
|
first_different_position = current_tokens.zip(previous_tokens).find_index { |new, old| new != old }
|
@@ -73,7 +63,7 @@ module RubyLsp
|
|
73
63
|
)
|
74
64
|
end
|
75
65
|
|
76
|
-
|
66
|
+
#: -> Integer
|
77
67
|
def next_result_id
|
78
68
|
@mutex.synchronize do
|
79
69
|
@result_id += 1
|
@@ -81,29 +71,19 @@ module RubyLsp
|
|
81
71
|
end
|
82
72
|
end
|
83
73
|
|
84
|
-
@result_id =
|
85
|
-
@mutex =
|
86
|
-
|
87
|
-
|
88
|
-
params(
|
89
|
-
global_state: GlobalState,
|
90
|
-
dispatcher: Prism::Dispatcher,
|
91
|
-
document: T.any(RubyDocument, ERBDocument),
|
92
|
-
previous_result_id: T.nilable(String),
|
93
|
-
range: T.nilable(T::Range[Integer]),
|
94
|
-
).void
|
95
|
-
end
|
74
|
+
@result_id = 0 #: Integer
|
75
|
+
@mutex = Mutex.new #: Mutex
|
76
|
+
|
77
|
+
#: (GlobalState global_state, Prism::Dispatcher dispatcher, (RubyDocument | ERBDocument) document, String? previous_result_id, ?range: T::Range[Integer]?) -> void
|
96
78
|
def initialize(global_state, dispatcher, document, previous_result_id, range: nil)
|
97
79
|
super()
|
98
80
|
|
99
81
|
@document = document
|
100
82
|
@previous_result_id = previous_result_id
|
101
83
|
@range = range
|
102
|
-
@result_id =
|
103
|
-
@response_builder =
|
104
|
-
|
105
|
-
ResponseBuilders::SemanticHighlighting,
|
106
|
-
)
|
84
|
+
@result_id = SemanticHighlighting.next_result_id.to_s #: String
|
85
|
+
@response_builder = ResponseBuilders::SemanticHighlighting
|
86
|
+
.new(document.code_units_cache) #: ResponseBuilders::SemanticHighlighting
|
107
87
|
Listeners::SemanticHighlighting.new(dispatcher, @response_builder)
|
108
88
|
|
109
89
|
Addon.addons.each do |addon|
|
@@ -111,7 +91,8 @@ module RubyLsp
|
|
111
91
|
end
|
112
92
|
end
|
113
93
|
|
114
|
-
|
94
|
+
# @override
|
95
|
+
#: -> (Interface::SemanticTokens | Interface::SemanticTokensDelta)
|
115
96
|
def perform
|
116
97
|
previous_tokens = @document.semantic_tokens
|
117
98
|
tokens = @response_builder.response
|
@@ -7,17 +7,16 @@ module RubyLsp
|
|
7
7
|
# request](https://microsoft.github.io/language-server-protocol/specification#requestMessage) that displays the AST
|
8
8
|
# for the current document or for the current selection in a new tab.
|
9
9
|
class ShowSyntaxTree < Request
|
10
|
-
|
11
|
-
|
12
|
-
sig { params(document: RubyDocument, range: T.nilable(T::Hash[Symbol, T.untyped])).void }
|
10
|
+
#: (RubyDocument document, Hash[Symbol, untyped]? range) -> void
|
13
11
|
def initialize(document, range)
|
14
12
|
super()
|
15
13
|
@document = document
|
16
14
|
@range = range
|
17
|
-
@tree =
|
15
|
+
@tree = document.parse_result.value #: Prism::ProgramNode
|
18
16
|
end
|
19
17
|
|
20
|
-
|
18
|
+
# @override
|
19
|
+
#: -> String
|
21
20
|
def perform
|
22
21
|
return ast_for_range if @range
|
23
22
|
|
@@ -28,7 +27,7 @@ module RubyLsp
|
|
28
27
|
|
29
28
|
private
|
30
29
|
|
31
|
-
|
30
|
+
#: -> String
|
32
31
|
def ast_for_range
|
33
32
|
range = T.must(@range)
|
34
33
|
start_char, end_char = @document.find_index_by_position(range[:start], range[:end])
|