IR: refactor DeclarationTransformer
Do not create extra DeclarationTransformer and FileLoweringPass instances, instead inline all transformations to DeclarationTransformer.lower.
This commit is contained in:
@@ -194,105 +194,91 @@ fun FunctionLoweringPass.runOnFilePostfix(irFile: IrFile) {
|
|||||||
interface DeclarationTransformer : FileLoweringPass {
|
interface DeclarationTransformer : FileLoweringPass {
|
||||||
fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>?
|
fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>?
|
||||||
|
|
||||||
|
val withLocalDeclarations: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
override fun lower(irFile: IrFile) {
|
override fun lower(irFile: IrFile) {
|
||||||
runPostfix().toFileLoweringPass().lower(irFile)
|
val visitor = Visitor(this)
|
||||||
}
|
irFile.declarations.transformFlat { declaration ->
|
||||||
}
|
declaration.acceptVoid(visitor)
|
||||||
|
transformFlatRestricted(declaration)
|
||||||
fun DeclarationTransformer.transformFlatRestricted(declaration: IrDeclaration): List<IrDeclaration>? {
|
|
||||||
return stageController.restrictTo(declaration) {
|
|
||||||
transformFlat(declaration)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun DeclarationTransformer.toFileLoweringPass(): FileLoweringPass {
|
|
||||||
return object : FileLoweringPass {
|
|
||||||
override fun lower(irFile: IrFile) {
|
|
||||||
irFile.declarations.transformFlat(this@toFileLoweringPass::transformFlat)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun DeclarationTransformer.runPostfix(withLocalDeclarations: Boolean = false): DeclarationTransformer {
|
|
||||||
return object : DeclarationTransformer {
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
|
||||||
declaration.acceptVoid(PostfixDeclarationTransformer(withLocalDeclarations, this@runPostfix))
|
|
||||||
|
|
||||||
return this@runPostfix.transformFlatRestricted(declaration)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class PostfixDeclarationTransformer(
|
|
||||||
private val withLocalDeclarations: Boolean,
|
|
||||||
private val transformer: DeclarationTransformer
|
|
||||||
) : IrElementVisitorVoid {
|
|
||||||
override fun visitElement(element: IrElement) {
|
|
||||||
element.acceptChildrenVoid(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitBody(body: IrBody) {
|
|
||||||
if (withLocalDeclarations) {
|
|
||||||
super.visitBody(body)
|
|
||||||
}
|
|
||||||
// else stop
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitFunction(declaration: IrFunction) {
|
|
||||||
declaration.acceptChildrenVoid(this)
|
|
||||||
|
|
||||||
for (v in declaration.valueParameters) {
|
|
||||||
val result = transformer.transformFlatRestricted(v)
|
|
||||||
if (result != null) error("Don't know how to add value parameters")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitProperty(declaration: IrProperty) {
|
private fun transformFlatRestricted(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
// TODO This is a hack to allow lowering a getter separately from the enclosing property
|
return stageController.restrictTo(declaration) {
|
||||||
|
transformFlat(declaration)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val visitor = this
|
private class Visitor(private val transformer: DeclarationTransformer) : IrElementVisitorVoid {
|
||||||
|
override fun visitElement(element: IrElement) {
|
||||||
|
element.acceptChildrenVoid(this)
|
||||||
|
}
|
||||||
|
|
||||||
fun IrDeclaration.transform() {
|
override fun visitBody(body: IrBody) {
|
||||||
|
if (transformer.withLocalDeclarations) {
|
||||||
|
super.visitBody(body)
|
||||||
|
}
|
||||||
|
// else stop
|
||||||
|
}
|
||||||
|
|
||||||
acceptVoid(visitor)
|
override fun visitFunction(declaration: IrFunction) {
|
||||||
|
declaration.acceptChildrenVoid(this)
|
||||||
|
|
||||||
val result = transformer.transformFlatRestricted(this)
|
for (v in declaration.valueParameters) {
|
||||||
if (result != null) {
|
val result = transformer.transformFlatRestricted(v)
|
||||||
(parent as? IrDeclarationContainer)?.let {
|
if (result != null) error("Don't know how to add value parameters")
|
||||||
var index = it.declarations.indexOf(this)
|
|
||||||
if (index == -1) {
|
|
||||||
index = it.declarations.indexOf(declaration)
|
|
||||||
} else {
|
|
||||||
it.declarations.removeAt(index)
|
|
||||||
--index
|
|
||||||
}
|
|
||||||
|
|
||||||
it.declarations.addAll(index + 1, result)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declaration.backingField?.transform()
|
override fun visitProperty(declaration: IrProperty) {
|
||||||
declaration.getter?.transform()
|
// TODO This is a hack to allow lowering a getter separately from the enclosing property
|
||||||
declaration.setter?.transform()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitClass(declaration: IrClass) {
|
val visitor = this
|
||||||
declaration.thisReceiver?.accept(this, null)
|
|
||||||
declaration.typeParameters.forEach { it.accept(this, null) }
|
|
||||||
ArrayList(declaration.declarations).forEach { it.accept(this, null) }
|
|
||||||
|
|
||||||
declaration.declarations.transformFlat(transformer::transformFlatRestricted)
|
fun IrDeclaration.transform() {
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitScript(declaration: IrScript) {
|
acceptVoid(visitor)
|
||||||
ArrayList(declaration.declarations).forEach { it.accept(this, null) }
|
|
||||||
declaration.declarations.transformFlat(transformer::transformFlatRestricted)
|
|
||||||
|
|
||||||
if (withLocalDeclarations) {
|
val result = transformer.transformFlatRestricted(this)
|
||||||
declaration.statements.forEach { it.accept(this, null) }
|
if (result != null) {
|
||||||
|
(parent as? IrDeclarationContainer)?.let {
|
||||||
|
var index = it.declarations.indexOf(this)
|
||||||
|
if (index == -1) {
|
||||||
|
index = it.declarations.indexOf(declaration)
|
||||||
|
} else {
|
||||||
|
it.declarations.removeAt(index)
|
||||||
|
--index
|
||||||
|
}
|
||||||
|
|
||||||
|
it.declarations.addAll(index + 1, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declaration.backingField?.transform()
|
||||||
|
declaration.getter?.transform()
|
||||||
|
declaration.setter?.transform()
|
||||||
}
|
}
|
||||||
|
|
||||||
declaration.thisReceiver.accept(this, null)
|
override fun visitClass(declaration: IrClass) {
|
||||||
|
declaration.thisReceiver?.accept(this, null)
|
||||||
|
declaration.typeParameters.forEach { it.accept(this, null) }
|
||||||
|
ArrayList(declaration.declarations).forEach { it.accept(this, null) }
|
||||||
|
|
||||||
|
declaration.declarations.transformFlat(transformer::transformFlatRestricted)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitScript(declaration: IrScript) {
|
||||||
|
ArrayList(declaration.declarations).forEach { it.accept(this, null) }
|
||||||
|
declaration.declarations.transformFlat(transformer::transformFlatRestricted)
|
||||||
|
|
||||||
|
if (transformer.withLocalDeclarations) {
|
||||||
|
declaration.statements.forEach { it.accept(this, null) }
|
||||||
|
}
|
||||||
|
|
||||||
|
declaration.thisReceiver.accept(this, null)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-8
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.backend.common.lower
|
|||||||
import org.jetbrains.kotlin.backend.common.*
|
import org.jetbrains.kotlin.backend.common.*
|
||||||
import org.jetbrains.kotlin.backend.common.descriptors.synthesizedString
|
import org.jetbrains.kotlin.backend.common.descriptors.synthesizedString
|
||||||
import org.jetbrains.kotlin.backend.common.ir.*
|
import org.jetbrains.kotlin.backend.common.ir.*
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
||||||
@@ -40,10 +40,7 @@ open class DefaultArgumentStubGenerator(
|
|||||||
private val skipExternalMethods: Boolean = false,
|
private val skipExternalMethods: Boolean = false,
|
||||||
private val forceSetOverrideSymbols: Boolean = true
|
private val forceSetOverrideSymbols: Boolean = true
|
||||||
) : DeclarationTransformer {
|
) : DeclarationTransformer {
|
||||||
|
override val withLocalDeclarations: Boolean get() = true
|
||||||
override fun lower(irFile: IrFile) {
|
|
||||||
runPostfix(true).toFileLoweringPass().lower(irFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
if (declaration is IrFunction) {
|
if (declaration is IrFunction) {
|
||||||
@@ -447,9 +444,7 @@ class DefaultParameterCleaner(
|
|||||||
val context: CommonBackendContext,
|
val context: CommonBackendContext,
|
||||||
val replaceDefaultValuesWithStubs: Boolean = false
|
val replaceDefaultValuesWithStubs: Boolean = false
|
||||||
) : DeclarationTransformer {
|
) : DeclarationTransformer {
|
||||||
override fun lower(irFile: IrFile) {
|
override val withLocalDeclarations: Boolean get() = true
|
||||||
runPostfix(true).toFileLoweringPass().lower(irFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
if (declaration is IrValueParameter && declaration.defaultValue != null) {
|
if (declaration is IrValueParameter && declaration.defaultValue != null) {
|
||||||
|
|||||||
+8
-6
@@ -5,7 +5,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.common.lower
|
package org.jetbrains.kotlin.backend.common.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.*
|
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
||||||
|
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
||||||
|
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
|
||||||
|
import org.jetbrains.kotlin.backend.common.runOnFilePostfix
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -16,7 +19,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
|
|||||||
import org.jetbrains.kotlin.ir.util.constructedClass
|
import org.jetbrains.kotlin.ir.util.constructedClass
|
||||||
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
import org.jetbrains.kotlin.ir.util.render
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
import org.jetbrains.kotlin.ir.visitors.*
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
|
|
||||||
object SYNTHESIZED_INIT_BLOCK : IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK")
|
object SYNTHESIZED_INIT_BLOCK : IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK")
|
||||||
|
|
||||||
@@ -88,10 +93,7 @@ class InitializersCleanupLowering(
|
|||||||
val context: CommonBackendContext,
|
val context: CommonBackendContext,
|
||||||
private val shouldEraseFieldInitializer: (IrField) -> Boolean = { it.correspondingPropertySymbol?.owner?.isConst != true }
|
private val shouldEraseFieldInitializer: (IrField) -> Boolean = { it.correspondingPropertySymbol?.owner?.isConst != true }
|
||||||
) : DeclarationTransformer {
|
) : DeclarationTransformer {
|
||||||
|
override val withLocalDeclarations: Boolean get() = true
|
||||||
override fun lower(irFile: IrFile) {
|
|
||||||
runPostfix(withLocalDeclarations = true).toFileLoweringPass().lower(irFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
if (declaration is IrAnonymousInitializer) return emptyList()
|
if (declaration is IrAnonymousInitializer) return emptyList()
|
||||||
|
|||||||
+1
-3
@@ -31,9 +31,7 @@ interface InnerClassesSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class InnerClassesLowering(val context: BackendContext, private val innerClassesSupport: InnerClassesSupport) : DeclarationTransformer {
|
class InnerClassesLowering(val context: BackendContext, private val innerClassesSupport: InnerClassesSupport) : DeclarationTransformer {
|
||||||
override fun lower(irFile: IrFile) {
|
override val withLocalDeclarations: Boolean get() = true
|
||||||
runPostfix(true).toFileLoweringPass().lower(irFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
if (declaration is IrClass && declaration.isInner) {
|
if (declaration is IrClass && declaration.isInner) {
|
||||||
|
|||||||
+6
-9
@@ -16,7 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.common.lower
|
package org.jetbrains.kotlin.backend.common.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.*
|
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
||||||
|
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
||||||
|
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
|
||||||
|
import org.jetbrains.kotlin.backend.common.getOrPut
|
||||||
import org.jetbrains.kotlin.backend.common.ir.Symbols
|
import org.jetbrains.kotlin.backend.common.ir.Symbols
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
@@ -36,10 +39,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
|||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
|
|
||||||
class NullableFieldsForLateinitCreationLowering(val backendContext: CommonBackendContext) : DeclarationTransformer {
|
class NullableFieldsForLateinitCreationLowering(val backendContext: CommonBackendContext) : DeclarationTransformer {
|
||||||
|
override val withLocalDeclarations: Boolean get() = true
|
||||||
override fun lower(irFile: IrFile) {
|
|
||||||
runPostfix(true).toFileLoweringPass().lower(irFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
if (declaration is IrField) {
|
if (declaration is IrField) {
|
||||||
@@ -56,10 +56,7 @@ class NullableFieldsForLateinitCreationLowering(val backendContext: CommonBacken
|
|||||||
|
|
||||||
// Transform declarations
|
// Transform declarations
|
||||||
class NullableFieldsDeclarationLowering(val backendContext: CommonBackendContext) : DeclarationTransformer {
|
class NullableFieldsDeclarationLowering(val backendContext: CommonBackendContext) : DeclarationTransformer {
|
||||||
|
override val withLocalDeclarations: Boolean get() = true
|
||||||
override fun lower(irFile: IrFile) {
|
|
||||||
runPostfix(true).toFileLoweringPass().lower(irFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
when (declaration) {
|
when (declaration) {
|
||||||
|
|||||||
+3
-4
@@ -5,7 +5,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.common.lower
|
package org.jetbrains.kotlin.backend.common.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.*
|
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
||||||
|
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -15,9 +16,7 @@ import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
|
|||||||
import org.jetbrains.kotlin.ir.visitors.*
|
import org.jetbrains.kotlin.ir.visitors.*
|
||||||
|
|
||||||
class PropertiesLowering : DeclarationTransformer {
|
class PropertiesLowering : DeclarationTransformer {
|
||||||
override fun lower(irFile: IrFile) {
|
override val withLocalDeclarations: Boolean get() = true
|
||||||
runPostfix(true).toFileLoweringPass().lower(irFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
when (declaration) {
|
when (declaration) {
|
||||||
|
|||||||
Reference in New Issue
Block a user