StaticMembersLowering

This commit is contained in:
Anton Bannykh
2019-12-24 21:46:39 +03:00
committed by Anton Bannykh
parent d9fbe8b951
commit 15b2312cec
@@ -6,51 +6,29 @@
package org.jetbrains.kotlin.ir.backend.js.lower
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.ir.addChild
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.getPackageFragment
import org.jetbrains.kotlin.ir.util.file
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
// Move static member declarations from classes to top level
class StaticMembersLowering(val context: CommonBackendContext) : FileLoweringPass {
override fun lower(irFile: IrFile) {
val staticDeclarationsInClasses = mutableListOf<IrDeclaration>()
irFile.acceptChildrenVoid(object : IrElementVisitorVoid {
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
class StaticMembersLowering(val context: CommonBackendContext) : DeclarationTransformer {
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
(declaration.parent as? IrClass)?.let { irClass ->
val isStatic = when (declaration) {
is IrClass -> !declaration.isEffectivelyExternal()
is IrSimpleFunction -> declaration.isStaticMethodOfClass && !declaration.isEffectivelyExternal()
is IrField -> declaration.isStatic
else -> false
}
override fun visitClass(declaration: IrClass) {
if (declaration.parent is IrClass && !declaration.isEffectivelyExternal())
staticDeclarationsInClasses.add(declaration)
super.visitClass(declaration)
if (isStatic) {
declaration.parent = irClass.file
irClass.file.declarations += declaration
return listOf()
}
override fun visitSimpleFunction(declaration: IrSimpleFunction) {
if (declaration.parent is IrClass && declaration.isStaticMethodOfClass && !declaration.isEffectivelyExternal())
staticDeclarationsInClasses.add(declaration)
super.visitSimpleFunction(declaration)
}
override fun visitField(declaration: IrField) {
if (declaration.parent is IrClass && declaration.isStatic)
staticDeclarationsInClasses.add(declaration)
super.visitField(declaration)
}
})
for (declaration in staticDeclarationsInClasses) {
val klass = declaration.parentAsClass
klass.declarations.remove(declaration)
irFile.addChild(declaration)
declaration.parent = irFile
}
return null
}
}