diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt index b97a7f46297..a021a425218 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt @@ -355,28 +355,50 @@ class FirStatusResolver( } private fun contradictsWith(type: ConeKotlinType, requiredVariance: Variance): Boolean { - if (type is ConeTypeParameterType) { - return !type.lookupTag.typeParameterSymbol.fir.variance.allowsPosition(requiredVariance) - } - // TODO: handle other types (like flexible, DNN, captured, ...) KT-62134 - if (type is ConeClassLikeType) { - val classLike = type.lookupTag.toSymbol(session)?.fir - for ((index, argument) in type.typeArguments.withIndex()) { - val typeParameterRef = classLike?.typeParameters?.getOrNull(index) - if (typeParameterRef !is FirTypeParameter) continue - val requiredVarianceForArgument = when ( - EnrichedProjectionKind.getEffectiveProjectionKind(typeParameterRef.variance, argument.variance) - ) { - EnrichedProjectionKind.OUT -> requiredVariance - EnrichedProjectionKind.IN -> requiredVariance.opposite() - EnrichedProjectionKind.INV -> Variance.INVARIANT - EnrichedProjectionKind.STAR -> continue // CONFLICTING_PROJECTION error was reported + when (type) { + is ConeLookupTagBasedType -> { + if (type is ConeTypeParameterType) { + return !type.lookupTag.typeParameterSymbol.fir.variance.allowsPosition(requiredVariance) } - val argType = argument.type ?: continue - if (contradictsWith(argType, requiredVarianceForArgument)) { - return true + if (type is ConeClassLikeType) { + val classLike = type.lookupTag.toSymbol(session)?.fir + for ((index, argument) in type.typeArguments.withIndex()) { + val typeParameterRef = classLike?.typeParameters?.getOrNull(index) + if (typeParameterRef !is FirTypeParameter) continue + val requiredVarianceForArgument = when ( + EnrichedProjectionKind.getEffectiveProjectionKind(typeParameterRef.variance, argument.variance) + ) { + EnrichedProjectionKind.OUT -> requiredVariance + EnrichedProjectionKind.IN -> requiredVariance.opposite() + EnrichedProjectionKind.INV -> Variance.INVARIANT + EnrichedProjectionKind.STAR -> continue // CONFLICTING_PROJECTION error was reported + } + val argType = argument.type ?: continue + if (contradictsWith(argType, requiredVarianceForArgument)) { + return true + } + } } } + is ConeFlexibleType -> { + return contradictsWith(type.lowerBound, requiredVariance) + } + is ConeDefinitelyNotNullType -> { + return contradictsWith(type.original, requiredVariance) + } + is ConeIntersectionType -> { + return type.intersectedTypes.any { contradictsWith(it, requiredVariance) } + } + is ConeCapturedType -> { + // Looks like not possible here + return false + } + is ConeIntegerConstantOperatorType, + is ConeIntegerLiteralConstantType, + is ConeStubTypeForChainInference, + is ConeStubTypeForTypeVariableInSubtyping, + is ConeTypeVariableType, + -> return false } return false } diff --git a/compiler/testData/diagnostics/tests/visibility/privateToThisExotic.fir.kt b/compiler/testData/diagnostics/tests/visibility/privateToThisExotic.fir.kt index 6ee0febe08e..9f4509ba5db 100644 --- a/compiler/testData/diagnostics/tests/visibility/privateToThisExotic.fir.kt +++ b/compiler/testData/diagnostics/tests/visibility/privateToThisExotic.fir.kt @@ -19,7 +19,8 @@ class Foo : Base<T>() { private val flex = foo() fun bar(f: Foo) { - val dnn = f.dnn + val dnn = f.dnn + // This case (and any other with non-denotable type) requires KT-55446 to be fixed val flex = f.flex } } diff --git a/compiler/testData/diagnostics/tests/visibility/privateToThisExotic.kt b/compiler/testData/diagnostics/tests/visibility/privateToThisExotic.kt index 0123eb3b9ee..7e338f963d4 100644 --- a/compiler/testData/diagnostics/tests/visibility/privateToThisExotic.kt +++ b/compiler/testData/diagnostics/tests/visibility/privateToThisExotic.kt @@ -20,6 +20,7 @@ class Foo : Base<T>() { fun bar(f: Foo) { val dnn = f.dnn + // This case (and any other with non-denotable type) requires KT-55446 to be fixed val flex = f.flex } }