[Interop][Lowering] Support constants
Previously `const val`s from metadata-based interop libraries accidentally were linked as IrField. It is fixed, and now we should properly lower these constants.
This commit is contained in:
committed by
Sergey Bogolepov
parent
6b0cdf7be6
commit
9f6d92d4d4
+26
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.backend.common.push
|
|||||||
import org.jetbrains.kotlin.backend.konan.*
|
import org.jetbrains.kotlin.backend.konan.*
|
||||||
import org.jetbrains.kotlin.backend.konan.cgen.*
|
import org.jetbrains.kotlin.backend.konan.cgen.*
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions
|
import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions
|
||||||
|
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
|
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.*
|
import org.jetbrains.kotlin.backend.konan.ir.*
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.companionObject
|
import org.jetbrains.kotlin.backend.konan.ir.companionObject
|
||||||
@@ -881,6 +882,29 @@ private class InteropTransformer(val context: Context, override val irFile: IrFi
|
|||||||
return expression
|
return expression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle `const val`s that come from interop libraries.
|
||||||
|
*
|
||||||
|
* We extract constant value from the backing field, and replace getter invocation with it.
|
||||||
|
*/
|
||||||
|
private fun tryGenerateInteropConstantRead(expression: IrCall): IrExpression? {
|
||||||
|
val function = expression.symbol.owner
|
||||||
|
|
||||||
|
if (!function.descriptor.module.isFromInteropLibrary()) return null
|
||||||
|
if (!function.isGetter) return null
|
||||||
|
|
||||||
|
val constantProperty = (function as? IrSimpleFunction)
|
||||||
|
?.correspondingPropertySymbol
|
||||||
|
?.owner
|
||||||
|
?.takeIf { it.isConst }
|
||||||
|
?: return null
|
||||||
|
|
||||||
|
return constantProperty.backingField
|
||||||
|
?.initializer
|
||||||
|
?.expression
|
||||||
|
?: error("Constant property ${constantProperty.name} has no initializer!")
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitCall(expression: IrCall): IrExpression {
|
override fun visitCall(expression: IrCall): IrExpression {
|
||||||
|
|
||||||
expression.transformChildrenVoid(this)
|
expression.transformChildrenVoid(this)
|
||||||
@@ -903,6 +927,8 @@ private class InteropTransformer(val context: Context, override val irFile: IrFi
|
|||||||
|
|
||||||
tryGenerateInteropMemberAccess(expression, symbols, builder)?.let { return it }
|
tryGenerateInteropMemberAccess(expression, symbols, builder)?.let { return it }
|
||||||
|
|
||||||
|
tryGenerateInteropConstantRead(expression)?.let { return it }
|
||||||
|
|
||||||
val intrinsicType = tryGetIntrinsicType(expression)
|
val intrinsicType = tryGetIntrinsicType(expression)
|
||||||
|
|
||||||
if (intrinsicType != null) {
|
if (intrinsicType != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user