Workaround for a possible compiler bug in object literals

This commit is contained in:
Dmitry Petrov
2020-10-08 13:21:44 +03:00
parent 23beaa5883
commit 92fa13cbab
@@ -120,7 +120,11 @@ fun DeclarationContainerLoweringPass.runOnFilePostfix(irFile: IrFile) {
this.lower(irFile as IrDeclarationContainer) this.lower(irFile as IrDeclarationContainer)
} }
fun BodyLoweringPass.runOnFilePostfix(irFile: IrFile, withLocalDeclarations: Boolean = false, allowDeclarationModification: Boolean = false) { fun BodyLoweringPass.runOnFilePostfix(
irFile: IrFile,
withLocalDeclarations: Boolean = false,
allowDeclarationModification: Boolean = false
) {
ArrayList(irFile.declarations).forEach { ArrayList(irFile.declarations).forEach {
it.accept(object : IrElementVisitor<Unit, IrDeclaration?> { it.accept(object : IrElementVisitor<Unit, IrDeclaration?> {
override fun visitElement(element: IrElement, data: IrDeclaration?) { override fun visitElement(element: IrElement, data: IrDeclaration?) {
@@ -198,7 +202,17 @@ fun DeclarationTransformer.toFileLoweringPass(): FileLoweringPass {
fun DeclarationTransformer.runPostfix(withLocalDeclarations: Boolean = false): DeclarationTransformer { fun DeclarationTransformer.runPostfix(withLocalDeclarations: Boolean = false): DeclarationTransformer {
return object : DeclarationTransformer { return object : DeclarationTransformer {
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? { override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
declaration.acceptVoid(object : IrElementVisitorVoid { 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) { override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this) element.acceptChildrenVoid(this)
} }
@@ -214,7 +228,7 @@ fun DeclarationTransformer.runPostfix(withLocalDeclarations: Boolean = false): D
declaration.acceptChildrenVoid(this) declaration.acceptChildrenVoid(this)
for (v in declaration.valueParameters) { for (v in declaration.valueParameters) {
val result = this@runPostfix.transformFlatRestricted(v) val result = transformer.transformFlatRestricted(v)
if (result != null) error("Don't know how to add value parameters") if (result != null) error("Don't know how to add value parameters")
} }
} }
@@ -228,7 +242,7 @@ fun DeclarationTransformer.runPostfix(withLocalDeclarations: Boolean = false): D
acceptVoid(visitor) acceptVoid(visitor)
val result = this@runPostfix.transformFlatRestricted(this) val result = transformer.transformFlatRestricted(this)
if (result != null) { if (result != null) {
(parent as? IrDeclarationContainer)?.let { (parent as? IrDeclarationContainer)?.let {
var index = it.declarations.indexOf(this) var index = it.declarations.indexOf(this)
@@ -254,12 +268,12 @@ fun DeclarationTransformer.runPostfix(withLocalDeclarations: Boolean = false): D
declaration.typeParameters.forEach { it.accept(this, null) } declaration.typeParameters.forEach { it.accept(this, null) }
ArrayList(declaration.declarations).forEach { it.accept(this, null) } ArrayList(declaration.declarations).forEach { it.accept(this, null) }
declaration.declarations.transformFlat(this@runPostfix::transformFlatRestricted) declaration.declarations.transformFlat(transformer::transformFlatRestricted)
} }
override fun visitScript(declaration: IrScript) { override fun visitScript(declaration: IrScript) {
ArrayList(declaration.declarations).forEach { it.accept(this, null) } ArrayList(declaration.declarations).forEach { it.accept(this, null) }
declaration.declarations.transformFlat(this@runPostfix::transformFlatRestricted) declaration.declarations.transformFlat(transformer::transformFlatRestricted)
if (withLocalDeclarations) { if (withLocalDeclarations) {
declaration.statements.forEach { it.accept(this, null) } declaration.statements.forEach { it.accept(this, null) }
@@ -267,9 +281,4 @@ fun DeclarationTransformer.runPostfix(withLocalDeclarations: Boolean = false): D
declaration.thisReceiver.accept(this, null) declaration.thisReceiver.accept(this, null)
} }
})
return this@runPostfix.transformFlatRestricted(declaration)
}
}
} }