diff --git a/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb b/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb index 66a962cad..20486512e 100644 --- a/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +++ b/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb @@ -65,6 +65,11 @@ def initialize(index, dispatcher, parse_result, file_path, collect_comments: fal :on_constant_or_write_node_enter, :on_constant_and_write_node_enter, :on_constant_operator_write_node_enter, + :on_global_variable_and_write_node_enter, + :on_global_variable_operator_write_node_enter, + :on_global_variable_or_write_node_enter, + :on_global_variable_target_node_enter, + :on_global_variable_write_node_enter, :on_instance_variable_write_node_enter, :on_instance_variable_and_write_node_enter, :on_instance_variable_operator_write_node_enter, @@ -382,6 +387,31 @@ def on_def_node_leave(node) end end + sig { params(node: Prism::GlobalVariableAndWriteNode).void } + def on_global_variable_and_write_node_enter(node) + handle_global_variable(node, node.name_loc) + end + + sig { params(node: Prism::GlobalVariableOperatorWriteNode).void } + def on_global_variable_operator_write_node_enter(node) + handle_global_variable(node, node.name_loc) + end + + sig { params(node: Prism::GlobalVariableOrWriteNode).void } + def on_global_variable_or_write_node_enter(node) + handle_global_variable(node, node.name_loc) + end + + sig { params(node: Prism::GlobalVariableTargetNode).void } + def on_global_variable_target_node_enter(node) + handle_global_variable(node, node.location) + end + + sig { params(node: Prism::GlobalVariableWriteNode).void } + def on_global_variable_write_node_enter(node) + handle_global_variable(node, node.name_loc) + end + sig { params(node: Prism::InstanceVariableWriteNode).void } def on_instance_variable_write_node_enter(node) handle_instance_variable(node, node.name_loc) @@ -426,6 +456,31 @@ def on_alias_method_node_enter(node) private + sig do + params( + node: T.any( + Prism::GlobalVariableAndWriteNode, + Prism::GlobalVariableOperatorWriteNode, + Prism::GlobalVariableOrWriteNode, + Prism::GlobalVariableTargetNode, + Prism::GlobalVariableWriteNode, + ), + loc: Prism::Location, + ).void + end + def handle_global_variable(node, loc) + name = node.name.to_s + comments = collect_comments(node) + + @index.add(Entry::GlobalVariable.new( + name, + @file_path, + loc, + comments, + @index.configuration.encoding, + )) + end + sig do params( node: T.any( diff --git a/lib/ruby_indexer/test/global_variable_test.rb b/lib/ruby_indexer/test/global_variable_test.rb new file mode 100644 index 000000000..a4fa5e9a8 --- /dev/null +++ b/lib/ruby_indexer/test/global_variable_test.rb @@ -0,0 +1,49 @@ +# typed: true +# frozen_string_literal: true + +require_relative "test_case" + +module RubyIndexer + class GlobalVariableTest < TestCase + def test_global_variable_and_write + index(<<~RUBY) + $foo &&= 1 + RUBY + + assert_entry("$foo", Entry::GlobalVariable, "/fake/path/foo.rb:0-0:0-4") + end + + def test_global_variable_operator_write + index(<<~RUBY) + $foo += 1 + RUBY + + assert_entry("$foo", Entry::GlobalVariable, "/fake/path/foo.rb:0-0:0-4") + end + + def test_global_variable_or_write + index(<<~RUBY) + $foo ||= 1 + RUBY + + assert_entry("$foo", Entry::GlobalVariable, "/fake/path/foo.rb:0-0:0-4") + end + + def test_global_variable_target_node + index(<<~RUBY) + $foo, $bar = 1 + RUBY + + assert_entry("$foo", Entry::GlobalVariable, "/fake/path/foo.rb:0-0:0-4") + assert_entry("$bar", Entry::GlobalVariable, "/fake/path/foo.rb:0-6:0-10") + end + + def test_global_variable_write + index(<<~RUBY) + $foo = 1 + RUBY + + assert_entry("$foo", Entry::GlobalVariable, "/fake/path/foo.rb:0-0:0-4") + end + end +end