Skip to content

Commit 15841f6

Browse files
authored
Create textDocument/documentSymbol to instance variables using shorthand assignment (#2834)
* Create text/documentSymbol to instance variables using shorthand assignment * Fix rubocop error
1 parent 4d807c7 commit 15841f6

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

lib/ruby_lsp/listeners/document_symbol.rb

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ def initialize(response_builder, uri, dispatcher)
4141
:on_module_node_enter,
4242
:on_module_node_leave,
4343
:on_instance_variable_write_node_enter,
44+
:on_instance_variable_operator_write_node_enter,
45+
:on_instance_variable_or_write_node_enter,
46+
:on_instance_variable_and_write_node_enter,
4447
:on_class_variable_write_node_enter,
4548
:on_singleton_class_node_enter,
4649
:on_singleton_class_node_leave,
@@ -249,6 +252,16 @@ def on_module_node_leave(node)
249252
@response_builder.pop
250253
end
251254

255+
sig { params(node: Prism::ClassVariableWriteNode).void }
256+
def on_class_variable_write_node_enter(node)
257+
create_document_symbol(
258+
name: node.name.to_s,
259+
kind: Constant::SymbolKind::VARIABLE,
260+
range_location: node.name_loc,
261+
selection_range_location: node.name_loc,
262+
)
263+
end
264+
252265
sig { params(node: Prism::InstanceVariableWriteNode).void }
253266
def on_instance_variable_write_node_enter(node)
254267
create_document_symbol(
@@ -259,8 +272,28 @@ def on_instance_variable_write_node_enter(node)
259272
)
260273
end
261274

262-
sig { params(node: Prism::ClassVariableWriteNode).void }
263-
def on_class_variable_write_node_enter(node)
275+
sig { params(node: Prism::InstanceVariableOperatorWriteNode).void }
276+
def on_instance_variable_operator_write_node_enter(node)
277+
create_document_symbol(
278+
name: node.name.to_s,
279+
kind: Constant::SymbolKind::VARIABLE,
280+
range_location: node.name_loc,
281+
selection_range_location: node.name_loc,
282+
)
283+
end
284+
285+
sig { params(node: Prism::InstanceVariableOrWriteNode).void }
286+
def on_instance_variable_or_write_node_enter(node)
287+
create_document_symbol(
288+
name: node.name.to_s,
289+
kind: Constant::SymbolKind::VARIABLE,
290+
range_location: node.name_loc,
291+
selection_range_location: node.name_loc,
292+
)
293+
end
294+
295+
sig { params(node: Prism::InstanceVariableAndWriteNode).void }
296+
def on_instance_variable_and_write_node_enter(node)
264297
create_document_symbol(
265298
name: node.name.to_s,
266299
kind: Constant::SymbolKind::VARIABLE,

test/requests/document_symbol_expectations_test.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,32 @@
77
class DocumentSymbolExpectationsTest < ExpectationsTestRunner
88
expectations_tests RubyLsp::Requests::DocumentSymbol, "document_symbol"
99

10+
def test_instance_variable_with_shorthand_assignment
11+
source = <<~RUBY
12+
@foo = 1
13+
@bar += 2
14+
@baz -= 3
15+
@qux ||= 4
16+
@quux &&= 5
17+
RUBY
18+
uri = URI("file:///fake.rb")
19+
20+
document = RubyLsp::RubyDocument.new(source: source, version: 1, uri: uri)
21+
22+
dispatcher = Prism::Dispatcher.new
23+
listener = RubyLsp::Requests::DocumentSymbol.new(uri, dispatcher)
24+
dispatcher.dispatch(document.parse_result.value)
25+
response = listener.perform
26+
27+
assert_equal(5, response.size)
28+
29+
assert_equal("@foo", T.must(response[0]).name)
30+
assert_equal("@bar", T.must(response[1]).name)
31+
assert_equal("@baz", T.must(response[2]).name)
32+
assert_equal("@qux", T.must(response[3]).name)
33+
assert_equal("@quux", T.must(response[4]).name)
34+
end
35+
1036
def test_labels_blank_names
1137
source = <<~RUBY
1238
def

0 commit comments

Comments
 (0)