From 39676994309a350c28c3759aa7beef42639f3948 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Fri, 22 Apr 2022 12:12:51 +0300 Subject: [PATCH] FIR: Fix applying SAM conversion in case of DNN types See org.jetbrains.kotlin.test.runners.codegen.FirBlackBoxCodegenTestGenerated.Sam.testPassSubtypeOfFunctionSamConversion ^KT-52152 Related --- .../src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt | 7 +++++++ .../org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt index 1c211b3caac..250941f8890 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeUtils.kt @@ -65,6 +65,13 @@ fun ConeKotlinType.lowerBoundIfFlexible(): ConeSimpleKotlinType { } } +fun ConeKotlinType.originalIfDefinitelyNotNullable(): ConeKotlinType { + return when (this) { + is ConeDefinitelyNotNullType -> original + else -> this + } +} + fun ConeIntersectionType.withAlternative(alternativeType: ConeKotlinType): ConeIntersectionType { return ConeIntersectionType(intersectedTypes, alternativeType) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt index 0b47d97e587..1d61383cb85 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.lookupTracker @@ -540,7 +540,7 @@ fun FirExpression.isFunctional( // Make sure the contributed `invoke` is indeed a wanted functional type by checking if types are compatible. val expectedReturnType = classLikeExpectedFunctionType.returnType(session).lowerBoundIfFlexible() val returnTypeCompatible = - expectedReturnType is ConeTypeParameterType || + expectedReturnType.originalIfDefinitelyNotNullable() is ConeTypeParameterType || AbstractTypeChecker.isSubtypeOf( session.typeContext.newTypeCheckerState( errorTypesEqualToAnything = false, @@ -560,7 +560,7 @@ fun FirExpression.isFunctional( invokeSymbol.fir.valueParameters.zip(classLikeExpectedFunctionType.valueParameterTypesIncludingReceiver(session)) return parameterPairs.all { (invokeParameter, expectedParameter) -> val expectedParameterType = expectedParameter.lowerBoundIfFlexible() - expectedParameterType is ConeTypeParameterType || + expectedParameterType.originalIfDefinitelyNotNullable() is ConeTypeParameterType || AbstractTypeChecker.isSubtypeOf( session.typeContext.newTypeCheckerState( errorTypesEqualToAnything = false,