Skip to content

Commit 46ddcac

Browse files
committed
Support intrinsifying of serializer() function when it is seen inside multifile class part
It's needed to be able to correctly compile kotlinx-serialization-core itself, as compiler sees real function, not one from a facade. #KT-56244 Fixed
1 parent 2d1e8db commit 46ddcac

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
2+
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
33
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
44
*/
55

@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner.Companion.pluginIn
1919
import org.jetbrains.kotlin.config.ApiVersion
2020
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
2121
import org.jetbrains.kotlin.ir.declarations.IrClass
22+
import org.jetbrains.kotlin.ir.declarations.IrFunction
2223
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
2324
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
2425
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
@@ -114,9 +115,21 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex
114115

115116
}
116117

118+
/**
119+
* Method for intrinsification `kotlinx.serialization.serializer` is a top-level function.
120+
* For the rest of the world, it is located in the facade `kotlinx.serialization.SerializersKt`.
121+
* However, when we compile `kotlinx-serialization-core` itself, facade contains only synthetic bridges.
122+
* Real function is contained in IR class with `SerializersKt__SerializersKt` name.
123+
* (as we have `@file:JvmMultifileClass @file:JvmName("SerializersKt")` on both common Serializers.kt and a platform-specific SerializersJvm.kt files)
124+
*/
125+
private fun IrFunction.isTargetMethod(): Boolean {
126+
val fqName = fqNameWhenAvailable?.asString() ?: return false
127+
return fqName == "kotlinx.serialization.SerializersKt.serializer" || fqName == "kotlinx.serialization.SerializersKt__SerializersKt.serializer"
128+
}
129+
117130
override fun getIntrinsic(symbol: IrFunctionSymbol): IntrinsicMethod? {
118131
val method = symbol.owner
119-
if (method.fqNameWhenAvailable?.asString() != "kotlinx.serialization.SerializersKt.serializer"
132+
if (!method.isTargetMethod()
120133
|| method.dispatchReceiverParameter != null
121134
|| method.typeParameters.size != 1
122135
|| method.valueParameters.isNotEmpty()

0 commit comments

Comments
 (0)