[JS IR] [Wasm] Extract InlineClassesUtils into CommonBackendContext
This commit is contained in:
+35
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user