From aacfc31c9012d85ab1af9e2ea0ddacf1a37713c0 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Tue, 12 Sep 2023 15:10:32 +0300 Subject: [PATCH] [FIR] Resolve the continuation type inside `createSuspendView()` Normally such types are resolved during enhancement, but creating the suspend view happens before enhancement, so the type may have not been resolved. ^KT-59915 Fixed --- .../scopes/JavaClassUseSiteMemberScope.kt | 4 ++ .../suspendCovarianJavaOverride.fir.kt | 50 ------------------- .../coroutines/suspendCovarianJavaOverride.kt | 1 + .../coroutines/suspendJavaOverrides.fir.kt | 50 ------------------- .../coroutines/suspendJavaOverrides.kt | 1 + 5 files changed, 6 insertions(+), 100 deletions(-) delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendCovarianJavaOverride.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaOverrides.fir.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 6f29d945bf9..8dccda0a629 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -21,10 +21,12 @@ import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod import org.jetbrains.kotlin.fir.java.declarations.buildJavaMethodCopy import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameterCopy +import org.jetbrains.kotlin.fir.java.resolveIfJavaType import org.jetbrains.kotlin.fir.java.syntheticPropertiesStorage import org.jetbrains.kotlin.fir.java.symbols.FirJavaOverriddenSyntheticPropertySymbol import org.jetbrains.kotlin.fir.java.toConeKotlinTypeProbablyFlexible import org.jetbrains.kotlin.fir.resolve.defaultType +import org.jetbrains.kotlin.fir.resolve.providers.toSymbol import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.impl.AbstractFirUseSiteMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirTypeIntersectionScopeContext.ResultOfIntersection @@ -334,8 +336,10 @@ class JavaClassUseSiteMemberScope( private fun FirNamedFunctionSymbol.createSuspendView(): FirSimpleFunction? { val continuationParameter = fir.valueParameters.lastOrNull() ?: return null + val owner = classId.toSymbol(session)?.fir as? FirJavaClass ?: return null val continuationParameterType = continuationParameter .returnTypeRef + .resolveIfJavaType(session, owner.javaTypeParameterStack) .coneTypeSafe() ?.lowerBoundIfFlexible() as? ConeClassLikeType ?: return null diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendCovarianJavaOverride.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendCovarianJavaOverride.fir.kt deleted file mode 100644 index 4c42b3270cb..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendCovarianJavaOverride.fir.kt +++ /dev/null @@ -1,50 +0,0 @@ -// FILE: I.kt - -interface I { - suspend fun foo(x: Int): String -} - -// FILE: JavaClass.java -import kotlin.coroutines.Continuation; -import org.jetbrains.annotations.NotNull; - -public class JavaClass implements I { - @Override - public Object foo(int x, @NotNull Continuation continuation) { - return null; - } -} - -// FILE: main.kt - -import kotlin.coroutines.Continuation -class K1 : JavaClass() - -class K2 : JavaClass() { - override suspend fun foo(x: Int): String = "" -} - -class K3 : JavaClass() { - override fun foo(x: Int, y: Continuation): Any? = null -} - -fun builder(block: suspend () -> Unit) {} - -fun main(x: Continuation) { - JavaClass().foo(5, x) - K1().foo(6, x) - K2().foo(7, x) - K3().foo(8, x) - - builder { - JavaClass().foo(1) - K1().foo(2) - K2().foo(3) - K3().foo(4) - - JavaClass().foo(5, x) - K1().foo(6, x) - K2().foo(7, x) - K3().foo(8, x) - } -} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendCovarianJavaOverride.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendCovarianJavaOverride.kt index 57f098269d1..13e8661bb00 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendCovarianJavaOverride.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendCovarianJavaOverride.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: I.kt interface I { diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaOverrides.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaOverrides.fir.kt deleted file mode 100644 index 4c42b3270cb..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaOverrides.fir.kt +++ /dev/null @@ -1,50 +0,0 @@ -// FILE: I.kt - -interface I { - suspend fun foo(x: Int): String -} - -// FILE: JavaClass.java -import kotlin.coroutines.Continuation; -import org.jetbrains.annotations.NotNull; - -public class JavaClass implements I { - @Override - public Object foo(int x, @NotNull Continuation continuation) { - return null; - } -} - -// FILE: main.kt - -import kotlin.coroutines.Continuation -class K1 : JavaClass() - -class K2 : JavaClass() { - override suspend fun foo(x: Int): String = "" -} - -class K3 : JavaClass() { - override fun foo(x: Int, y: Continuation): Any? = null -} - -fun builder(block: suspend () -> Unit) {} - -fun main(x: Continuation) { - JavaClass().foo(5, x) - K1().foo(6, x) - K2().foo(7, x) - K3().foo(8, x) - - builder { - JavaClass().foo(1) - K1().foo(2) - K2().foo(3) - K3().foo(4) - - JavaClass().foo(5, x) - K1().foo(6, x) - K2().foo(7, x) - K3().foo(8, x) - } -} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaOverrides.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaOverrides.kt index 57f098269d1..13e8661bb00 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaOverrides.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaOverrides.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: I.kt interface I {