Skip to content

Commit

Permalink
Return semantic tokens for local vars shadowed by parameters (#2509)
Browse files Browse the repository at this point in the history
  • Loading branch information
vinistock committed Aug 28, 2024
1 parent 831f5b9 commit c0b8aa1
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 0 deletions.
28 changes: 28 additions & 0 deletions lib/ruby_lsp/listeners/semantic_highlighting.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ def initialize(dispatcher, response_builder)
:on_block_node_leave,
:on_self_node_enter,
:on_module_node_enter,
:on_local_variable_write_node_enter,
:on_local_variable_read_node_enter,
:on_block_parameter_node_enter,
:on_required_keyword_parameter_node_enter,
Expand All @@ -49,6 +50,9 @@ def initialize(dispatcher, response_builder)
:on_optional_parameter_node_enter,
:on_required_parameter_node_enter,
:on_rest_parameter_node_enter,
:on_local_variable_and_write_node_enter,
:on_local_variable_operator_write_node_enter,
:on_local_variable_or_write_node_enter,
:on_local_variable_target_node_enter,
:on_block_local_variable_node_enter,
:on_match_write_node_enter,
Expand Down Expand Up @@ -164,6 +168,12 @@ def on_self_node_enter(node)
@response_builder.add_token(node.location, :variable, [:default_library])
end

sig { params(node: Prism::LocalVariableWriteNode).void }
def on_local_variable_write_node_enter(node)
type = @current_scope.type_for(node.name)
@response_builder.add_token(node.name_loc, type) if type == :parameter
end

sig { params(node: Prism::LocalVariableReadNode).void }
def on_local_variable_read_node_enter(node)
return if @inside_implicit_node
Expand All @@ -177,6 +187,24 @@ def on_local_variable_read_node_enter(node)
@response_builder.add_token(node.location, @current_scope.type_for(node.name))
end

sig { params(node: Prism::LocalVariableAndWriteNode).void }
def on_local_variable_and_write_node_enter(node)
type = @current_scope.type_for(node.name)
@response_builder.add_token(node.name_loc, type) if type == :parameter
end

sig { params(node: Prism::LocalVariableOperatorWriteNode).void }
def on_local_variable_operator_write_node_enter(node)
type = @current_scope.type_for(node.name)
@response_builder.add_token(node.name_loc, type) if type == :parameter
end

sig { params(node: Prism::LocalVariableOrWriteNode).void }
def on_local_variable_or_write_node_enter(node)
type = @current_scope.type_for(node.name)
@response_builder.add_token(node.name_loc, type) if type == :parameter
end

sig { params(node: Prism::LocalVariableTargetNode).void }
def on_local_variable_target_node_enter(node)
# If we're inside a regex capture, Prism will add LocalVariableTarget nodes for each captured variable.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"result": [
{
"delta_line": 1,
"delta_start_char": 2,
"length": 1,
"token_type": 7,
"token_modifiers": 0
},
{
"delta_line": 1,
"delta_start_char": 2,
"length": 1,
"token_type": 7,
"token_modifiers": 0
},
{
"delta_line": 1,
"delta_start_char": 2,
"length": 1,
"token_type": 7,
"token_modifiers": 0
},
{
"delta_line": 1,
"delta_start_char": 2,
"length": 1,
"token_type": 7,
"token_modifiers": 0
}
]
}
6 changes: 6 additions & 0 deletions test/fixtures/vars_shadowed_by_params.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
def foo(a, b, c, d)
a = 123
b &&= 123
c += 123
d ||= 123
end

0 comments on commit c0b8aa1

Please sign in to comment.