diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt index 09a19861fa0..771918c2cb3 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt @@ -28,11 +28,13 @@ private const val INLINE_CLASS_IMPL_SUFFIX = "-impl" class InlineClassLowering(val context: CommonBackendContext) { private val transformedFunction = context.mapping.inlineClassMemberToStatic + private fun isClassInlineLike(irClass: IrClass): Boolean = context.inlineClassesUtils.isClassInlineLike(irClass) + val inlineClassDeclarationLowering = object : DeclarationTransformer { override fun transformFlat(declaration: IrDeclaration): List? { val irClass = declaration.parent as? IrClass ?: return null - if (!irClass.isInline) return null + if (!isClassInlineLike(irClass)) return null return when (declaration) { is IrConstructor -> transformConstructor(declaration) @@ -314,7 +316,7 @@ class InlineClassLowering(val context: CommonBackendContext) { override fun visitConstructorCall(expression: IrConstructorCall): IrExpression { expression.transformChildrenVoid(this) val function = expression.symbol.owner - if (!function.parentAsClass.isInline) { + if (!isClassInlineLike(function.parentAsClass)) { return expression } @@ -326,7 +328,7 @@ class InlineClassLowering(val context: CommonBackendContext) { val function: IrSimpleFunction = expression.symbol.owner if (function.parent !is IrClass || function.isStaticMethodOfClass || - !function.parentAsClass.isInline || + !isClassInlineLike(function.parentAsClass) || !function.isReal ) { return expression @@ -344,7 +346,7 @@ class InlineClassLowering(val context: CommonBackendContext) { val function = expression.symbol.owner val klass = function.parentAsClass return when { - !klass.isInline -> expression + !isClassInlineLike(klass) -> expression else -> irCall(expression, getOrCreateStaticMethod(function)) } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt index c69cec20038..49674b1a687 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt @@ -51,7 +51,7 @@ open class PropertyAccessorInlineLowering( // TODO: temporary workarounds if (parent.isExpect || property.isExpect) return false if (parent.parent is IrExternalPackageFragment) return false - if (parent.isInline) return false + if (context.inlineClassesUtils.isClassInlineLike(parent)) return false } if (property.isEffectivelyExternal()) return false return true diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6AddInternalParametersToConstructorPhase.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6AddInternalParametersToConstructorPhase.kt index db16c92ac58..8847fbc7fb7 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6AddInternalParametersToConstructorPhase.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6AddInternalParametersToConstructorPhase.kt @@ -211,6 +211,6 @@ class ES6AddInternalParametersToConstructorPhase(val context: JsIrBackendContext private fun IrConstructor.hasStrictSignature(): Boolean { val primitives = with(context.irBuiltIns) { primitiveTypesToPrimitiveArrays.values + stringClass } - return with(parentAsClass) { isExternal || isInline || symbol in primitives } + return with(parentAsClass) { isExternal || context.inlineClassesUtils.isClassInlineLike(this) || symbol in primitives } } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt index 9bc9a45e483..41695d955c1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt @@ -380,7 +380,7 @@ class ES6ConstructorLowering(val context: JsIrBackendContext) : BodyLoweringPass //util private fun IrConstructor.hasStrictSignature(): Boolean { val primitives = with(context.irBuiltIns) { primitiveTypesToPrimitiveArrays.values + stringClass } - return with(parentAsClass) { isExternal || isInline || symbol in primitives } + return with(parentAsClass) { isExternal || context.inlineClassesUtils.isClassInlineLike(this) || symbol in primitives } } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsBridgesConstruction.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsBridgesConstruction.kt index 19af4d40eb6..63984483787 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsBridgesConstruction.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsBridgesConstruction.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.ir.backend.js.lower import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin import org.jetbrains.kotlin.ir.backend.js.utils.eraseGenerics -import org.jetbrains.kotlin.ir.backend.js.utils.getJsInlinedClass import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName import org.jetbrains.kotlin.ir.backend.js.utils.hasStableJsName import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin @@ -19,6 +18,9 @@ import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.name.Name class JsBridgesConstruction(context: JsIrBackendContext) : BridgesConstruction(context) { + + private fun IrType.getJsInlinedClass() = context.inlineClassesUtils.getInlinedClass(this) + override fun getFunctionSignature(function: IrSimpleFunction): JsSignature = if (function.hasStableJsName(context)) { JsStableNameSignature(function.getJsNameOrKotlinName()) @@ -59,4 +61,4 @@ data class JsNonStableSignature( data class JsStableNameSignature( override val name: Name, -) : JsSignature \ No newline at end of file +) : JsSignature diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt index 078f69f271d..b618d6f4be0 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt @@ -44,7 +44,7 @@ class SecondaryConstructorLowering(val context: JsIrBackendContext) : Declaratio if (declaration is IrConstructor && !declaration.isPrimary) { val irClass = declaration.parentAsClass - if (irClass.isInline) return null + if (context.inlineClassesUtils.isClassInlineLike(irClass)) return null return transformConstructor(declaration, irClass) } @@ -255,7 +255,7 @@ private class CallsiteRedirectionTransformer(private val context: JsIrBackendCon private val IrConstructor.isSecondaryConstructorCall get() = - !isPrimary && this != defaultThrowableConstructor && !isExternal && !parentAsClass.isInline + !isPrimary && this != defaultThrowableConstructor && !isExternal && !context.inlineClassesUtils.isClassInlineLike(parentAsClass) override fun visitFunction(declaration: IrFunction, data: IrFunction?): IrStatement = super.visitFunction(declaration, declaration) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt index d13f72bea6e..298ad4a96c4 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt @@ -8,10 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs import org.jetbrains.kotlin.backend.common.compilationException import org.jetbrains.kotlin.backend.common.ir.isElseBranch import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.ir.backend.js.utils.JsGenerationContext -import org.jetbrains.kotlin.ir.backend.js.utils.Namer -import org.jetbrains.kotlin.ir.backend.js.utils.emptyScope -import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName +import org.jetbrains.kotlin.ir.backend.js.utils.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.types.isString @@ -25,6 +22,9 @@ import org.jetbrains.kotlin.js.backend.ast.* @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer { + private fun JsGenerationContext.isClassInlineLike(irClass: IrClass) = + staticContext.backendContext.inlineClassesUtils.isClassInlineLike(irClass) + override fun visitComposite(expression: IrComposite, data: JsGenerationContext): JsExpression { val size = expression.statements.size if (size == 0) TODO("Empty IrComposite is not supported") @@ -114,7 +114,7 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer error("Unexpected kind of IrClassifierSymbol: " + javaClass.typeName) } -/** - * Returns inline class for given class or null of type is not inlined - */ -fun IrType.getJsInlinedClass(): IrClass? { - if (this is IrSimpleType) { - val erased = erase(this) ?: return null - if (erased.isInline) { - if (this.isMarkedNullable()) { - var fieldType: IrType - var fieldInlinedClass = erased - while (true) { - fieldType = getInlineClassUnderlyingType(fieldInlinedClass) - if (fieldType.isMarkedNullable()) { - return null - } - - fieldInlinedClass = fieldType.getJsInlinedClass() ?: break - } - } - - return erased - } - } - return null -} - tailrec fun erase(type: IrType): IrClass? { val classifier = type.classifierOrFail @@ -91,4 +65,4 @@ fun IrType.getClassRef(context: JsGenerationContext): JsNameRef = context.getNameForClass(klass).makeRef() else -> context.getNameForStaticDeclaration(klass as IrDeclarationWithName).makeRef() - } \ No newline at end of file + } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/NameTables.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/NameTables.kt index 8ff48675e6a..ab5d4f179d3 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/NameTables.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/NameTables.kt @@ -131,7 +131,7 @@ fun jsFunctionSignature(declaration: IrFunction, context: JsIrBackendContext): S declaration.returnType.let { // Return type is only used in signature for inline class and Unit types because // they are binary incompatible with supertypes. - if (it.getJsInlinedClass() != null || it.isUnit()) { + if (context.inlineClassesUtils.isTypeInlined(it) || it.isUnit()) { nameBuilder.append("_ret$${it.asString()}") } }