Fix KT-10194: skip incorrect delegates.
This commit is contained in:
@@ -31,37 +31,41 @@ public object CodegenUtilKt {
|
|||||||
|
|
||||||
// class Foo : Bar by baz
|
// class Foo : Bar by baz
|
||||||
// descriptor = Foo
|
// descriptor = Foo
|
||||||
// toTrait = Bar
|
// toInterface = Bar
|
||||||
// delegateExpressionType = typeof(baz)
|
// delegateExpressionType = typeof(baz)
|
||||||
// return Map<member of Foo, corresponding member of typeOf(baz)>
|
// return Map<member of Foo, corresponding member of typeOf(baz)>
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
public fun getDelegates(
|
public fun getDelegates(
|
||||||
descriptor: ClassDescriptor,
|
descriptor: ClassDescriptor,
|
||||||
toTrait: ClassDescriptor,
|
toInterface: ClassDescriptor,
|
||||||
delegateExpressionType: KotlinType? = null
|
delegateExpressionType: KotlinType? = null
|
||||||
): Map<CallableMemberDescriptor, CallableDescriptor> {
|
): Map<CallableMemberDescriptor, CallableDescriptor> {
|
||||||
if (delegateExpressionType?.isDynamic() ?: false) return mapOf();
|
if (delegateExpressionType?.isDynamic() ?: false) return mapOf();
|
||||||
|
|
||||||
return descriptor.getDefaultType().getMemberScope().getContributedDescriptors().asSequence()
|
return descriptor.defaultType.memberScope.getContributedDescriptors().asSequence()
|
||||||
.filterIsInstance<CallableMemberDescriptor>()
|
.filterIsInstance<CallableMemberDescriptor>()
|
||||||
.filter { it.getKind() == CallableMemberDescriptor.Kind.DELEGATION }
|
.filter { it.kind == CallableMemberDescriptor.Kind.DELEGATION }
|
||||||
.asIterable()
|
.asIterable()
|
||||||
.sortedWith(MemberComparator.INSTANCE)
|
.sortedWith(MemberComparator.INSTANCE)
|
||||||
.keysToMapExceptNulls {
|
.keysToMapExceptNulls {
|
||||||
delegatingMember ->
|
delegatingMember ->
|
||||||
|
|
||||||
val actualDelegates = DescriptorUtils.getAllOverriddenDescriptors(delegatingMember)
|
val actualDelegates = DescriptorUtils.getAllOverriddenDescriptors(delegatingMember)
|
||||||
.filter { it.getContainingDeclaration() == toTrait }
|
.mapNotNull {
|
||||||
.map {
|
|
||||||
overriddenDescriptor ->
|
overriddenDescriptor ->
|
||||||
val scope = (delegateExpressionType ?: toTrait.getDefaultType()).getMemberScope()
|
if (overriddenDescriptor.containingDeclaration == toInterface) {
|
||||||
val name = overriddenDescriptor.getName()
|
val scope = (delegateExpressionType ?: toInterface.defaultType).memberScope
|
||||||
|
val name = overriddenDescriptor.name
|
||||||
|
|
||||||
// this is the actual member of delegateExpressionType that we are delegating to
|
// this is the actual member of delegateExpressionType that we are delegating to
|
||||||
(scope.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND) + scope.getContributedVariables(name, NoLookupLocation.FROM_BACKEND))
|
(scope.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND) + scope.getContributedVariables(name, NoLookupLocation.FROM_BACKEND))
|
||||||
.first {
|
.firstOrNull {
|
||||||
(listOf(it) + DescriptorUtils.getAllOverriddenDescriptors(it)).map { it.getOriginal() }.contains(overriddenDescriptor.getOriginal())
|
(listOf(it) + DescriptorUtils.getAllOverriddenDescriptors(it))
|
||||||
}
|
.map { it.original }
|
||||||
|
.contains(overriddenDescriptor.original)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else null
|
||||||
}
|
}
|
||||||
assert(actualDelegates.size() <= 1) { "Many delegates found for $delegatingMember: $actualDelegates" }
|
assert(actualDelegates.size() <= 1) { "Many delegates found for $delegatingMember: $actualDelegates" }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user