[IR] Use InlineClassesUtils in lowerings instead of IrClass.isInline

We do it because sometimes we want to treat a regular class as
an inline class. For example, in the Wasm backend we treat classes
with the `@WasmAutoboxed` annotation as inline classes. Also, in
the JS IR backend the `Char` class is declared as a regular class for
compatibility reasons, but we want it to be an inline class for
performance.
This commit is contained in:
Sergej Jaskiewicz
2021-12-09 14:29:05 +03:00
committed by Space
parent e5993ab594
commit 4f13717fea
9 changed files with 24 additions and 46 deletions
@@ -28,11 +28,13 @@ private const val INLINE_CLASS_IMPL_SUFFIX = "-impl"
class InlineClassLowering(val context: CommonBackendContext) {
private val transformedFunction = context.mapping.inlineClassMemberToStatic
private fun isClassInlineLike(irClass: IrClass): Boolean = context.inlineClassesUtils.isClassInlineLike(irClass)
val inlineClassDeclarationLowering = object : DeclarationTransformer {
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
val irClass = declaration.parent as? IrClass ?: return null
if (!irClass.isInline) return null
if (!isClassInlineLike(irClass)) return null
return when (declaration) {
is IrConstructor -> transformConstructor(declaration)
@@ -314,7 +316,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
expression.transformChildrenVoid(this)
val function = expression.symbol.owner
if (!function.parentAsClass.isInline) {
if (!isClassInlineLike(function.parentAsClass)) {
return expression
}
@@ -326,7 +328,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
val function: IrSimpleFunction = expression.symbol.owner
if (function.parent !is IrClass ||
function.isStaticMethodOfClass ||
!function.parentAsClass.isInline ||
!isClassInlineLike(function.parentAsClass) ||
!function.isReal
) {
return expression
@@ -344,7 +346,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
val function = expression.symbol.owner
val klass = function.parentAsClass
return when {
!klass.isInline -> expression
!isClassInlineLike(klass) -> expression
else -> irCall(expression, getOrCreateStaticMethod(function))
}
}
@@ -51,7 +51,7 @@ open class PropertyAccessorInlineLowering(
// TODO: temporary workarounds
if (parent.isExpect || property.isExpect) return false
if (parent.parent is IrExternalPackageFragment) return false
if (parent.isInline) return false
if (context.inlineClassesUtils.isClassInlineLike(parent)) return false
}
if (property.isEffectivelyExternal()) return false
return true