Workaround for a possible compiler bug in object literals
This commit is contained in:
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user