[IR] Refactor IrConstOnlyNecessaryTransformer
This way it is just easier to understand what is going on.
This commit is contained in:
+23
-15
@@ -41,36 +41,44 @@ internal class IrConstOnlyNecessaryTransformer(
|
|||||||
private val jsCodeFqName = JsStandardClassIds.Callables.JsCode.asSingleFqName()
|
private val jsCodeFqName = JsStandardClassIds.Callables.JsCode.asSingleFqName()
|
||||||
|
|
||||||
override fun visitCall(expression: IrCall, data: Data): IrElement {
|
override fun visitCall(expression: IrCall, data: Data): IrElement {
|
||||||
val isConstGetter = expression.symbol.owner.property.isConst
|
|
||||||
val isJsCodeCall = expression.symbol.owner.fqNameWhenAvailable == jsCodeFqName
|
val isJsCodeCall = expression.symbol.owner.fqNameWhenAvailable == jsCodeFqName
|
||||||
if (isJsCodeCall || (!data.inConstantExpression && !isConstGetter)) {
|
if (isJsCodeCall) {
|
||||||
expression.transformChildren(this, data.copy(inConstantExpression = data.inConstantExpression || 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 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 {
|
override fun visitGetField(expression: IrGetField, data: Data): IrExpression {
|
||||||
val isConst = expression.symbol.owner.property.isConst
|
val isConst = expression.symbol.owner.property.isConst
|
||||||
if (!data.inConstantExpression && !isConst) return expression
|
if (data.inConstantExpression || isConst) {
|
||||||
return super.visitGetField(expression, data)
|
return super.visitGetField(expression, data.copy(inConstantExpression = true))
|
||||||
|
}
|
||||||
|
expression.transformChildren(this, data)
|
||||||
|
return expression
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitStringConcatenation(expression: IrStringConcatenation, data: Data): IrExpression {
|
override fun visitStringConcatenation(expression: IrStringConcatenation, data: Data): IrExpression {
|
||||||
if (!data.inConstantExpression) {
|
if (data.inConstantExpression) {
|
||||||
expression.transformChildren(this, data)
|
return super.visitStringConcatenation(expression, data.copy(inConstantExpression = true))
|
||||||
return expression
|
|
||||||
}
|
}
|
||||||
return super.visitStringConcatenation(expression, data)
|
expression.transformChildren(this, data)
|
||||||
|
return expression
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitField(declaration: IrField, data: Data): IrStatement {
|
override fun visitField(declaration: IrField, data: Data): IrStatement {
|
||||||
val isConst = declaration.property.isConst
|
val isConst = declaration.property.isConst
|
||||||
if (!isConst) {
|
if (isConst) {
|
||||||
declaration.transformChildren(this, data)
|
return super.visitField(declaration, data.copy(inConstantExpression = true))
|
||||||
return declaration
|
|
||||||
}
|
}
|
||||||
|
declaration.transformChildren(this, data)
|
||||||
return super.visitField(declaration, data)
|
return declaration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user