[K/JS, K/WASM] feat(Enum.entries): add support of new enum static field for JS and WASM.
This commit is contained in:
+5
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
|||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.isDispatchReceiver
|
import org.jetbrains.kotlin.ir.backend.js.utils.isDispatchReceiver
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
@@ -46,7 +47,11 @@ interface JsCommonBackendContext : CommonBackendContext {
|
|||||||
val suiteFun: IrSimpleFunctionSymbol?
|
val suiteFun: IrSimpleFunctionSymbol?
|
||||||
val testFun: IrSimpleFunctionSymbol?
|
val testFun: IrSimpleFunctionSymbol?
|
||||||
|
|
||||||
|
val enumEntries: IrClassSymbol
|
||||||
|
val createEnumEntries: IrSimpleFunctionSymbol
|
||||||
|
|
||||||
fun createTestContainerFun(irFile: IrFile): IrSimpleFunction
|
fun createTestContainerFun(irFile: IrFile): IrSimpleFunction
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: investigate if it could be removed
|
// TODO: investigate if it could be removed
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.compilationException
|
|||||||
import org.jetbrains.kotlin.backend.common.ir.Ir
|
import org.jetbrains.kotlin.backend.common.ir.Ir
|
||||||
import org.jetbrains.kotlin.backend.common.ir.Symbols
|
import org.jetbrains.kotlin.backend.common.ir.Symbols
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
|
import org.jetbrains.kotlin.builtins.isFunctionType
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
@@ -141,6 +142,7 @@ class JsIrBackendContext(
|
|||||||
// TODO: what is more clear way reference this getter?
|
// TODO: what is more clear way reference this getter?
|
||||||
private val REFLECT_PACKAGE_FQNAME = KOTLIN_PACKAGE_FQN.child(Name.identifier("reflect"))
|
private val REFLECT_PACKAGE_FQNAME = KOTLIN_PACKAGE_FQN.child(Name.identifier("reflect"))
|
||||||
private val JS_PACKAGE_FQNAME = KOTLIN_PACKAGE_FQN.child(Name.identifier("js"))
|
private val JS_PACKAGE_FQNAME = KOTLIN_PACKAGE_FQN.child(Name.identifier("js"))
|
||||||
|
private val ENUMS_PACKAGE_FQNAME = KOTLIN_PACKAGE_FQN.child(Name.identifier("enums"))
|
||||||
private val JS_POLYFILLS_PACKAGE = JS_PACKAGE_FQNAME.child(Name.identifier("polyfill"))
|
private val JS_POLYFILLS_PACKAGE = JS_PACKAGE_FQNAME.child(Name.identifier("polyfill"))
|
||||||
private val JS_INTERNAL_PACKAGE_FQNAME = JS_PACKAGE_FQNAME.child(Name.identifier("internal"))
|
private val JS_INTERNAL_PACKAGE_FQNAME = JS_PACKAGE_FQNAME.child(Name.identifier("internal"))
|
||||||
|
|
||||||
@@ -188,6 +190,11 @@ class JsIrBackendContext(
|
|||||||
override val coroutineSymbols =
|
override val coroutineSymbols =
|
||||||
JsCommonCoroutineSymbols(symbolTable, module, this)
|
JsCommonCoroutineSymbols(symbolTable, module, this)
|
||||||
|
|
||||||
|
override val enumEntries = getIrClass(ENUMS_PACKAGE_FQNAME.child(Name.identifier("EnumEntries")))
|
||||||
|
override val createEnumEntries = getFunctions(ENUMS_PACKAGE_FQNAME.child(Name.identifier("enumEntries")))
|
||||||
|
.find { it.valueParameters.firstOrNull()?.type?.isFunctionType == true }
|
||||||
|
.let { symbolTable.referenceSimpleFunction(it!!) }
|
||||||
|
|
||||||
override val ir = object : Ir<JsIrBackendContext>(this, irModuleFragment) {
|
override val ir = object : Ir<JsIrBackendContext>(this, irModuleFragment) {
|
||||||
override val symbols = object : Symbols<JsIrBackendContext>(this@JsIrBackendContext, irBuiltIns, symbolTable) {
|
override val symbols = object : Symbols<JsIrBackendContext>(this@JsIrBackendContext, irBuiltIns, symbolTable) {
|
||||||
override val throwNullPointerException =
|
override val throwNullPointerException =
|
||||||
|
|||||||
@@ -337,10 +337,14 @@ private val enumEntryCreateGetInstancesFunsLoweringPhase = makeDeclarationTransf
|
|||||||
)
|
)
|
||||||
|
|
||||||
private val enumSyntheticFunsLoweringPhase = makeDeclarationTransformerPhase(
|
private val enumSyntheticFunsLoweringPhase = makeDeclarationTransformerPhase(
|
||||||
::EnumSyntheticFunctionsLowering,
|
{ EnumSyntheticFunctionsAndPropertiesLowering(it, supportRawFunctionReference = true) },
|
||||||
name = "EnumSyntheticFunctionsLowering",
|
name = "EnumSyntheticFunctionsAndPropertiesLowering",
|
||||||
description = "Implement `valueOf` and `values`",
|
description = "Implement `valueOf, `values` and `entries`",
|
||||||
prerequisite = setOf(enumClassConstructorLoweringPhase, enumClassCreateInitializerLoweringPhase)
|
prerequisite = setOf(
|
||||||
|
enumClassConstructorLoweringPhase,
|
||||||
|
enumClassCreateInitializerLoweringPhase,
|
||||||
|
enumEntryCreateGetInstancesFunsLoweringPhase
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
private val enumUsageLoweringPhase = makeBodyLoweringPhase(
|
private val enumUsageLoweringPhase = makeBodyLoweringPhase(
|
||||||
|
|||||||
+64
-13
@@ -20,13 +20,10 @@ import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
|
|||||||
import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin
|
import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
|
import org.jetbrains.kotlin.ir.builders.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.types.makeNullable
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||||
@@ -461,10 +458,16 @@ private val IrClass.isInstantiableEnum: Boolean
|
|||||||
private val IrDeclaration.parentEnumClassOrNull: IrClass?
|
private val IrDeclaration.parentEnumClassOrNull: IrClass?
|
||||||
get() = parents.filterIsInstance<IrClass>().firstOrNull { it.isInstantiableEnum }
|
get() = parents.filterIsInstance<IrClass>().firstOrNull { it.isInstantiableEnum }
|
||||||
|
|
||||||
class EnumSyntheticFunctionsLowering(val context: JsCommonBackendContext) : DeclarationTransformer {
|
private const val ENTRIES_FIELD_NAME = "\$ENTRIES"
|
||||||
|
|
||||||
|
class EnumSyntheticFunctionsAndPropertiesLowering(
|
||||||
|
val context: JsCommonBackendContext,
|
||||||
|
private val supportRawFunctionReference: Boolean = false,
|
||||||
|
private val syntheticFieldsShouldBeReinitialized: Boolean = false,
|
||||||
|
) : DeclarationTransformer {
|
||||||
private val IrEnumEntry.getInstanceFun by context.mapping.enumEntryToGetInstanceFun
|
private val IrEnumEntry.getInstanceFun by context.mapping.enumEntryToGetInstanceFun
|
||||||
private val IrClass.initEntryInstancesFun: IrSimpleFunction? by context.mapping.enumClassToInitEntryInstancesFun
|
private val IrClass.initEntryInstancesFun: IrSimpleFunction? by context.mapping.enumClassToInitEntryInstancesFun
|
||||||
|
private val IrClass.enumArrayType get() = context.irBuiltIns.arrayClass.typeWith(defaultType)
|
||||||
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
if (declaration is IrConstructor && declaration.isPrimary && declaration.parentEnumClassOrNull != null &&
|
if (declaration is IrConstructor && declaration.isPrimary && declaration.parentEnumClassOrNull != null &&
|
||||||
@@ -490,7 +493,7 @@ class EnumSyntheticFunctionsLowering(val context: JsCommonBackendContext) : Decl
|
|||||||
statements += when (kind) {
|
statements += when (kind) {
|
||||||
IrSyntheticBodyKind.ENUM_VALUES -> createEnumValuesBody(declaration, enumClass)
|
IrSyntheticBodyKind.ENUM_VALUES -> createEnumValuesBody(declaration, enumClass)
|
||||||
IrSyntheticBodyKind.ENUM_VALUEOF -> createEnumValueOfBody(declaration, enumClass)
|
IrSyntheticBodyKind.ENUM_VALUEOF -> createEnumValueOfBody(declaration, enumClass)
|
||||||
IrSyntheticBodyKind.ENUM_ENTRIES -> TODO("NOT IMPLEMENTED ON JS")
|
IrSyntheticBodyKind.ENUM_ENTRIES -> createEnumEntriesBody(declaration, enumClass)
|
||||||
}.statements
|
}.statements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -502,6 +505,56 @@ class EnumSyntheticFunctionsLowering(val context: JsCommonBackendContext) : Decl
|
|||||||
|
|
||||||
private val throwISESymbol = context.ir.symbols.throwISE
|
private val throwISESymbol = context.ir.symbols.throwISE
|
||||||
|
|
||||||
|
private fun createEnumEntriesBody(entriesGetter: IrFunction, enumClass: IrClass): IrBlockBody {
|
||||||
|
val entriesField = enumClass.addEnumEntriesField()
|
||||||
|
return context.createIrBuilder(entriesGetter.symbol).run {
|
||||||
|
irBlockBody {
|
||||||
|
if (syntheticFieldsShouldBeReinitialized) {
|
||||||
|
+irIfThen(
|
||||||
|
irEqualsNull(irGetField(null, entriesField)),
|
||||||
|
irSetField(null, entriesField, entriesField.initializer!!.expression)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
+irReturn(irGetField(null, entriesField))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrClass.addEnumEntriesField(): IrField {
|
||||||
|
return buildEntriesField(searchForValuesFunction())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrClass.searchForValuesFunction(): IrFunction {
|
||||||
|
return declarations.find { it is IrFunction && it.isStatic && it.returnType.isArray() } as IrFunction
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrClass.buildEntriesField(entriesHelper: IrFunction): IrField = with(context) {
|
||||||
|
addField {
|
||||||
|
name = Name.identifier(ENTRIES_FIELD_NAME)
|
||||||
|
type = enumEntries.defaultType
|
||||||
|
visibility = PRIVATE
|
||||||
|
origin = IrDeclarationOrigin.FIELD_FOR_ENUM_ENTRIES
|
||||||
|
isFinal = true
|
||||||
|
isStatic = true
|
||||||
|
}.apply {
|
||||||
|
initializer = context.createIrBuilder(symbol).run {
|
||||||
|
irExprBody(irCall(createEnumEntries).apply {
|
||||||
|
val referenceType = context.irBuiltIns.functionN(0).typeWith(enumEntries.defaultType)
|
||||||
|
putValueArgument(0, referenceFor(entriesHelper, referenceType))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrBuilderWithScope.referenceFor(function: IrFunction, type: IrType): IrDeclarationReference {
|
||||||
|
return if (supportRawFunctionReference) {
|
||||||
|
irRawFunctionReferefence(type, function.symbol)
|
||||||
|
} else {
|
||||||
|
irFunctionReference(type, function.symbol)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun createEnumValueOfBody(valueOfFun: IrFunction, irClass: IrClass): IrBlockBody {
|
private fun createEnumValueOfBody(valueOfFun: IrFunction, irClass: IrClass): IrBlockBody {
|
||||||
val nameParameter = valueOfFun.valueParameters[0]
|
val nameParameter = valueOfFun.valueParameters[0]
|
||||||
|
|
||||||
@@ -524,14 +577,12 @@ class EnumSyntheticFunctionsLowering(val context: JsCommonBackendContext) : Decl
|
|||||||
|
|
||||||
private fun createEnumValuesBody(valuesFun: IrFunction, irClass: IrClass): IrBlockBody {
|
private fun createEnumValuesBody(valuesFun: IrFunction, irClass: IrClass): IrBlockBody {
|
||||||
return context.createIrBuilder(valuesFun.symbol).run {
|
return context.createIrBuilder(valuesFun.symbol).run {
|
||||||
irBlockBody {
|
irBlockBody { +irReturn(arrayOfEnumEntriesOf(irClass)) }
|
||||||
val instances = irClass.enumEntries.map { irCall(it.getInstanceFun!!) }
|
|
||||||
+irReturn(
|
|
||||||
IrVarargImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, valuesFun.returnType, irClass.defaultType, instances)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun IrBuilderWithScope.arrayOfEnumEntriesOf(enumClass: IrClass) =
|
||||||
|
irVararg(enumClass.defaultType, enumClass.enumEntries.map { irCall(it.getInstanceFun!!) })
|
||||||
}
|
}
|
||||||
|
|
||||||
private val IrClass.enumEntries: List<IrEnumEntry>
|
private val IrClass.enumEntries: List<IrEnumEntry>
|
||||||
|
|||||||
-1
@@ -38,7 +38,6 @@ import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.name.SpecialNames
|
import org.jetbrains.kotlin.name.SpecialNames
|
||||||
import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SERIALIZABLE_LAMBDA_ANNOTATION_FQ_NAME
|
import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SERIALIZABLE_LAMBDA_ANNOTATION_FQ_NAME
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
|
||||||
|
|
||||||
internal val functionReferencePhase = makeIrFilePhase(
|
internal val functionReferencePhase = makeIrFilePhase(
|
||||||
::FunctionReferenceLowering,
|
::FunctionReferenceLowering,
|
||||||
|
|||||||
@@ -105,6 +105,9 @@ class WasmBackendContext(
|
|||||||
val wasmSymbols: WasmSymbols = WasmSymbols(this@WasmBackendContext, symbolTable)
|
val wasmSymbols: WasmSymbols = WasmSymbols(this@WasmBackendContext, symbolTable)
|
||||||
override val reflectionSymbols: ReflectionSymbols get() = wasmSymbols.reflectionSymbols
|
override val reflectionSymbols: ReflectionSymbols get() = wasmSymbols.reflectionSymbols
|
||||||
|
|
||||||
|
override val enumEntries = wasmSymbols.enumEntries
|
||||||
|
override val createEnumEntries = wasmSymbols.createEnumEntries
|
||||||
|
|
||||||
override val propertyLazyInitialization: PropertyLazyInitialization =
|
override val propertyLazyInitialization: PropertyLazyInitialization =
|
||||||
PropertyLazyInitialization(enabled = propertyLazyInitialization, eagerInitialization = wasmSymbols.eagerInitialization)
|
PropertyLazyInitialization(enabled = propertyLazyInitialization, eagerInitialization = wasmSymbols.eagerInitialization)
|
||||||
|
|
||||||
|
|||||||
+13
-9
@@ -207,10 +207,14 @@ private val enumEntryCreateGetInstancesFunsLoweringPhase = makeWasmModulePhase(
|
|||||||
)
|
)
|
||||||
|
|
||||||
private val enumSyntheticFunsLoweringPhase = makeWasmModulePhase(
|
private val enumSyntheticFunsLoweringPhase = makeWasmModulePhase(
|
||||||
::EnumSyntheticFunctionsLowering,
|
{ EnumSyntheticFunctionsAndPropertiesLowering(it, syntheticFieldsShouldBeReinitialized = true) },
|
||||||
name = "EnumSyntheticFunctionsLowering",
|
name = "EnumSyntheticFunctionsAndPropertiesLowering",
|
||||||
description = "Implement `valueOf` and `values`",
|
description = "Implement `valueOf`, `values` and `entries`",
|
||||||
prerequisite = setOf(enumClassConstructorLoweringPhase, enumClassCreateInitializerLoweringPhase)
|
prerequisite = setOf(
|
||||||
|
enumClassConstructorLoweringPhase,
|
||||||
|
enumClassCreateInitializerLoweringPhase,
|
||||||
|
enumEntryCreateGetInstancesFunsLoweringPhase
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
private val enumUsageLoweringPhase = makeWasmModulePhase(
|
private val enumUsageLoweringPhase = makeWasmModulePhase(
|
||||||
@@ -574,6 +578,11 @@ val wasmPhases = NamedCompilerPhase(
|
|||||||
|
|
||||||
enumClassConstructorLoweringPhase then
|
enumClassConstructorLoweringPhase then
|
||||||
enumClassConstructorBodyLoweringPhase then
|
enumClassConstructorBodyLoweringPhase then
|
||||||
|
enumEntryInstancesLoweringPhase then
|
||||||
|
enumEntryInstancesBodyLoweringPhase then
|
||||||
|
enumClassCreateInitializerLoweringPhase then
|
||||||
|
enumEntryCreateGetInstancesFunsLoweringPhase then
|
||||||
|
enumSyntheticFunsLoweringPhase then
|
||||||
|
|
||||||
sharedVariablesLoweringPhase then
|
sharedVariablesLoweringPhase then
|
||||||
propertyReferenceLowering then
|
propertyReferenceLowering then
|
||||||
@@ -596,11 +605,6 @@ val wasmPhases = NamedCompilerPhase(
|
|||||||
jsInteropFunctionsLowering then
|
jsInteropFunctionsLowering then
|
||||||
jsInteropFunctionCallsLowering then
|
jsInteropFunctionCallsLowering then
|
||||||
|
|
||||||
enumEntryInstancesLoweringPhase then
|
|
||||||
enumEntryInstancesBodyLoweringPhase then
|
|
||||||
enumClassCreateInitializerLoweringPhase then
|
|
||||||
enumEntryCreateGetInstancesFunsLoweringPhase then
|
|
||||||
enumSyntheticFunsLoweringPhase then
|
|
||||||
enumUsageLoweringPhase then
|
enumUsageLoweringPhase then
|
||||||
enumEntryRemovalLoweringPhase then
|
enumEntryRemovalLoweringPhase then
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.wasm
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.ir.Symbols
|
import org.jetbrains.kotlin.backend.common.ir.Symbols
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
|
import org.jetbrains.kotlin.builtins.isFunctionType
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
|
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
@@ -35,6 +36,8 @@ class WasmSymbols(
|
|||||||
|
|
||||||
private val kotlinTopLevelPackage: PackageViewDescriptor =
|
private val kotlinTopLevelPackage: PackageViewDescriptor =
|
||||||
context.module.getPackage(FqName("kotlin"))
|
context.module.getPackage(FqName("kotlin"))
|
||||||
|
private val enumsInternalPackage: PackageViewDescriptor =
|
||||||
|
context.module.getPackage(FqName("kotlin.enums"))
|
||||||
private val wasmInternalPackage: PackageViewDescriptor =
|
private val wasmInternalPackage: PackageViewDescriptor =
|
||||||
context.module.getPackage(FqName("kotlin.wasm.internal"))
|
context.module.getPackage(FqName("kotlin.wasm.internal"))
|
||||||
private val collectionsPackage: PackageViewDescriptor =
|
private val collectionsPackage: PackageViewDescriptor =
|
||||||
@@ -100,6 +103,11 @@ class WasmSymbols(
|
|||||||
override val returnIfSuspended =
|
override val returnIfSuspended =
|
||||||
getInternalFunction("returnIfSuspended")
|
getInternalFunction("returnIfSuspended")
|
||||||
|
|
||||||
|
val enumEntries = getIrClass(FqName.fromSegments(listOf("kotlin", "enums", "EnumEntries")))
|
||||||
|
val createEnumEntries = findFunctions(enumsInternalPackage.memberScope, Name.identifier("enumEntries"))
|
||||||
|
.find { it.valueParameters.firstOrNull()?.type?.isFunctionType == true }
|
||||||
|
.let { symbolTable.referenceSimpleFunction(it!!) }
|
||||||
|
|
||||||
val coroutineEmptyContinuation: IrPropertySymbol = symbolTable.referenceProperty(
|
val coroutineEmptyContinuation: IrPropertySymbol = symbolTable.referenceProperty(
|
||||||
getProperty(FqName.fromSegments(listOf("kotlin", "wasm", "internal", "EmptyContinuation")))
|
getProperty(FqName.fromSegments(listOf("kotlin", "wasm", "internal", "EmptyContinuation")))
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -350,6 +350,16 @@ fun IrBuilderWithScope.irVararg(elementType: IrType, values: List<IrExpression>)
|
|||||||
fun IrBuilderWithScope.irRawFunctionReferefence(type: IrType, symbol: IrFunctionSymbol) =
|
fun IrBuilderWithScope.irRawFunctionReferefence(type: IrType, symbol: IrFunctionSymbol) =
|
||||||
IrRawFunctionReferenceImpl(startOffset, endOffset, type, symbol)
|
IrRawFunctionReferenceImpl(startOffset, endOffset, type, symbol)
|
||||||
|
|
||||||
|
fun IrBuilderWithScope.irFunctionReference(type: IrType, symbol: IrFunctionSymbol) =
|
||||||
|
IrFunctionReferenceImpl(
|
||||||
|
startOffset,
|
||||||
|
endOffset,
|
||||||
|
type,
|
||||||
|
symbol,
|
||||||
|
symbol.owner.typeParameters.size,
|
||||||
|
symbol.owner.valueParameters.size
|
||||||
|
)
|
||||||
|
|
||||||
fun IrBuilderWithScope.irTry(type: IrType, tryResult: IrExpression, catches: List<IrCatch>, finallyExpression: IrExpression?) =
|
fun IrBuilderWithScope.irTry(type: IrType, tryResult: IrExpression, catches: List<IrCatch>, finallyExpression: IrExpression?) =
|
||||||
IrTryImpl(startOffset, endOffset, type, tryResult, catches, finallyExpression)
|
IrTryImpl(startOffset, endOffset, type, tryResult, catches, finallyExpression)
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -1,6 +1,7 @@
|
|||||||
// !LANGUAGE: +EnumEntries
|
// !LANGUAGE: +EnumEntries
|
||||||
// TARGET_BACKEND: JVM_IR
|
// IGNORE_BACKEND: JS, JVM
|
||||||
// TARGET_BACKEND: NATIVE
|
// IGNORE_LIGHT_ANALYSIS
|
||||||
|
// FULL_JDK
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
enum class MyEnum {
|
enum class MyEnum {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
// AFTER KT-53649 - TARGET_BACKEND: NATIVE
|
// AFTER KT-53649 - TARGET_BACKEND: NATIVE, JS_IR
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
// AFTER KT-53649 - TARGET_BACKEND: NATIVE
|
// AFTER KT-53649 - TARGET_BACKEND: NATIVE, JS_IR
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
// AFTER KT-53649 - TARGET_BACKEND: NATIVE
|
// AFTER KT-53649 - TARGET_BACKEND: NATIVE, JS_IR
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// IGNORE_BACKEND: JS, JVM, WASM
|
||||||
// TARGET_BACKEND: NATIVE
|
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
@@ -9,7 +8,7 @@ enum class MyEnum {
|
|||||||
Nope, OK
|
Nope, OK
|
||||||
}
|
}
|
||||||
|
|
||||||
// MODULE: caller(lib)
|
// MODULE: main(lib)
|
||||||
// !LANGUAGE: +EnumEntries
|
// !LANGUAGE: +EnumEntries
|
||||||
// FILE: Box.kt
|
// FILE: Box.kt
|
||||||
@OptIn(ExperimentalStdlibApi::class)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// !LANGUAGE: +EnumEntries
|
// !LANGUAGE: +EnumEntries
|
||||||
// TARGET_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
// TARGET_BACKEND: NATIVE
|
// IGNORE_BACKEND: JS, JVM
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
enum class EnumWithClash {
|
enum class EnumWithClash {
|
||||||
|
|||||||
+18
@@ -16077,6 +16077,24 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt");
|
runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntries.kt")
|
||||||
|
public void testEnumEntries() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntries.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntriesMultimoduleNoMappings.kt")
|
||||||
|
public void testEnumEntriesMultimoduleNoMappings() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesMultimoduleNoMappings.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntriesNameClashes.kt")
|
||||||
|
public void testEnumEntriesNameClashes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("enumEntryMembers.kt")
|
@TestMetadata("enumEntryMembers.kt")
|
||||||
public void testEnumEntryMembers() throws Exception {
|
public void testEnumEntryMembers() throws Exception {
|
||||||
|
|||||||
+15
@@ -13171,6 +13171,21 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/enum/bigEnum.kt");
|
runTest("compiler/testData/codegen/box/enum/bigEnum.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("enumEntries.kt")
|
||||||
|
public void ignoreEnumEntries() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntries.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("enumEntriesMultimoduleNoMappings.kt")
|
||||||
|
public void ignoreEnumEntriesMultimoduleNoMappings() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesMultimoduleNoMappings.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("enumEntriesNameClashes.kt")
|
||||||
|
public void ignoreEnumEntriesNameClashes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
private void runTest(String testDataFilePath) throws Exception {
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||||
}
|
}
|
||||||
|
|||||||
+18
@@ -12419,6 +12419,24 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt");
|
runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntries.kt")
|
||||||
|
public void testEnumEntries() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntries.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntriesMultimoduleNoMappings.kt")
|
||||||
|
public void testEnumEntriesMultimoduleNoMappings() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesMultimoduleNoMappings.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntriesNameClashes.kt")
|
||||||
|
public void testEnumEntriesNameClashes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("enumEntryMembers.kt")
|
@TestMetadata("enumEntryMembers.kt")
|
||||||
public void testEnumEntryMembers() throws Exception {
|
public void testEnumEntryMembers() throws Exception {
|
||||||
|
|||||||
+18
@@ -12503,6 +12503,24 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt");
|
runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntries.kt")
|
||||||
|
public void testEnumEntries() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntries.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntriesMultimoduleNoMappings.kt")
|
||||||
|
public void testEnumEntriesMultimoduleNoMappings() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesMultimoduleNoMappings.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("enumEntriesNameClashes.kt")
|
||||||
|
public void testEnumEntriesNameClashes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("enumEntryMembers.kt")
|
@TestMetadata("enumEntryMembers.kt")
|
||||||
public void testEnumEntryMembers() throws Exception {
|
public void testEnumEntryMembers() throws Exception {
|
||||||
|
|||||||
+15
@@ -11104,6 +11104,21 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt");
|
runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("enumEntries.kt")
|
||||||
|
public void testEnumEntries() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntries.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("enumEntriesMultimoduleNoMappings.kt")
|
||||||
|
public void testEnumEntriesMultimoduleNoMappings() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesMultimoduleNoMappings.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("enumEntriesNameClashes.kt")
|
||||||
|
public void testEnumEntriesNameClashes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/enumEntriesNameClashes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("enumEntryMembers.kt")
|
@TestMetadata("enumEntryMembers.kt")
|
||||||
public void testEnumEntryMembers() throws Exception {
|
public void testEnumEntryMembers() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/enumEntryMembers.kt");
|
runTest("compiler/testData/codegen/box/enum/enumEntryMembers.kt");
|
||||||
|
|||||||
+1
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
|||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.defaultType
|
import org.jetbrains.kotlin.ir.types.defaultType
|
||||||
import org.jetbrains.kotlin.ir.types.typeWith
|
import org.jetbrains.kotlin.ir.types.typeWith
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kotlin.enums
|
||||||
|
|
||||||
|
@ExperimentalStdlibApi
|
||||||
|
@SinceKotlin("1.8")
|
||||||
|
public sealed interface EnumEntries<E : Enum<E>>
|
||||||
|
|
||||||
|
@PublishedApi
|
||||||
|
@ExperimentalStdlibApi
|
||||||
|
@SinceKotlin("1.8")
|
||||||
|
internal fun <E : Enum<E>> enumEntries(entriesProvider: () -> Array<E>): EnumEntries<E> = EnumEntriesList(entriesProvider)
|
||||||
|
|
||||||
|
@SinceKotlin("1.8")
|
||||||
|
@ExperimentalStdlibApi
|
||||||
|
private class EnumEntriesList<E : Enum<E>>(val entriesProvider: () -> Array<E>) : EnumEntries<E>
|
||||||
Reference in New Issue
Block a user