Alias direct_descendants as subclasses

This alias overrides Class#subclasses.  Thus calls to `subclasses` get a
free performance boost when the class extends DescendantsTracker.
This commit is contained in:
Jonathan Hefner 2020-06-01 19:30:50 -05:00
parent 3b953da779
commit 8f8aa857e0
2 changed files with 8 additions and 0 deletions

View File

@ -13,6 +13,7 @@ module ActiveSupport
descendants = @@direct_descendants[klass]
descendants ? descendants.to_a : []
end
alias_method :subclasses, :direct_descendants
def descendants(klass)
arr = []
@ -59,6 +60,7 @@ module ActiveSupport
def direct_descendants
DescendantsTracker.direct_descendants(self)
end
alias_method :subclasses, :direct_descendants
def descendants
DescendantsTracker.descendants(self)

View File

@ -42,6 +42,12 @@ module DescendantsTrackerTestCases
assert_equal_sets [], Child2.direct_descendants
end
def test_subclasses
[Parent, Child1, Child2].each do |klass|
assert_equal klass.direct_descendants, klass.subclasses
end
end
def test_clear
mark_as_autoloaded(*ALL) do
ActiveSupport::DescendantsTracker.clear