Skip to content

Commit c0b8aa1

Browse files
authored
Return semantic tokens for local vars shadowed by parameters (#2509)
1 parent 831f5b9 commit c0b8aa1

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

lib/ruby_lsp/listeners/semantic_highlighting.rb

+28
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def initialize(dispatcher, response_builder)
4141
:on_block_node_leave,
4242
:on_self_node_enter,
4343
:on_module_node_enter,
44+
:on_local_variable_write_node_enter,
4445
:on_local_variable_read_node_enter,
4546
:on_block_parameter_node_enter,
4647
:on_required_keyword_parameter_node_enter,
@@ -49,6 +50,9 @@ def initialize(dispatcher, response_builder)
4950
:on_optional_parameter_node_enter,
5051
:on_required_parameter_node_enter,
5152
:on_rest_parameter_node_enter,
53+
:on_local_variable_and_write_node_enter,
54+
:on_local_variable_operator_write_node_enter,
55+
:on_local_variable_or_write_node_enter,
5256
:on_local_variable_target_node_enter,
5357
:on_block_local_variable_node_enter,
5458
:on_match_write_node_enter,
@@ -164,6 +168,12 @@ def on_self_node_enter(node)
164168
@response_builder.add_token(node.location, :variable, [:default_library])
165169
end
166170

171+
sig { params(node: Prism::LocalVariableWriteNode).void }
172+
def on_local_variable_write_node_enter(node)
173+
type = @current_scope.type_for(node.name)
174+
@response_builder.add_token(node.name_loc, type) if type == :parameter
175+
end
176+
167177
sig { params(node: Prism::LocalVariableReadNode).void }
168178
def on_local_variable_read_node_enter(node)
169179
return if @inside_implicit_node
@@ -177,6 +187,24 @@ def on_local_variable_read_node_enter(node)
177187
@response_builder.add_token(node.location, @current_scope.type_for(node.name))
178188
end
179189

190+
sig { params(node: Prism::LocalVariableAndWriteNode).void }
191+
def on_local_variable_and_write_node_enter(node)
192+
type = @current_scope.type_for(node.name)
193+
@response_builder.add_token(node.name_loc, type) if type == :parameter
194+
end
195+
196+
sig { params(node: Prism::LocalVariableOperatorWriteNode).void }
197+
def on_local_variable_operator_write_node_enter(node)
198+
type = @current_scope.type_for(node.name)
199+
@response_builder.add_token(node.name_loc, type) if type == :parameter
200+
end
201+
202+
sig { params(node: Prism::LocalVariableOrWriteNode).void }
203+
def on_local_variable_or_write_node_enter(node)
204+
type = @current_scope.type_for(node.name)
205+
@response_builder.add_token(node.name_loc, type) if type == :parameter
206+
end
207+
180208
sig { params(node: Prism::LocalVariableTargetNode).void }
181209
def on_local_variable_target_node_enter(node)
182210
# If we're inside a regex capture, Prism will add LocalVariableTarget nodes for each captured variable.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"result": [
3+
{
4+
"delta_line": 1,
5+
"delta_start_char": 2,
6+
"length": 1,
7+
"token_type": 7,
8+
"token_modifiers": 0
9+
},
10+
{
11+
"delta_line": 1,
12+
"delta_start_char": 2,
13+
"length": 1,
14+
"token_type": 7,
15+
"token_modifiers": 0
16+
},
17+
{
18+
"delta_line": 1,
19+
"delta_start_char": 2,
20+
"length": 1,
21+
"token_type": 7,
22+
"token_modifiers": 0
23+
},
24+
{
25+
"delta_line": 1,
26+
"delta_start_char": 2,
27+
"length": 1,
28+
"token_type": 7,
29+
"token_modifiers": 0
30+
}
31+
]
32+
}
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
def foo(a, b, c, d)
2+
a = 123
3+
b &&= 123
4+
c += 123
5+
d ||= 123
6+
end

0 commit comments

Comments
 (0)