[IR BE] Fix SharedVariableLowering

* make it able to detect shared vars under any declaration kind, not only IrFunction
 * Add & update tests
This commit is contained in:
Roman Artemev
2018-12-14 15:28:01 +03:00
committed by romanart
parent 04395366fa
commit 256317da15
8 changed files with 46 additions and 24 deletions
@@ -18,12 +18,9 @@ package org.jetbrains.kotlin.backend.common.lower
import org.jetbrains.kotlin.backend.common.BackendContext
import org.jetbrains.kotlin.backend.common.FunctionLoweringPass
import org.jetbrains.kotlin.backend.common.makePhase
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrGetValue
import org.jetbrains.kotlin.ir.expressions.IrSetVariable
@@ -50,40 +47,33 @@ class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPas
}
private fun collectSharedVariables() {
irFunction.acceptVoid(object : IrElementVisitorVoid {
val declarationsStack = ArrayDeque<IrDeclaration>()
val currentDeclaration: IrDeclaration
get() = declarationsStack.peek()
irFunction.accept(object : IrElementVisitor<Unit, IrDeclarationParent> {
val relevantVars = HashSet<IrVariable>()
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
override fun visitElement(element: IrElement, data: IrDeclarationParent) {
element.acceptChildren(this, data)
}
override fun visitFunction(declaration: IrFunction) {
declarationsStack.push(declaration)
declaration.acceptChildrenVoid(this)
declarationsStack.pop()
}
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent) =
super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data)
override fun visitVariable(declaration: IrVariable) {
declaration.acceptChildrenVoid(this)
override fun visitVariable(declaration: IrVariable, data: IrDeclarationParent) {
declaration.acceptChildren(this, data)
if (declaration.isVar) {
relevantVars.add(declaration)
}
}
override fun visitVariableAccess(expression: IrValueAccessExpression) {
expression.acceptChildrenVoid(this)
override fun visitValueAccess(expression: IrValueAccessExpression, data: IrDeclarationParent) {
expression.acceptChildren(this, data)
val value = expression.symbol.owner
if (value in relevantVars && (value as IrVariable).parent != currentDeclaration) {
if (value in relevantVars && (value as IrVariable).parent != data) {
sharedVariables.add(value)
}
}
})
}, irFunction)
}
private fun rewriteSharedVariables() {