Fix accidental overrides computation

Consider the whole overridden tree instead of only direct overridden

 #KT-14146 Fixed
This commit is contained in:
Denis Zharkov
2016-10-04 14:14:58 +03:00
parent aca05003a9
commit a4978c794f
5 changed files with 57 additions and 7 deletions
@@ -237,16 +237,17 @@ fun CallableMemberDescriptor.overriddenTreeAsSequence(useOriginal: Boolean): Seq
sequenceOf(this) + overriddenDescriptors.asSequence().flatMap { it.overriddenTreeAsSequence(useOriginal) }
}
fun CallableDescriptor.overriddenTreeUniqueAsSequence(useOriginal: Boolean): Sequence<CallableDescriptor> {
val set = hashSetOf<CallableDescriptor>()
fun <D : CallableDescriptor> D.overriddenTreeUniqueAsSequence(useOriginal: Boolean): Sequence<D> {
val set = hashSetOf<D>()
fun CallableDescriptor.doBuildOverriddenTreeAsSequence(): Sequence<CallableDescriptor> {
return with(if (useOriginal) original else this) {
@Suppress("UNCHECKED_CAST")
fun D.doBuildOverriddenTreeAsSequence(): Sequence<D> {
return with(if (useOriginal) original as D else this) {
if (original in set)
emptySequence()
else {
set += original
sequenceOf(this) + overriddenDescriptors.asSequence().flatMap { it.doBuildOverriddenTreeAsSequence() }
set += original as D
sequenceOf(this) + (overriddenDescriptors as Collection<D>).asSequence().flatMap { it.doBuildOverriddenTreeAsSequence() }
}
}
}