From 1f9543f6a8a83883056ec801cc842329c756f549 Mon Sep 17 00:00:00 2001 From: Jesse Johnson Date: Mon, 26 Jan 2026 13:25:07 -0800 Subject: [PATCH] Update translation of RBS abstract methods to conditionally call super --- .../sorbet/translate/sorbet_sigs_to_rbs_comments.rb | 6 ++++-- rbi/spoom.rbi | 2 ++ test/spoom/cli/srb/sigs_test.rb | 2 +- .../translate/sorbet_sigs_to_rbs_comments_test.rb | 10 +++++----- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb b/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb index 7aa1baa0..12ae2c11 100644 --- a/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb +++ b/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb @@ -59,6 +59,8 @@ def visit_singleton_class_node(node) visit_scope(node) { super } end + ABSTRACT_METHOD_BODY = "defined?(super) ? super : raise(NotImplementedError, \"Abstract method called\")" + # @override #: (Prism::DefNode) -> void def visit_def_node(node) @@ -87,9 +89,9 @@ def visit_def_node(node) node.location.end_offset - 1, if node.name.end_with?("=") indent = " " * node.location.start_column - "\n#{indent} raise NotImplementedError, \"Abstract method called\"\n#{indent}end" + "\n#{indent} #{ABSTRACT_METHOD_BODY}\n#{indent}end" else - " = raise NotImplementedError, \"Abstract method called\"" + " = #{ABSTRACT_METHOD_BODY}" end, ) end diff --git a/rbi/spoom.rbi b/rbi/spoom.rbi index 13bdac0d..631e66ac 100644 --- a/rbi/spoom.rbi +++ b/rbi/spoom.rbi @@ -3063,6 +3063,8 @@ class Spoom::Sorbet::Translate::SorbetSigsToRBSComments < ::Spoom::Sorbet::Trans def visit_sig(node); end end +Spoom::Sorbet::Translate::SorbetSigsToRBSComments::ABSTRACT_METHOD_BODY = T.let(T.unsafe(nil), String) + class Spoom::Sorbet::Translate::StripSorbetSigs < ::Spoom::Sorbet::Translate::Translator sig { override.params(node: ::Prism::CallNode).void } def visit_call_node(node); end diff --git a/test/spoom/cli/srb/sigs_test.rb b/test/spoom/cli/srb/sigs_test.rb index 63cbf94c..1e35867e 100644 --- a/test/spoom/cli/srb/sigs_test.rb +++ b/test/spoom/cli/srb/sigs_test.rb @@ -342,7 +342,7 @@ def foo; end class A # @abstract #: -> void - def foo = raise NotImplementedError, "Abstract method called" + def foo = defined?(super) ? super : raise(NotImplementedError, "Abstract method called") end RB end diff --git a/test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb b/test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb index 92619922..094fdd56 100644 --- a/test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb +++ b/test/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments_test.rb @@ -102,28 +102,28 @@ def bar=(x) class Foo # @abstract #: -> void - def foo = raise NotImplementedError, "Abstract method called" + def foo = defined?(super) ? super : raise(NotImplementedError, "Abstract method called") class Bar # @abstract #: -> void - def bar = raise NotImplementedError, "Abstract method called" + def bar = defined?(super) ? super : raise(NotImplementedError, "Abstract method called") end # @abstract #: (Integer x) -> void - def baz(x) = raise NotImplementedError, "Abstract method called" + def baz(x) = defined?(super) ? super : raise(NotImplementedError, "Abstract method called") # @abstract #: (Integer x) -> void def foo=(x) - raise NotImplementedError, "Abstract method called" + defined?(super) ? super : raise(NotImplementedError, "Abstract method called") end # @abstract #: (Integer x) -> void def bar=(x) - raise NotImplementedError, "Abstract method called" + defined?(super) ? super : raise(NotImplementedError, "Abstract method called") end end RBS