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
|
package org.jetbrains.kotlin.ir.backend.js.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
||||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
|
||||||
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.ir.declarations.*
|
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.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
|
// Move static member declarations from classes to top level
|
||||||
class StaticMembersLowering(val context: CommonBackendContext) : FileLoweringPass {
|
class StaticMembersLowering(val context: CommonBackendContext) : DeclarationTransformer {
|
||||||
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
override fun lower(irFile: IrFile) {
|
(declaration.parent as? IrClass)?.let { irClass ->
|
||||||
val staticDeclarationsInClasses = mutableListOf<IrDeclaration>()
|
val isStatic = when (declaration) {
|
||||||
irFile.acceptChildrenVoid(object : IrElementVisitorVoid {
|
is IrClass -> !declaration.isEffectivelyExternal()
|
||||||
override fun visitElement(element: IrElement) {
|
is IrSimpleFunction -> declaration.isStaticMethodOfClass && !declaration.isEffectivelyExternal()
|
||||||
element.acceptChildrenVoid(this)
|
is IrField -> declaration.isStatic
|
||||||
|
else -> false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitClass(declaration: IrClass) {
|
if (isStatic) {
|
||||||
if (declaration.parent is IrClass && !declaration.isEffectivelyExternal())
|
declaration.parent = irClass.file
|
||||||
staticDeclarationsInClasses.add(declaration)
|
irClass.file.declarations += declaration
|
||||||
super.visitClass(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