diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt index a837107b102..2fe6c6722c4 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt @@ -20,10 +20,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.classifierOrNull import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl -import org.jetbrains.kotlin.ir.util.constructors -import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.getInlineClassBackingField -import org.jetbrains.kotlin.ir.util.getInlinedClass +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -86,8 +83,8 @@ private class VarargTransformer( val needUnboxing: Boolean val arrayInlineClass = expression.type.getInlinedClass() if (arrayInlineClass != null) { - primitiveElementType = getInlineClassBackingField(elementType.getInlinedClass()!!).type - primitiveExpressionType = getInlineClassBackingField(arrayInlineClass).type + primitiveElementType = getInlineClassUnderlyingType(elementType.getInlinedClass()!!) + primitiveExpressionType = getInlineClassUnderlyingType(arrayInlineClass) needUnboxing = true } else { primitiveElementType = elementType diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/InlineClasses.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/InlineClasses.kt index 1f3e888e3a7..6d85547a694 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/InlineClasses.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/InlineClasses.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.symbols.IrClassSymbol @@ -28,7 +29,7 @@ fun IrType.getInlinedClass(): IrClass? { var fieldType: IrType var fieldInlinedClass = erased while (true) { - fieldType = getInlineClassBackingField(fieldInlinedClass).type + fieldType = getInlineClassUnderlyingType(fieldInlinedClass) if (fieldType.isMarkedNullable()) { return null } @@ -55,6 +56,15 @@ private tailrec fun erase(type: IrType): IrClass? { } } +fun getInlineClassUnderlyingType(irClass: IrClass): IrType { + for (declaration in irClass.declarations) { + if (declaration is IrConstructor && declaration.isPrimary) { + return declaration.valueParameters[0].type + } + } + error("Inline class has no primary constructor: ${irClass.fqNameWhenAvailable}") +} + fun getInlineClassBackingField(irClass: IrClass): IrField { for (declaration in irClass.declarations) { if (declaration is IrField) @@ -63,5 +73,5 @@ fun getInlineClassBackingField(irClass: IrClass): IrField { if (declaration is IrProperty) return declaration.backingField ?: continue } - error("Inline class has no field") + error("Inline class has no field: ${irClass.fqNameWhenAvailable}") }