Make SharedVariablesLowering a BodyLoweringPass

This commit is contained in:
Anton Bannykh
2019-12-19 17:48:49 +03:00
parent 936e53d044
commit 2fa04afbf2
@@ -17,7 +17,7 @@
package org.jetbrains.kotlin.backend.common.lower package org.jetbrains.kotlin.backend.common.lower
import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.common.BackendContext
import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.BodyLoweringPass
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
@@ -26,7 +26,9 @@ import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.util.dump
import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
val sharedVariablesPhase = makeIrFilePhase( val sharedVariablesPhase = makeIrFilePhase(
::SharedVariablesLowering, ::SharedVariablesLowering,
@@ -36,35 +38,16 @@ val sharedVariablesPhase = makeIrFilePhase(
object CoroutineIntrinsicLambdaOrigin : IrStatementOriginImpl("Coroutine intrinsic lambda") object CoroutineIntrinsicLambdaOrigin : IrStatementOriginImpl("Coroutine intrinsic lambda")
class SharedVariablesLowering(val context: BackendContext) : FileLoweringPass { class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass {
override fun lower(irFile: IrFile) {
irFile.acceptChildrenVoid(object : IrElementVisitorVoid {
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
}
override fun visitFunction(declaration: IrFunction) { override fun lower(irBody: IrBody, container: IrDeclaration) {
declaration.acceptChildrenVoid(this) // TODO remove this condition
if (container is IrFunction || container is IrField || container is IrAnonymousInitializer) {
SharedVariablesTransformer(declaration).lowerSharedVariables() SharedVariablesTransformer(irBody, container).lowerSharedVariables()
} }
override fun visitField(declaration: IrField) {
declaration.acceptChildrenVoid(this)
SharedVariablesTransformer(declaration).lowerSharedVariables()
}
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) {
declaration.acceptChildrenVoid(this)
SharedVariablesTransformer(declaration).lowerSharedVariables()
}
})
} }
private inner class SharedVariablesTransformer(val irBody: IrBody, val irDeclaration: IrDeclaration) {
private inner class SharedVariablesTransformer(val irDeclaration: IrDeclaration) {
private val sharedVariables = HashSet<IrVariable>() private val sharedVariables = HashSet<IrVariable>()
fun lowerSharedVariables() { fun lowerSharedVariables() {
@@ -75,7 +58,7 @@ class SharedVariablesLowering(val context: BackendContext) : FileLoweringPass {
} }
private fun collectSharedVariables() { private fun collectSharedVariables() {
irDeclaration.accept(object : IrElementVisitor<Unit, IrDeclarationParent?> { irBody.accept(object : IrElementVisitor<Unit, IrDeclarationParent?> {
val relevantVars = HashSet<IrVariable>() val relevantVars = HashSet<IrVariable>()
val relevantVals = HashSet<IrVariable>() val relevantVals = HashSet<IrVariable>()
@@ -134,7 +117,7 @@ class SharedVariablesLowering(val context: BackendContext) : FileLoweringPass {
private fun rewriteSharedVariables() { private fun rewriteSharedVariables() {
val transformedSymbols = HashMap<IrValueSymbol, IrVariableSymbol>() val transformedSymbols = HashMap<IrValueSymbol, IrVariableSymbol>()
irDeclaration.transformChildrenVoid(object : IrElementTransformerVoid() { irBody.transformChildrenVoid(object : IrElementTransformerVoid() {
override fun visitVariable(declaration: IrVariable): IrStatement { override fun visitVariable(declaration: IrVariable): IrStatement {
declaration.transformChildrenVoid(this) declaration.transformChildrenVoid(this)
@@ -148,7 +131,7 @@ class SharedVariablesLowering(val context: BackendContext) : FileLoweringPass {
} }
}) })
irDeclaration.transformChildrenVoid(object : IrElementTransformerVoid() { irBody.transformChildrenVoid(object : IrElementTransformerVoid() {
override fun visitGetValue(expression: IrGetValue): IrExpression { override fun visitGetValue(expression: IrGetValue): IrExpression {
expression.transformChildrenVoid(this) expression.transformChildrenVoid(this)