From 9490f9da432cce0263d59f7a95bba66a698d2cbe Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Mon, 25 Oct 2021 13:05:59 +0300 Subject: [PATCH] [IR] Add `ValueRemapper` to avoid reimplementing it each time --- .../kotlin/backend/common/ir/ValueRemapper.kt | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/ValueRemapper.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/ValueRemapper.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/ValueRemapper.kt new file mode 100644 index 00000000000..e8c454c6e43 --- /dev/null +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/ValueRemapper.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.common.ir + +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrGetValue +import org.jetbrains.kotlin.ir.expressions.IrSetValue +import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrSetValueImpl +import org.jetbrains.kotlin.ir.symbols.IrValueSymbol +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid + +abstract class AbstractValueRemapper : IrElementTransformerVoid() { + + protected abstract fun remapValue(oldValue: IrValueSymbol): IrValueSymbol? + + override fun visitGetValue(expression: IrGetValue): IrExpression { + val newValue = remapValue(expression.symbol) ?: return expression + return expression.run { IrGetValueImpl(startOffset, endOffset, newValue, origin) } + } + + override fun visitSetValue(expression: IrSetValue): IrExpression { + expression.transformChildrenVoid() + val newValue = remapValue(expression.symbol) ?: return expression + assert(newValue.owner.isAssignable) + return expression.run { IrSetValueImpl(startOffset, endOffset, type, newValue, value, origin) } + } +} + +open class ValueRemapper(private val map: Map) : AbstractValueRemapper() { + override fun remapValue(oldValue: IrValueSymbol): IrValueSymbol? = map[oldValue] +} \ No newline at end of file