Make SharedVariablesLowering a BodyLoweringPass
This commit is contained in:
+14
-31
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user