KT-13342 Unqualified super call should not resolve to a method of supertype overridden in another supertype
This commit is contained in:
+20
-8
@@ -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> =
|
||||
|
||||
Reference in New Issue
Block a user