[IR] Remove intrinsics hack for `coroutineContext`
^KT-77111 Fixed
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Symbols.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Symbols.kt
index 7f81291..a31ce58 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Symbols.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Symbols.kt
@@ -218,10 +218,6 @@
abstract val continuationClass: IrClassSymbol
- abstract val coroutineContextGetter: IrSimpleFunctionSymbol
-
- abstract val coroutineGetContext: IrSimpleFunctionSymbol
-
abstract val returnIfSuspended: IrSimpleFunctionSymbol
abstract val functionAdapter: IrClassSymbol
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt
index c2c3514..f3ac0c2 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt
@@ -7,23 +7,26 @@
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.InlineClassesUtils
-import org.jetbrains.kotlin.utils.atMostOne
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.InternalSymbolFinderAPI
-import org.jetbrains.kotlin.ir.SymbolFinder
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
+import org.jetbrains.kotlin.ir.SymbolFinder
import org.jetbrains.kotlin.ir.backend.js.utils.isDispatchReceiver
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
-import org.jetbrains.kotlin.ir.util.*
+import org.jetbrains.kotlin.ir.util.SymbolTable
+import org.jetbrains.kotlin.ir.util.getPropertyGetter
+import org.jetbrains.kotlin.ir.util.getPropertySetter
+import org.jetbrains.kotlin.ir.util.isOverridableOrOverrides
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.MemberScope
+import org.jetbrains.kotlin.utils.atMostOne
interface JsCommonBackendContext : CommonBackendContext {
val internalPackageFqn: FqName
@@ -85,13 +88,9 @@
return contextGetter.symbol
}
- val coroutineContextGetter =
- symbolFinder.findTopLevelPropertyGetter(COROUTINE_PACKAGE_FQNAME, COROUTINE_CONTEXT_NAME.asString())
-
companion object {
private val INTRINSICS_PACKAGE_NAME = Name.identifier("intrinsics")
private val COROUTINE_SUSPENDED_NAME = Name.identifier("COROUTINE_SUSPENDED")
- private val COROUTINE_CONTEXT_NAME = Name.identifier("coroutineContext")
private val COROUTINE_IMPL_NAME = Name.identifier("CoroutineImpl")
private val CONTINUATION_NAME = Name.identifier("Continuation")
private val CONTINUATION_CONTEXT_GETTER_NAME = Name.special("<get-context>")
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSymbols.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSymbols.kt
index 4548f8d..4a095be 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSymbols.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSymbols.kt
@@ -85,10 +85,6 @@
override val continuationClass = coroutineSymbols.continuationClass
- override val coroutineContextGetter = coroutineSymbols.coroutineContextGetter
-
- override val coroutineGetContext = symbolFinder.topLevelFunction(BASE_JS_PACKAGE, GET_COROUTINE_CONTEXT_NAME)
-
override val returnIfSuspended = symbolFinder.topLevelFunction(BASE_JS_PACKAGE, "returnIfSuspended")
override val functionAdapter = symbolFinder.topLevelClass(BASE_JS_PACKAGE, "FunctionAdapter")
@@ -145,8 +141,4 @@
call.symbol == intrinsics.arrayConcat ||
call.symbol == intrinsics.jsBoxIntrinsic ||
call.symbol == intrinsics.jsUnboxIntrinsic
-
- companion object {
- private const val GET_COROUTINE_CONTEXT_NAME = "getCoroutineContext"
- }
}
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt
index 2beb3ed..d2a74f4 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt
@@ -268,12 +268,6 @@
override val getContinuation: IrSimpleFunctionSymbol
get() = error("not implemented")
- override val coroutineContextGetter: IrSimpleFunctionSymbol
- get() = error("not implemented")
-
- override val coroutineGetContext: IrSimpleFunctionSymbol
- get() = error("not implemented")
-
override val returnIfSuspended: IrSimpleFunctionSymbol
get() = error("not implemented")
diff --git a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
index 2cc5799..f7cf2b5 100644
--- a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
+++ b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
@@ -178,7 +178,6 @@
val isSubtype = "isSubtype".internalCallableId
val getContinuation = "getContinuation".internalCallableId
val returnIfSuspended = "returnIfSuspended".internalCallableId
- val getCoroutineContext = "getCoroutineContext".internalCallableId
val saveCoroutineState = "saveCoroutineState".internalCallableId
val restoreCoroutineState = "restoreCoroutineState".internalCallableId
val getObjectTypeInfo = "getObjectTypeInfo".internalCallableId
@@ -238,7 +237,6 @@
val println = CallableId(FqName("kotlin.io"), Name.identifier("println"))
val executeImpl = CallableId(KonanFqNames.packageName.child(Name.identifier("concurrent")), Name.identifier("executeImpl"))
val createCleaner = CallableId(KonanFqNames.packageName.child(Name.identifier("ref")), Name.identifier("createCleaner"))
- val coroutineContext = CallableId(StandardNames.COROUTINES_PACKAGE_FQ_NAME, Name.identifier("coroutineContext"))
val coroutineSuspended = CallableId(StandardNames.COROUTINES_INTRINSICS_PACKAGE_FQ_NAME, StandardNames.COROUTINE_SUSPENDED_NAME)
val invokeSuspend = CallableId(ClassIds.baseContinuationImpl, Name.identifier("invokeSuspend"))
val anyEquals = CallableId(StandardClassIds.Any, StandardNames.EQUALS_NAME)
@@ -604,10 +602,6 @@
override val returnIfSuspended = CallableIds.returnIfSuspended.functionSymbol()
- override val coroutineContextGetter by CallableIds.coroutineContext.getterSymbol()
-
- override val coroutineGetContext = CallableIds.getCoroutineContext.functionSymbol()
-
override val coroutineImpl get() = TODO()
val baseContinuationImpl = ClassIds.baseContinuationImpl.classSymbol()
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt
index 169fb98..0f328ba 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt
@@ -103,10 +103,6 @@
getInternalFunction("getContinuation")
override val continuationClass =
coroutineSymbols.continuationClass
- override val coroutineContextGetter =
- coroutineSymbols.coroutineContextGetter
- override val coroutineGetContext =
- getInternalFunction("getCoroutineContext")
override val returnIfSuspended =
getInternalFunction("returnIfSuspended")
diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/InlineFunctionResolver.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/InlineFunctionResolver.kt
index 5c92d07..d7e4cf3 100644
--- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/InlineFunctionResolver.kt
+++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/InlineFunctionResolver.kt
@@ -91,7 +91,6 @@
if (!realOwner.isInline) return null
// TODO: drop special cases KT-77111
val result = when {
- realOwner.symbol == context.symbols.coroutineContextGetter -> context.symbols.coroutineGetContext.owner
else -> realOwner
}
if (inlineMode == InlineMode.PRIVATE_INLINE_FUNCTIONS && !result.isEffectivelyPrivate()) return null
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/ContinuationNative.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/ContinuationNative.kt
new file mode 100644
index 0000000..d94ac72
--- /dev/null
+++ b/kotlin-native/runtime/src/main/kotlin/kotlin/coroutines/ContinuationNative.kt
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package kotlin.coroutines
+
+import kotlin.internal.InlineOnly
+import kotlin.native.internal.getContinuation
+
+@SinceKotlin(version = "1.3")
+@Suppress("WRONG_MODIFIER_TARGET")
+@InlineOnly
+public actual suspend inline val coroutineContext: CoroutineContext
+ get() = getContinuation<Any?>().context
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Coroutines.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Coroutines.kt
index d862594..7248f5a 100644
--- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Coroutines.kt
+++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Coroutines.kt
@@ -6,17 +6,11 @@
package kotlin.native.internal
import kotlin.coroutines.Continuation
-import kotlin.coroutines.CoroutineContext
@TypedIntrinsic(IntrinsicType.GET_CONTINUATION)
@PublishedApi
internal external fun <T> getContinuation(): Continuation<T>
-@kotlin.internal.InlineOnly
-@PublishedApi
-internal inline suspend fun getCoroutineContext(): CoroutineContext =
- getContinuation<Any?>().context
-
@TypedIntrinsic(IntrinsicType.RETURN_IF_SUSPENDED)
@PublishedApi
internal external suspend fun <T> returnIfSuspended(@Suppress("UNUSED_PARAMETER") argument: Any?): T
diff --git a/libraries/stdlib/js/runtime/coroutineInternalJS.kt b/libraries/stdlib/js/runtime/coroutineInternalJS.kt
index 94cad69..6d18ef9 100644
--- a/libraries/stdlib/js/runtime/coroutineInternalJS.kt
+++ b/libraries/stdlib/js/runtime/coroutineInternalJS.kt
@@ -26,8 +26,3 @@
context: CoroutineContext,
continuation: Continuation<T>
): Continuation<T> = context[ContinuationInterceptor]?.interceptContinuation(continuation) ?: continuation
-
-
-@SinceKotlin("1.2")
-@PublishedApi
-internal inline suspend fun getCoroutineContext(): CoroutineContext = getContinuation<Any?>().context
diff --git a/libraries/stdlib/js/src/kotlin/coroutines/ContinuationJs.kt b/libraries/stdlib/js/src/kotlin/coroutines/ContinuationJs.kt
new file mode 100644
index 0000000..cf17ebe
--- /dev/null
+++ b/libraries/stdlib/js/src/kotlin/coroutines/ContinuationJs.kt
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package kotlin.coroutines
+
+import kotlin.internal.InlineOnly
+
+@SinceKotlin(version = "1.3")
+@Suppress("WRONG_MODIFIER_TARGET")
+@InlineOnly
+public actual suspend inline val coroutineContext: CoroutineContext
+ get() = getContinuation<Any?>().context
\ No newline at end of file
diff --git a/libraries/stdlib/jvm/src/kotlin/coroutines/ContinuationJvm.kt b/libraries/stdlib/jvm/src/kotlin/coroutines/ContinuationJvm.kt
new file mode 100644
index 0000000..d60e55e
--- /dev/null
+++ b/libraries/stdlib/jvm/src/kotlin/coroutines/ContinuationJvm.kt
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package kotlin.coroutines
+
+import kotlin.internal.InlineOnly
+
+@SinceKotlin(version = "1.3")
+@Suppress("WRONG_MODIFIER_TARGET")
+@InlineOnly
+public actual suspend inline val coroutineContext: CoroutineContext
+ get() = error("not implemented")
diff --git a/libraries/stdlib/src/kotlin/coroutines/Continuation.kt b/libraries/stdlib/src/kotlin/coroutines/Continuation.kt
index 5aa325d..f219ca1 100644
--- a/libraries/stdlib/src/kotlin/coroutines/Continuation.kt
+++ b/libraries/stdlib/src/kotlin/coroutines/Continuation.kt
@@ -159,7 +159,4 @@
@SinceKotlin("1.3")
@Suppress("WRONG_MODIFIER_TARGET")
@InlineOnly
-public suspend inline val coroutineContext: CoroutineContext
- get() {
- throw NotImplementedError("Implemented as intrinsic")
- }
+public expect suspend inline val coroutineContext: CoroutineContext
diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Coroutines.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Coroutines.kt
index 1871ff1..858a9bd 100644
--- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Coroutines.kt
+++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Coroutines.kt
@@ -25,10 +25,6 @@
continuation: Continuation<T>
): Continuation<T> = context[ContinuationInterceptor]?.interceptContinuation(continuation) ?: continuation
-
-@PublishedApi
-internal inline suspend fun getCoroutineContext(): CoroutineContext = getContinuation<Any?>().context
-
@Suppress("UNUSED_PARAMETER")
@ExcludedFromCodegen
@PublishedApi
diff --git a/libraries/stdlib/wasm/src/kotlin/coroutines/ContinuationWasm.kt b/libraries/stdlib/wasm/src/kotlin/coroutines/ContinuationWasm.kt
new file mode 100644
index 0000000..e22f005
--- /dev/null
+++ b/libraries/stdlib/wasm/src/kotlin/coroutines/ContinuationWasm.kt
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package kotlin.coroutines
+
+import kotlin.internal.InlineOnly
+import kotlin.wasm.internal.getContinuation
+
+@SinceKotlin(version = "1.3")
+@Suppress("WRONG_MODIFIER_TARGET")
+@InlineOnly
+public actual suspend inline val coroutineContext: CoroutineContext
+ get() = getContinuation<Any?>().context