diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt index 43291f4f9e8..fb6b7bb1fe3 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt @@ -154,14 +154,20 @@ class JsIrBackendContext( val functions = (0..22).map { symbolTable.referenceClass(builtIns.getFunction(it)) } - val primitiveCompanionObjects = PrimitiveType.NUMBER_TYPES - .asSequence() - .filter { it.name != "LONG" && it.name != "CHAR" } // skip due to they have own explicit companions - .map { - it.typeName to symbolTable.lazyWrapper.referenceClass( - getClass(JS_INTERNAL_PACKAGE_FQNAME.child(Name.identifier("${it.typeName.identifier}CompanionObject"))) + private fun primitivesWithImplicitCompanionObject(): List { + val numbers = PrimitiveType.NUMBER_TYPES + .filter { it.name != "LONG" && it.name != "CHAR" } // skip due to they have own explicit companions + .map { it.typeName } + + return numbers + listOf(Name.identifier("String")) + } + + val primitiveCompanionObjects = primitivesWithImplicitCompanionObject() + .associate { + it to symbolTable.lazyWrapper.referenceClass( + getClass(JS_INTERNAL_PACKAGE_FQNAME.child(Name.identifier("${it.identifier}CompanionObject"))) ) - }.toMap() + } val suspendFunctions = (0..22).map { symbolTable.referenceClass(builtIns.getSuspendFunction(it)) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrimitiveCompanionLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrimitiveCompanionLowering.kt index b8a53e95556..e2ae14eadc9 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrimitiveCompanionLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrimitiveCompanionLowering.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl import org.jetbrains.kotlin.ir.types.isPrimitiveType +import org.jetbrains.kotlin.ir.types.isString import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -26,7 +27,7 @@ class PrimitiveCompanionLowering(val context: JsIrBackendContext) : FileLowering val declaration = symbol.owner if (!declaration.isCompanion) return expression val parent = declaration.parent as IrClass - if (!parent.defaultType.isPrimitiveType()) return expression + if (!parent.defaultType.isPrimitiveType() && !parent.defaultType.isString()) return expression val actualCompanion = context.primitiveCompanionObjects[parent.name] ?: return expression return expression.run { IrGetObjectValueImpl(startOffset, endOffset, actualCompanion.owner.defaultType, actualCompanion) } } diff --git a/compiler/testData/codegen/box/objectIntrinsics/objects.kt b/compiler/testData/codegen/box/objectIntrinsics/objects.kt index 5be3a0dfb97..3eddefd5794 100644 --- a/compiler/testData/codegen/box/objectIntrinsics/objects.kt +++ b/compiler/testData/codegen/box/objectIntrinsics/objects.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR package foo fun box(): String {