From 4005b5ce106afd45adf6473ed5b16e18498dc0fe Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Wed, 27 Feb 2019 16:17:41 +0300 Subject: [PATCH] [JS IR BE] Fix fqNames in moveBodilessDeclarationsToSeparatePlace --- ...MoveBodilessDeclarationsToSeparatePlace.kt | 96 ++++++++++--------- .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 11 ++- 2 files changed, 61 insertions(+), 46 deletions(-) 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 32e9f442218..e6a35fd0161 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,40 +13,60 @@ 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.getFqName import org.jetbrains.kotlin.ir.util.isEffectivelyExternal import org.jetbrains.kotlin.ir.util.transformFlat -import org.jetbrains.kotlin.ir.util.kotlinPackageFqn import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name + +private val BODILESS_BUILTIN_CLASSES = listOf( + "kotlin.String", + "kotlin.Nothing", + "kotlin.Array", + "kotlin.Any", + "kotlin.ByteArray", + "kotlin.CharArray", + "kotlin.ShortArray", + "kotlin.IntArray", + "kotlin.LongArray", + "kotlin.FloatArray", + "kotlin.DoubleArray", + "kotlin.BooleanArray", + "kotlin.Boolean", + "kotlin.Byte", + "kotlin.Short", + "kotlin.Int", + "kotlin.Float", + "kotlin.Double", + "kotlin.Function" +).map { FqName(it) }.toSet() + +private class DescriptorlessExternalPackageFragmentSymbol : IrExternalPackageFragmentSymbol { + override val descriptor: PackageFragmentDescriptor + get() = error("Operation is unsupported") + + private var _owner: IrExternalPackageFragment? = null + override val owner get() = _owner!! + + override val isBound get() = _owner != null + + override fun bind(owner: IrExternalPackageFragment) { + _owner = owner + } +} fun moveBodilessDeclarationsToSeparatePlace(context: JsIrBackendContext, module: IrModuleFragment) { + val externalPackageFragment = IrExternalPackageFragmentImpl( + DescriptorlessExternalPackageFragmentSymbol(), + FqName.ROOT + ) - val builtInClasses = listOf( - "String", - "Nothing", - "Array", - "Any", - "ByteArray", - "CharArray", - "ShortArray", - "IntArray", - "LongArray", - "FloatArray", - "DoubleArray", - "BooleanArray", - "Boolean", - "Byte", - "Short", - "Int", - "Float", - "Double", - "Function" - ).map { Name.identifier(it) }.toSet() + val bodilessBuiltInsPackageFragment = IrExternalPackageFragmentImpl( + DescriptorlessExternalPackageFragmentSymbol(), + FqName("kotlin") + ) fun isBuiltInClass(declaration: IrDeclaration): Boolean = - declaration is IrClass && declaration.name in builtInClasses - - val packageFragmentMap = mutableMapOf() + declaration is IrClass && declaration.getFqName() in BODILESS_BUILTIN_CLASSES fun collectExternalClasses(container: IrDeclarationContainer, includeCurrentLevel: Boolean): List { val externalClasses = @@ -71,32 +91,18 @@ fun moveBodilessDeclarationsToSeparatePlace(context: JsIrBackendContext, module: val it = irFile.declarations.iterator() - val packageFragment = packageFragmentMap.getOrPut(irFile.fqName) { - IrExternalPackageFragmentImpl(object : IrExternalPackageFragmentSymbol { - override val descriptor: PackageFragmentDescriptor - get() = error("Operation is unsupported") - - private var _owner: IrExternalPackageFragment? = null - override val owner get() = _owner!! - - override val isBound get() = _owner != null - - override fun bind(owner: IrExternalPackageFragment) { - _owner = owner - } - }, irFile.fqName) - } - while (it.hasNext()) { val d = it.next() - if (d.isEffectivelyExternal() || isBuiltInClass(d)) { - + if (isBuiltInClass(d)) { + it.remove() + bodilessBuiltInsPackageFragment.addChild(d) + } else if (d.isEffectivelyExternal()) { if (d.getJsModule() != null) context.declarationLevelJsModules.add(d) it.remove() - packageFragment.addChild(d) + externalPackageFragment.addChild(d) } } return irFile diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 02f5480dcfe..8761486e859 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -575,4 +575,13 @@ val IrDeclaration.file: IrFile get() = parent.let { is IrDeclaration -> it.file else -> TODO("Unexpected declaration parent") } -} \ No newline at end of file +} + +fun IrDeclarationWithName.getFqName(): FqName? { + val parentFqName = when (val parent = parent) { + is IrPackageFragment -> parent.fqName + is IrDeclarationWithName -> parent.getFqName() + else -> null + } + return parentFqName?.child(name) +}