From b7b891f9c49aae5fd80fb0a97838a089b9b1e0c1 Mon Sep 17 00:00:00 2001 From: Alexander Momchilov Date: Mon, 6 Apr 2026 13:21:39 -0400 Subject: [PATCH] Handle `initailize_(copy|dup|clone)` --- lib/spoom/deadcode/plugins/ruby.rb | 6 +++++ test/spoom/deadcode/plugins/ruby_test.rb | 32 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/spoom/deadcode/plugins/ruby.rb b/lib/spoom/deadcode/plugins/ruby.rb index 75050c2c..da08143d 100644 --- a/lib/spoom/deadcode/plugins/ruby.rb +++ b/lib/spoom/deadcode/plugins/ruby.rb @@ -33,6 +33,12 @@ def on_send(send) if last_arg.is_a?(Prism::SymbolNode) || last_arg.is_a?(Prism::StringNode) @index.reference_method(last_arg.unescaped, send.location) end + when "dup" + @index.reference_method("initialize_dup", send.location) + @index.reference_method("initialize_copy", send.location) + when "clone" + @index.reference_method("initialize_clone", send.location) + @index.reference_method("initialize_copy", send.location) when "method" arg = send.args.first @index.reference_method(arg.unescaped, send.location) if arg.is_a?(Prism::SymbolNode) diff --git a/test/spoom/deadcode/plugins/ruby_test.rb b/test/spoom/deadcode/plugins/ruby_test.rb index 80724146..97bbe823 100644 --- a/test/spoom/deadcode/plugins/ruby_test.rb +++ b/test/spoom/deadcode/plugins/ruby_test.rb @@ -163,6 +163,38 @@ def test_alive_constants_with_const_source_location assert_dead(index, "DEAD") end + def test_alive_initialize_copy_with_dup + @project.write!("foo.rb", <<~RB) + def initialize_copy(source); end # called by both `#dup` and `#clone` + def initialize_dup(source); end # only called by `#dup` + + def initialize_clone(source); end # dead + + obj.dup + RB + + index = index_with_plugins + assert_alive(index, "initialize_copy") + assert_alive(index, "initialize_dup") + assert_dead(index, "initialize_clone") + end + + def test_alive_initialize_copy_with_clone + @project.write!("foo.rb", <<~RB) + def initialize_copy(source); end # called by both `#dup` and `#clone` + def initialize_clone(source); end # only called by `#clone` + + def initialize_dup(source); end # dead + + obj.clone + RB + + index = index_with_plugins + assert_alive(index, "initialize_copy") + assert_alive(index, "initialize_clone") + assert_dead(index, "initialize_dup") + end + def test_alive_methods_with_method @project.write!("foo.rb", <<~RB) def alive1; end