KT-13342 Unqualified super call should not resolve to a method of supertype overridden in another supertype

This commit is contained in:
Dmitry Petrov
2017-03-07 16:13:29 +03:00
parent 954c1d853d
commit 9a2c9ed30e
4 changed files with 94 additions and 8 deletions
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.psi.KtSimpleNameExpression
import org.jetbrains.kotlin.psi.KtSuperExpression
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.utils.addToStdlib.singletonList
@@ -121,25 +122,36 @@ private fun resolveSupertypesByPropertyName(supertypes: Collection<KotlinType>,
private inline fun resolveSupertypesByMembers(
supertypes: Collection<KotlinType>,
allowArbitraryMembers: Boolean,
allowNonConcreteMembers: Boolean,
getMembers: (KotlinType) -> Collection<MemberDescriptor>
): Collection<KotlinType> {
val typesWithConcreteMembers = SmartList<KotlinType>()
val typesWithArbitraryMembers = SmartList<KotlinType>()
val typesWithNonConcreteMembers = SmartList<KotlinType>()
for (supertype in supertypes) {
val members = getMembers(supertype)
if (members.isNotEmpty()) {
typesWithArbitraryMembers.add(supertype)
if (members.any { isConcreteMember(supertype, it) }) {
if (members.any { isConcreteMember(supertype, it) })
typesWithConcreteMembers.add(supertype)
}
else
typesWithNonConcreteMembers.add(supertype)
}
}
return if (typesWithConcreteMembers.isNotEmpty()) typesWithConcreteMembers
else if (allowArbitraryMembers) typesWithArbitraryMembers
else emptyList<KotlinType>()
typesWithConcreteMembers.removeAll { typeWithConcreteMember ->
typesWithNonConcreteMembers.any { typeWithNonConcreteMember ->
KotlinTypeChecker.DEFAULT.isSubtypeOf(typeWithNonConcreteMember, typeWithConcreteMember)
}
}
return when {
typesWithConcreteMembers.isNotEmpty() ->
typesWithConcreteMembers
allowNonConcreteMembers ->
typesWithNonConcreteMembers
else ->
emptyList()
}
}
private fun getFunctionMembers(type: KotlinType, name: Name, location: LookupLocation): Collection<MemberDescriptor> =