diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MoveBodilessDeclarationsToSeparatePlace.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MoveBodilessDeclarationsToSeparatePlace.kt index 71cd0f275d4..2094c8c9222 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MoveBodilessDeclarationsToSeparatePlace.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MoveBodilessDeclarationsToSeparatePlace.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.backend.js.utils.getJsQualifier import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.symbols.IrExternalPackageFragmentSymbol +import org.jetbrains.kotlin.ir.util.isClass import org.jetbrains.kotlin.ir.util.isEffectivelyExternal import org.jetbrains.kotlin.ir.util.transformFlat import org.jetbrains.kotlin.name.FqName @@ -66,7 +67,7 @@ fun moveBodilessDeclarationsToSeparatePlace(context: JsIrBackendContext, module: externalClasses.flatMap { collectExternalClasses(it, true) } return if (includeCurrentLevel) - externalClasses + nestedExternalClasses + externalClasses.filter { it.isClass } + nestedExternalClasses else nestedExternalClasses } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/DynamicCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/DynamicCallsTransformer.kt index 17ceb5d282f..8dd0bbc8f8d 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/DynamicCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/DynamicCallsTransformer.kt @@ -57,7 +57,7 @@ class DynamicCallsTransformer(private val context: JsIrBackendContext) : CallsTr val symbol = call.symbol val function = call.symbol.owner - if (function.isDynamic() || function.isEffectivelyExternal()) { + if (function.isDynamic()) { when (call.origin) { GET_PROPERTY -> { val fieldSymbol = context.symbolTable.lazyWrapper.referenceField( 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 2c162c664c5..a5410bdccac 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 @@ -140,7 +140,7 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer nameRef property.setter -> jsAssignment(nameRef, arguments.single()) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt index 9ea4002bc82..71eff4edbd2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt @@ -45,7 +45,8 @@ class JsGenerationContext { fun getNameForDeclaration(declaration: IrDeclaration): JsName = when (declaration) { is IrSymbolOwner -> getNameForSymbol(declaration.symbol) - is IrProperty -> currentScope.declareName(declaration.name.identifier) + // Properties don't have symbols. Handling them separately: + is IrProperty -> currentScope.declareName(declaration.getJsName() ?: declaration.name.identifier) else -> error("Unsupported") } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt index 6bf496f0349..54d9860e9d1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt @@ -117,8 +117,12 @@ class SimpleNameGenerator : NameGenerator { if (declaration is IrConstructor) return@getOrPut getNameForDeclaration(declaration.parentAsClass, context) if (declaration is IrClass && declaration.parent is IrClass) { - val parentName = getNameForDeclaration(declaration.parentAsClass, context).ident - return@getOrPut context.currentScope.declareFreshName(parentName + "$" + descriptorName.identifier) + val parentName = getNameForDeclaration(declaration.parentAsClass, context) + if (declaration.isCompanion) { + // External companions are class references + return@getOrPut parentName + } + return@getOrPut context.currentScope.declareFreshName(parentName.ident + "$" + descriptorName.identifier) } return@getOrPut context.staticContext.rootScope.declareName(descriptorName.identifier) } diff --git a/js/js.translator/testData/box/native/accessToCompanionObjectFromInlineFun.kt b/js/js.translator/testData/box/native/accessToCompanionObjectFromInlineFun.kt index 9659cfd5ad7..5b48452e051 100644 --- a/js/js.translator/testData/box/native/accessToCompanionObjectFromInlineFun.kt +++ b/js/js.translator/testData/box/native/accessToCompanionObjectFromInlineFun.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1281 // FILE: main.kt diff --git a/js/js.translator/testData/box/native/classObject.kt b/js/js.translator/testData/box/native/classObject.kt index 380296f1e93..378e3ba8cdf 100644 --- a/js/js.translator/testData/box/native/classObject.kt +++ b/js/js.translator/testData/box/native/classObject.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1283 package foo