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
This commit is contained in:
committed by
Space Team
parent
993695a7d0
commit
26330133ab
+15
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2023 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner.Companion.pluginIn
|
|||||||
import org.jetbrains.kotlin.config.ApiVersion
|
import org.jetbrains.kotlin.config.ApiVersion
|
||||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
@@ -116,9 +117,21 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method for intrinsification `kotlinx.serialization.serializer` is a top-level function.
|
||||||
|
* For the rest of the world, it is located in the facade `kotlinx.serialization.SerializersKt`.
|
||||||
|
* However, when we compile `kotlinx-serialization-core` itself, facade contains only synthetic bridges.
|
||||||
|
* Real function is contained in IR class with `SerializersKt__SerializersKt` name.
|
||||||
|
* (as we have `@file:JvmMultifileClass @file:JvmName("SerializersKt")` on both common Serializers.kt and a platform-specific SerializersJvm.kt files)
|
||||||
|
*/
|
||||||
|
private fun IrFunction.isTargetMethod(): Boolean {
|
||||||
|
val fqName = fqNameWhenAvailable?.asString() ?: return false
|
||||||
|
return fqName == "kotlinx.serialization.SerializersKt.serializer" || fqName == "kotlinx.serialization.SerializersKt__SerializersKt.serializer"
|
||||||
|
}
|
||||||
|
|
||||||
override fun getIntrinsic(symbol: IrFunctionSymbol): IntrinsicMethod? {
|
override fun getIntrinsic(symbol: IrFunctionSymbol): IntrinsicMethod? {
|
||||||
val method = symbol.owner
|
val method = symbol.owner
|
||||||
if (method.fqNameWhenAvailable?.asString() != "kotlinx.serialization.SerializersKt.serializer"
|
if (!method.isTargetMethod()
|
||||||
|| method.dispatchReceiverParameter != null
|
|| method.dispatchReceiverParameter != null
|
||||||
|| method.typeParameters.size != 1
|
|| method.typeParameters.size != 1
|
||||||
|| method.valueParameters.isNotEmpty()
|
|| method.valueParameters.isNotEmpty()
|
||||||
|
|||||||
Reference in New Issue
Block a user