StaticMembersLowering
This commit is contained in:
committed by
Anton Bannykh
parent
d9fbe8b951
commit
15b2312cec
+16
-38
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user