JVM: support enumEntries intrinsic for Java & old Kotlin enums
#KT-59710 Fixed
This commit is contained in:
committed by
Space Team
parent
874d1c514a
commit
971b4e63e7
+4
@@ -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()
|
||||
|
||||
|
||||
+19
-5
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user