IR: refactor DeclarationTransformer

Do not create extra DeclarationTransformer and FileLoweringPass
instances, instead inline all transformations to
DeclarationTransformer.lower.
This commit is contained in:
Alexander Udalov
2020-10-09 20:40:28 +02:00
parent 2be7afc7f9
commit c110031935
6 changed files with 91 additions and 114 deletions
@@ -194,105 +194,91 @@ fun FunctionLoweringPass.runOnFilePostfix(irFile: IrFile) {
interface DeclarationTransformer : FileLoweringPass {
fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>?
val withLocalDeclarations: Boolean
get() = false
override fun lower(irFile: IrFile) {
runPostfix().toFileLoweringPass().lower(irFile)
}
}
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")
val visitor = Visitor(this)
irFile.declarations.transformFlat { declaration ->
declaration.acceptVoid(visitor)
transformFlatRestricted(declaration)
}
}
override fun visitProperty(declaration: IrProperty) {
// TODO This is a hack to allow lowering a getter separately from the enclosing property
private fun transformFlatRestricted(declaration: IrDeclaration): List<IrDeclaration>? {
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)
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)
}
for (v in declaration.valueParameters) {
val result = transformer.transformFlatRestricted(v)
if (result != null) error("Don't know how to add value parameters")
}
}
declaration.backingField?.transform()
declaration.getter?.transform()
declaration.setter?.transform()
}
override fun visitProperty(declaration: IrProperty) {
// TODO This is a hack to allow lowering a getter separately from the enclosing property
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) }
val visitor = this
declaration.declarations.transformFlat(transformer::transformFlatRestricted)
}
fun IrDeclaration.transform() {
override fun visitScript(declaration: IrScript) {
ArrayList(declaration.declarations).forEach { it.accept(this, null) }
declaration.declarations.transformFlat(transformer::transformFlatRestricted)
acceptVoid(visitor)
if (withLocalDeclarations) {
declaration.statements.forEach { it.accept(this, null) }
val result = transformer.transformFlatRestricted(this)
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)
}
}
}
}
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.backend.common.lower
import org.jetbrains.kotlin.backend.common.*
import org.jetbrains.kotlin.backend.common.descriptors.synthesizedString
import org.jetbrains.kotlin.backend.common.ir.*
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
@@ -40,10 +40,7 @@ open class DefaultArgumentStubGenerator(
private val skipExternalMethods: Boolean = false,
private val forceSetOverrideSymbols: Boolean = true
) : DeclarationTransformer {
override fun lower(irFile: IrFile) {
runPostfix(true).toFileLoweringPass().lower(irFile)
}
override val withLocalDeclarations: Boolean get() = true
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (declaration is IrFunction) {
@@ -447,9 +444,7 @@ class DefaultParameterCleaner(
val context: CommonBackendContext,
val replaceDefaultValuesWithStubs: Boolean = false
) : DeclarationTransformer {
override fun lower(irFile: IrFile) {
runPostfix(true).toFileLoweringPass().lower(irFile)
}
override val withLocalDeclarations: Boolean get() = true
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (declaration is IrValueParameter && declaration.defaultValue != null) {
@@ -5,7 +5,10 @@
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.IrStatement
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.deepCopyWithSymbols
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")
@@ -88,10 +93,7 @@ class InitializersCleanupLowering(
val context: CommonBackendContext,
private val shouldEraseFieldInitializer: (IrField) -> Boolean = { it.correspondingPropertySymbol?.owner?.isConst != true }
) : DeclarationTransformer {
override fun lower(irFile: IrFile) {
runPostfix(withLocalDeclarations = true).toFileLoweringPass().lower(irFile)
}
override val withLocalDeclarations: Boolean get() = true
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (declaration is IrAnonymousInitializer) return emptyList()
@@ -31,9 +31,7 @@ interface InnerClassesSupport {
}
class InnerClassesLowering(val context: BackendContext, private val innerClassesSupport: InnerClassesSupport) : DeclarationTransformer {
override fun lower(irFile: IrFile) {
runPostfix(true).toFileLoweringPass().lower(irFile)
}
override val withLocalDeclarations: Boolean get() = true
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (declaration is IrClass && declaration.isInner) {
@@ -16,7 +16,10 @@
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.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.*
@@ -36,10 +39,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
class NullableFieldsForLateinitCreationLowering(val backendContext: CommonBackendContext) : DeclarationTransformer {
override fun lower(irFile: IrFile) {
runPostfix(true).toFileLoweringPass().lower(irFile)
}
override val withLocalDeclarations: Boolean get() = true
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (declaration is IrField) {
@@ -56,10 +56,7 @@ class NullableFieldsForLateinitCreationLowering(val backendContext: CommonBacken
// Transform declarations
class NullableFieldsDeclarationLowering(val backendContext: CommonBackendContext) : DeclarationTransformer {
override fun lower(irFile: IrFile) {
runPostfix(true).toFileLoweringPass().lower(irFile)
}
override val withLocalDeclarations: Boolean get() = true
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
when (declaration) {
@@ -5,7 +5,8 @@
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.IrStatement
import org.jetbrains.kotlin.ir.declarations.*
@@ -15,9 +16,7 @@ import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
import org.jetbrains.kotlin.ir.visitors.*
class PropertiesLowering : DeclarationTransformer {
override fun lower(irFile: IrFile) {
runPostfix(true).toFileLoweringPass().lower(irFile)
}
override val withLocalDeclarations: Boolean get() = true
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
when (declaration) {