Fix bug with auto replacing components in compositor #1711
Merged
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.
This was last known to be working with 5995568 at the time of commit, but now doesn't work with latest rust stable.
The issue probably stems from using
std::any::type_name()
for finding a component in the compositor, for which the docs explicitly warn against considering it as a unique identifier for types.replace_or_push()
takes a boxedComponent
and passes it tofind_id()
which compares this with a bare Component.type_name()
returnsBox<T>
for the former andT
for latter and we have a false negative. This has been solved by using a generics instead of trait objects to pass in aT: Component
and then use it for comparison.I'm not exactly sure how this worked fine at the time of commit of 5995568; maybe the internal implementation of
type_name()
changed to properly indicate indirection with Box. Ideally we can use some other mechanism which doesn't depend ontype_name()
.