From 47a4bd17014f82621906d23793c505a8a0a4e49e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 21 Oct 2020 09:10:21 +0300 Subject: [PATCH] [FIR Java] Look into type arguments during dependent type parameter search --- .../fir/java/scopes/JavaOverrideChecker.kt | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt index 863783571f1..3c5e543a48d 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt @@ -75,7 +75,12 @@ class JavaOverrideChecker internal constructor( } private fun FirTypeRef?.isTypeParameterDependent(): Boolean = - this is FirResolvedTypeRef && type.lowerBoundIfFlexible() is ConeTypeParameterType + this is FirResolvedTypeRef && type.lowerBoundIfFlexible().isTypeParameterDependent() + + private fun ConeKotlinType.isTypeParameterDependent(): Boolean = + this is ConeTypeParameterType || this is ConeClassLikeType && typeArguments.any { argument -> + argument is ConeKotlinTypeProjection && argument.type.isTypeParameterDependent() + } private fun FirCallableMemberDeclaration<*>.isTypeParameterDependent(): Boolean = typeParameters.isNotEmpty() || returnTypeRef.isTypeParameterDependent() || @@ -84,8 +89,21 @@ class JavaOverrideChecker internal constructor( private fun FirTypeRef.extractTypeParametersTo(result: MutableCollection) { if (this is FirResolvedTypeRef) { - (type.lowerBoundIfFlexible() as? ConeTypeParameterType)?.lookupTag?.typeParameterSymbol?.fir?.let { - result += it + type.lowerBoundIfFlexible().extractTypeParametersTo(result) + } + } + + private fun ConeKotlinType.extractTypeParametersTo(result: MutableCollection) { + when (this) { + is ConeTypeParameterType -> { + result += lookupTag.typeParameterSymbol.fir + } + is ConeClassLikeType -> typeArguments.forEach { + if (it is ConeKotlinTypeProjection) { + it.type.extractTypeParametersTo(result) + } + } + else -> { } } }