[JS IR] [Wasm] Extract InlineClassesUtils into CommonBackendContext

This commit is contained in:
Sergej Jaskiewicz
2021-12-09 14:18:48 +03:00
committed by Space
parent 962ca40687
commit e5993ab594
4 changed files with 82 additions and 39 deletions
@@ -6,20 +6,15 @@
package org.jetbrains.kotlin.backend.wasm.utils
import org.jetbrains.kotlin.backend.wasm.WasmSymbols
import org.jetbrains.kotlin.ir.backend.js.InlineClassesUtils
import org.jetbrains.kotlin.ir.backend.js.JsCommonInlineClassesUtils
import org.jetbrains.kotlin.ir.backend.js.utils.erase
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.isNullable
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
class WasmInlineClassesUtils(private val wasmSymbols: WasmSymbols) : InlineClassesUtils {
override fun isTypeInlined(type: IrType): Boolean {
return getInlinedClass(type) != null
}
class WasmInlineClassesUtils(private val wasmSymbols: WasmSymbols) : JsCommonInlineClassesUtils {
override fun getInlinedClass(type: IrType): IrClass? {
if (type is IrSimpleType) {
@@ -36,7 +31,7 @@ class WasmInlineClassesUtils(private val wasmSymbols: WasmSymbols) : InlineClass
override fun isClassInlineLike(klass: IrClass): Boolean {
// TODO: This hook is called from autoboxing lowering so we also handle autoboxing annotation here. In the future it's better
// to separate autoboxing from the inline class handling.
return klass.isInline || klass.hasWasmAutoboxedAnnotation()
return super.isClassInlineLike(klass) || klass.hasWasmAutoboxedAnnotation()
}
override val boxIntrinsic: IrSimpleFunctionSymbol
@@ -44,17 +39,4 @@ class WasmInlineClassesUtils(private val wasmSymbols: WasmSymbols) : InlineClass
override val unboxIntrinsic: IrSimpleFunctionSymbol
get() = wasmSymbols.unboxIntrinsic
/**
* Unlike [org.jetbrains.kotlin.ir.util.getInlineClassUnderlyingType], doesn't use [IrClass.inlineClassRepresentation] because
* for some reason it can be called for classes which are not inline, e.g. `kotlin.Double`.
*/
fun getInlineClassUnderlyingType(irClass: IrClass): IrType {
for (declaration in irClass.declarations) {
if (declaration is IrConstructor && declaration.isPrimary) {
return declaration.valueParameters[0].type
}
}
error("Class has no primary constructor: ${irClass.fqNameWhenAvailable}")
}
}