[IR] Refactor IrConstOnlyNecessaryTransformer

This way it is just easier to understand what is going on.
This commit is contained in:
Ivan Kylchik
2023-11-14 13:05:25 +01:00
committed by Space Team
parent 3fa82c7bb1
commit 9742b5af73
@@ -41,36 +41,44 @@ internal class IrConstOnlyNecessaryTransformer(
private val jsCodeFqName = JsStandardClassIds.Callables.JsCode.asSingleFqName()
override fun visitCall(expression: IrCall, data: Data): IrElement {
val isConstGetter = expression.symbol.owner.property.isConst
val isJsCodeCall = expression.symbol.owner.fqNameWhenAvailable == jsCodeFqName
if (isJsCodeCall || (!data.inConstantExpression && !isConstGetter)) {
expression.transformChildren(this, data.copy(inConstantExpression = data.inConstantExpression || isJsCodeCall))
if (isJsCodeCall) {
// The `js` call itself can't be evaluated, we want ot evaluate its argument.
expression.transformChildren(this, data.copy(inConstantExpression = true))
return expression
}
return super.visitCall(expression, data)
val isConstGetter = expression.symbol.owner.property.isConst
if (data.inConstantExpression || isConstGetter) {
return super.visitCall(expression, data.copy(inConstantExpression = true))
}
expression.transformChildren(this, data)
return expression
}
override fun visitGetField(expression: IrGetField, data: Data): IrExpression {
val isConst = expression.symbol.owner.property.isConst
if (!data.inConstantExpression && !isConst) return expression
return super.visitGetField(expression, data)
if (data.inConstantExpression || isConst) {
return super.visitGetField(expression, data.copy(inConstantExpression = true))
}
expression.transformChildren(this, data)
return expression
}
override fun visitStringConcatenation(expression: IrStringConcatenation, data: Data): IrExpression {
if (!data.inConstantExpression) {
expression.transformChildren(this, data)
return expression
if (data.inConstantExpression) {
return super.visitStringConcatenation(expression, data.copy(inConstantExpression = true))
}
return super.visitStringConcatenation(expression, data)
expression.transformChildren(this, data)
return expression
}
override fun visitField(declaration: IrField, data: Data): IrStatement {
val isConst = declaration.property.isConst
if (!isConst) {
declaration.transformChildren(this, data)
return declaration
if (isConst) {
return super.visitField(declaration, data.copy(inConstantExpression = true))
}
return super.visitField(declaration, data)
declaration.transformChildren(this, data)
return declaration
}
}