@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf
38
38
import org.jetbrains.kotlin.types.KotlinType
39
39
import org.jetbrains.kotlin.types.TypeUtils
40
40
import org.jetbrains.kotlin.types.typeUtil.supertypes
41
+ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
41
42
import java.util.concurrent.TimeUnit
42
43
43
44
private const val MAX_COMPLETION_ITEMS = 50
@@ -430,12 +431,18 @@ private fun isParentClass(declaration: DeclarationDescriptor): ClassDescriptor?
430
431
431
432
private fun isExtensionFor (type : KotlinType , extensionFunction : CallableDescriptor ): Boolean {
432
433
val receiverType = extensionFunction.extensionReceiverParameter?.type ? : return false
433
- val receiverClass = TypeUtils .getClassDescriptor(receiverType) ? : return false
434
- fun equalsReceiver (type : KotlinType ) = TypeUtils .getClassDescriptor(type)?.fqNameSafe == receiverClass.fqNameSafe
435
- if (equalsReceiver(type)) return true
436
- else return type.supertypes().any(::equalsReceiver)
434
+ return KotlinTypeChecker .DEFAULT .isSubtypeOf(type, receiverType)
435
+ || (TypeUtils .getTypeParameterDescriptorOrNull(receiverType)?.isGenericExtensionFor(type) ? : false )
437
436
}
438
437
438
+ private fun ClassDescriptor.isClassExtensionFor (type : KotlinType ): Boolean {
439
+ fun equalsReceiver (type : KotlinType ) = TypeUtils .getClassDescriptor(type)?.fqNameSafe == fqNameSafe
440
+ return equalsReceiver(type) || type.supertypes().any(::equalsReceiver)
441
+ }
442
+
443
+ private fun TypeParameterDescriptor.isGenericExtensionFor (type : KotlinType ): Boolean =
444
+ upperBounds.all { KotlinTypeChecker .DEFAULT .isSubtypeOf(type, it) }
445
+
439
446
private val loggedHidden = CacheBuilder .newBuilder().expireAfterWrite(1 , TimeUnit .MINUTES ).build<Pair <Name , Name >, Unit > ()
440
447
441
448
private fun logHidden (target : DeclarationDescriptor , from : DeclarationDescriptor ) {
0 commit comments