From d8dad02f0872cd9044694042e99e24c03e264ae5 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Thu, 9 Jun 2022 14:07:18 +0300 Subject: [PATCH] FIR: Fix internal error on SAM with not-computed return type ^KT-52691 Fixed --- ...isCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ .../FirOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...ndDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../fir/backend/generators/AdapterGenerator.kt | 3 ++- .../kotlin/fir/resolve/calls/Arguments.kt | 6 ++++-- .../tests/samConversions/implicitReturnType.kt | 17 +++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/samConversions/implicitReturnType.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 7e14c5aa505..49a09dee1a1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -26714,6 +26714,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/samConversions/GenericSubstitutionKT.kt"); } + @Test + @TestMetadata("implicitReturnType.kt") + public void testImplicitReturnType() throws Exception { + runTest("compiler/testData/diagnostics/tests/samConversions/implicitReturnType.kt"); + } + @Test @TestMetadata("javaMemberAgainstExtension.kt") public void testJavaMemberAgainstExtension() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 205b60fa81f..1afd739b340 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -26714,6 +26714,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/samConversions/GenericSubstitutionKT.kt"); } + @Test + @TestMetadata("implicitReturnType.kt") + public void testImplicitReturnType() throws Exception { + runTest("compiler/testData/diagnostics/tests/samConversions/implicitReturnType.kt"); + } + @Test @TestMetadata("javaMemberAgainstExtension.kt") public void testJavaMemberAgainstExtension() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 7b2a8574079..600cb953f82 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -26714,6 +26714,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/samConversions/GenericSubstitutionKT.kt"); } + @Test + @TestMetadata("implicitReturnType.kt") + public void testImplicitReturnType() throws Exception { + runTest("compiler/testData/diagnostics/tests/samConversions/implicitReturnType.kt"); + } + @Test @TestMetadata("javaMemberAgainstExtension.kt") public void testJavaMemberAgainstExtension() throws Exception { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt index 7c19df91eb1..3d26ed08bd0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.isFunctional import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX @@ -481,7 +482,7 @@ internal class AdapterGenerator( } // On the other hand, the actual type should be either a functional type or a subtype of a class that has a contributed `invoke`. val expectedFunctionType = getFunctionTypeForPossibleSamType(parameter.returnTypeRef.coneType) - return argument.isFunctional(session, scopeSession, expectedFunctionType) + return argument.isFunctional(session, scopeSession, expectedFunctionType, ReturnTypeCalculatorForFullBodyResolve) } internal fun getFunctionTypeForPossibleSamType(parameterType: ConeKotlinType): ConeKotlinType? { 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 d99f991c39c..6ddd4b1cc5c 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 @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.createFunctionalType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.inference.preprocessCallableReference import org.jetbrains.kotlin.fir.resolve.inference.preprocessLambdaArgument +import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolvedTypeDeclaration import org.jetbrains.kotlin.fir.returnExpressions @@ -508,7 +509,7 @@ private fun Candidate.getExpectedTypeWithSAMConversion( val (_, expectedFunctionType) = context.bodyResolveComponents.samResolver.getSamInfoForPossibleSamType(candidateExpectedType) ?: return null - return runIf(argument.isFunctional(session, scopeSession, expectedFunctionType)) { + return runIf(argument.isFunctional(session, scopeSession, expectedFunctionType, context.returnTypeCalculator)) { usesSAM = true expectedFunctionType } @@ -518,6 +519,7 @@ fun FirExpression.isFunctional( session: FirSession, scopeSession: ScopeSession, expectedFunctionType: ConeKotlinType?, + returnTypeCalculator: ReturnTypeCalculator, ): Boolean { when (unwrapArgument()) { is FirAnonymousFunctionExpression, is FirCallableReferenceAccess -> return true @@ -544,7 +546,7 @@ fun FirExpression.isFunctional( errorTypesEqualToAnything = false, stubTypesEqualToAnything = true ), - invokeSymbol.fir.returnTypeRef.coneType, + returnTypeCalculator.tryCalculateReturnType(invokeSymbol.fir).type, expectedReturnType, isFromNullabilityConstraint = false ) diff --git a/compiler/testData/diagnostics/tests/samConversions/implicitReturnType.kt b/compiler/testData/diagnostics/tests/samConversions/implicitReturnType.kt new file mode 100644 index 00000000000..906bdaef3af --- /dev/null +++ b/compiler/testData/diagnostics/tests/samConversions/implicitReturnType.kt @@ -0,0 +1,17 @@ +// FIR_IDENTICAL +// SKIP_TXT +// ISSUE: KT-52691 + +fun test() = compose(C1()) + +class C1 : FunInterface { + override fun invoke() = C2()() +} + +class C2 : FunInterface { + override fun invoke() {} +} + +fun interface FunInterface : () -> Unit + +fun compose(funInterfaces: FunInterface) = funInterfaces diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index d05c405971a..7337e3d46c5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -26726,6 +26726,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/samConversions/GenericSubstitutionKT.kt"); } + @Test + @TestMetadata("implicitReturnType.kt") + public void testImplicitReturnType() throws Exception { + runTest("compiler/testData/diagnostics/tests/samConversions/implicitReturnType.kt"); + } + @Test @TestMetadata("javaMemberAgainstExtension.kt") public void testJavaMemberAgainstExtension() throws Exception {