[JS IR BE] Fix fqNames in moveBodilessDeclarationsToSeparatePlace

This commit is contained in:
Svyatoslav Kuzmich
2019-02-27 16:17:41 +03:00
parent d333a0ad4e
commit 4005b5ce10
2 changed files with 61 additions and 46 deletions
@@ -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<FqName, IrExternalPackageFragment>()
declaration is IrClass && declaration.getFqName() in BODILESS_BUILTIN_CLASSES
fun collectExternalClasses(container: IrDeclarationContainer, includeCurrentLevel: Boolean): List<IrClass> {
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
@@ -575,4 +575,13 @@ val IrDeclaration.file: IrFile get() = parent.let {
is IrDeclaration -> it.file
else -> TODO("Unexpected declaration parent")
}
}
}
fun IrDeclarationWithName.getFqName(): FqName? {
val parentFqName = when (val parent = parent) {
is IrPackageFragment -> parent.fqName
is IrDeclarationWithName -> parent.getFqName()
else -> null
}
return parentFqName?.child(name)
}