[IR] Allow to fold IrGetField expressions

#KT-58923
This commit is contained in:
Ivan Kylchik
2023-05-23 11:04:48 +02:00
committed by Space Team
parent b8b8b7fd3a
commit ec4cf40f6f
10 changed files with 19 additions and 84 deletions
@@ -35,14 +35,6 @@ internal class IrConstDeclarationAnnotationTransformer(
override fun visitDeclaration(declaration: IrDeclarationBase, data: Nothing?): IrStatement {
transformAnnotations(declaration)
if (declaration is IrClass && declaration.kind == ClassKind.ANNOTATION_CLASS) {
declaration.primaryConstructor?.valueParameters?.forEach {
val defaultExpression = it.defaultValue?.expression ?: return@forEach
if (defaultExpression.canBeInterpreted()) {
it.defaultValue?.expression = transformAnnotationArgument(defaultExpression, it)
}
}
}
return super.visitDeclaration(declaration, data)
}
}
@@ -8,8 +8,10 @@ package org.jetbrains.kotlin.ir.interpreter.transformer
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrStringConcatenationImpl
@@ -51,6 +53,19 @@ internal class IrConstExpressionTransformer(
return super.visitField(declaration, data)
}
override fun visitFunction(declaration: IrFunction, data: Nothing?): IrStatement {
// It is useless to visit default accessor and if we do that we could render excess information for `IrGetField`
if (declaration.origin == IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR) return declaration
return super.visitFunction(declaration, data)
}
override fun visitGetField(expression: IrGetField, data: Nothing?): IrExpression {
if (expression.canBeInterpreted()) {
return expression.interpret(failAsError = false)
}
return super.visitGetField(expression, data)
}
override fun visitStringConcatenation(expression: IrStringConcatenation, data: Nothing?): IrExpression {
fun IrExpression.wrapInStringConcat(): IrExpression = IrStringConcatenationImpl(
this.startOffset, this.endOffset, expression.type, listOf(this@wrapInStringConcat)