JVM: support enumEntries intrinsic for Java & old Kotlin enums

#KT-59710 Fixed
This commit is contained in:
Alexander Udalov
2023-07-20 00:52:22 +02:00
committed by Space Team
parent 874d1c514a
commit 971b4e63e7
25 changed files with 389 additions and 54 deletions
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.backend.common.phaser.CompilerPhase
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
import org.jetbrains.kotlin.backend.common.serialization.DescriptorByIdSignatureFinderImpl
import org.jetbrains.kotlin.backend.jvm.codegen.EnumEntriesIntrinsicMappingsCacheImpl
import org.jetbrains.kotlin.backend.jvm.codegen.JvmIrIntrinsicExtension
import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods
import org.jetbrains.kotlin.backend.jvm.ir.getIoFile
@@ -343,6 +344,9 @@ open class JvmIrCodegenFactory(
context.getIntrinsic = { symbol: IrFunctionSymbol ->
intrinsics.getIntrinsic(symbol) ?: generationExtensions.firstNotNullOfOrNull { it.getIntrinsic(symbol) }
}
context.enumEntriesIntrinsicMappingsCache = EnumEntriesIntrinsicMappingsCacheImpl(context)
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
@@ -6,10 +6,7 @@
package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.phaser.SameTypeNamedCompilerPhase
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
import org.jetbrains.kotlin.backend.common.phaser.performByIrFile
import org.jetbrains.kotlin.backend.common.phaser.then
import org.jetbrains.kotlin.backend.common.phaser.*
import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
@@ -47,6 +44,22 @@ private class FileCodegen(private val context: JvmBackendContext, private val ge
}
}
private val generateAdditionalClassesPhase = SameTypeNamedCompilerPhase(
"GenerateAdditionalClasses",
"Generate additional classes that were requested during codegen",
lower = object : SameTypeCompilerPhase<JvmBackendContext, IrModuleFragment> {
override fun invoke(
phaseConfig: PhaseConfigurationService,
phaserState: PhaserState<IrModuleFragment>,
context: JvmBackendContext,
input: IrModuleFragment,
): IrModuleFragment {
context.enumEntriesIntrinsicMappingsCache.generateMappingsClasses()
return input
}
}
)
// Generate multifile facades first, to compute and store JVM signatures of const properties which are later used
// when serializing metadata in the multifile parts.
// TODO: consider dividing codegen itself into separate phases (bytecode generation, metadata serialization) to avoid this
@@ -55,7 +68,8 @@ internal val jvmCodegenPhases = SameTypeNamedCompilerPhase(
description = "Code generation",
nlevels = 1,
lower = codegenPhase(generateMultifileFacade = true) then
codegenPhase(generateMultifileFacade = false)
codegenPhase(generateMultifileFacade = false) then
generateAdditionalClassesPhase
)
// This property is needed to avoid dependencies from "leaf" modules (cli, tests-common-new) on backend.jvm:lower.