Navigation Menu

Skip to content

Commit

Permalink
Remove feature checking for Class#descendants
Browse files Browse the repository at this point in the history
Ref: https://bugs.ruby-lang.org/issues/14394#note-38

Based on Matz's last comment, it's not so clear whether `Class#descendants`
will come back in the same form or at all. So let's not assume anything.
  • Loading branch information
byroot committed Dec 22, 2021
1 parent 4fd5113 commit 3438e76
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 35 deletions.
44 changes: 21 additions & 23 deletions activesupport/lib/active_support/core_ext/class/subclasses.rb
Expand Up @@ -3,29 +3,27 @@
require "active_support/ruby_features"

class Class
unless ActiveSupport::RubyFeatures::CLASS_DESCENDANTS
if ActiveSupport::RubyFeatures::CLASS_SUBCLASSES
def descendants
subclasses.concat(subclasses.flat_map(&:descendants))
end
else
# Returns an array with all classes that are < than its receiver.
#
# class C; end
# C.descendants # => []
#
# class B < C; end
# C.descendants # => [B]
#
# class A < B; end
# C.descendants # => [B, A]
#
# class D < C; end
# C.descendants # => [B, A, D]
def descendants
ObjectSpace.each_object(singleton_class).reject do |k|
k.singleton_class? || k == self
end
if ActiveSupport::RubyFeatures::CLASS_SUBCLASSES
def descendants
subclasses.concat(subclasses.flat_map(&:descendants))
end
else
# Returns an array with all classes that are < than its receiver.
#
# class C; end
# C.descendants # => []
#
# class B < C; end
# C.descendants # => [B]
#
# class A < B; end
# C.descendants # => [B, A]
#
# class D < C; end
# C.descendants # => [B, A, D]
def descendants
ObjectSpace.each_object(singleton_class).reject do |k|
k.singleton_class? || k == self
end
end
end
Expand Down
13 changes: 2 additions & 11 deletions activesupport/lib/active_support/descendants_tracker.rb
Expand Up @@ -51,7 +51,6 @@ def disable_clear! # :nodoc:
unless @clear_disabled
@clear_disabled = true
remove_method(:subclasses)
remove_method(:descendants) if RubyFeatures::CLASS_DESCENDANTS
@@excluded_descendants = nil
end
end
Expand Down Expand Up @@ -86,16 +85,8 @@ def subclasses
subclasses
end

if RubyFeatures::CLASS_DESCENDANTS
def descendants
descendants = super
descendants.reject! { |d| @@excluded_descendants[d] }
descendants
end
else
def descendants
subclasses.concat(subclasses.flat_map(&:descendants))
end
def descendants
subclasses.concat(subclasses.flat_map(&:descendants))
end

def direct_descendants
Expand Down
1 change: 0 additions & 1 deletion activesupport/lib/active_support/ruby_features.rb
Expand Up @@ -3,6 +3,5 @@
module ActiveSupport
module RubyFeatures # :nodoc:
CLASS_SUBCLASSES = Class.method_defined?(:subclasses) # RUBY_VERSION >= "3.1"
CLASS_DESCENDANTS = Class.method_defined?(:descendants)
end
end

0 comments on commit 3438e76

Please sign in to comment.