[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
@@ -11,6 +11,8 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.irString
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.IrCall
@@ -19,6 +21,9 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
interface LoggingContext {
var inVerbosePhase: Boolean
@@ -67,4 +72,34 @@ interface CommonBackendContext : BackendContext, LoggingContext {
val optimizeNullChecksUsingKotlinNullability: Boolean
get() = true
/**
* See [InlineClassesUtils].
*/
val inlineClassesUtils: InlineClassesUtils
get() = DefaultInlineClassesUtils
}
/**
* Provides means for determining if a class should be treated as an inline/value class.
*
* In certain cases (for compatibility reasons) we don't want to mark a class as `inline`, but still want to treat it as one.
*
* See [org.jetbrains.kotlin.ir.backend.js.utils.JsInlineClassesUtils].
*/
interface InlineClassesUtils {
/**
* Should this class be treated as inline class?
*/
fun isClassInlineLike(klass: IrClass): Boolean = klass.isInline
/**
* 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 =
irClass.declarations.firstIsInstanceOrNull<IrConstructor>()?.takeIf { it.isPrimary }?.valueParameters?.get(0)?.type
?: error("Class has no primary constructor: ${irClass.fqNameWhenAvailable}")
}
object DefaultInlineClassesUtils : InlineClassesUtils