Fix Reflection#inherited_ancestors_of
method for modules
#1530
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
As reported by @searls on the Sorbet Slack, Tapioca would remove
include Kernel
lines from a module when generating the RBI file for the gem.Implementation
It turns out the problem stems from the implementation of
Reflection#inherited_ancestors_of
method doing the wrong thing for modules. For classes we look at the ancestors of the class' superclass (orObject
if no explicit superclass is set), but for modules we used to look at the ancestors ofModule
. However, a module is an instance ofModule
, so the ancestors ofModule
would not be in the original module's ancestor list anyway. What we needed to check was the ancestors of a newly createdModule
instance, and return those.This ends up affecting only
Kernel
mixed into a module, sinceModule
's ancestors only hasKernel
as a mixin, all the other ancestors are classes likeObject
andBasicObject
. That's probably why this behaviour was not caught earlier.Tests
Added a test for module mixins that exhibits the wrong behaviour and passes after the change.