JVM IR, FIR: add JvmBackendExtension instead of MetadataSerializerFactory
This might be a better place for future behavior that should be abstracted between FE 1.0 and FIR, in JVM IR.
This commit is contained in:
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.backend.jvm.lower.CollectionStubComputer
|
||||
import org.jetbrains.kotlin.backend.jvm.lower.JvmInnerClassesSupport
|
||||
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.InlineClassAbi
|
||||
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.MemoizedInlineClassReplacements
|
||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
@@ -41,8 +40,6 @@ import org.jetbrains.kotlin.psi2ir.PsiSourceManager
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||
import org.jetbrains.org.objectweb.asm.Type
|
||||
|
||||
typealias MetadataSerializerFactory = (JvmBackendContext, IrClass, Type, JvmSerializationBindings, MetadataSerializer?) -> MetadataSerializer
|
||||
|
||||
class JvmBackendContext(
|
||||
val state: GenerationState,
|
||||
val psiSourceManager: PsiSourceManager,
|
||||
@@ -51,7 +48,7 @@ class JvmBackendContext(
|
||||
private val symbolTable: SymbolTable,
|
||||
val phaseConfig: PhaseConfig,
|
||||
val generatorExtensions: JvmGeneratorExtensions,
|
||||
val serializerFactory: MetadataSerializerFactory
|
||||
val backendExtension: JvmBackendExtension,
|
||||
) : CommonBackendContext {
|
||||
// If the JVM fqname of a class differs from what is implied by its parent, e.g. if it's a file class
|
||||
// annotated with @JvmPackageName, the correct name is recorded here.
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2010-2020 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 org.jetbrains.kotlin.backend.jvm
|
||||
|
||||
import org.jetbrains.kotlin.backend.jvm.codegen.DescriptorMetadataSerializer
|
||||
import org.jetbrains.kotlin.backend.jvm.codegen.MetadataSerializer
|
||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.org.objectweb.asm.Type
|
||||
|
||||
interface JvmBackendExtension {
|
||||
fun createSerializer(
|
||||
context: JvmBackendContext, klass: IrClass, type: Type, bindings: JvmSerializationBindings, parentSerializer: MetadataSerializer?
|
||||
): MetadataSerializer
|
||||
|
||||
object Default : JvmBackendExtension {
|
||||
override fun createSerializer(
|
||||
context: JvmBackendContext,
|
||||
klass: IrClass,
|
||||
type: Type,
|
||||
bindings: JvmSerializationBindings,
|
||||
parentSerializer: MetadataSerializer?
|
||||
): MetadataSerializer {
|
||||
return DescriptorMetadataSerializer(context, klass, type, bindings, parentSerializer)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
|
||||
import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase
|
||||
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
|
||||
import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
|
||||
import org.jetbrains.kotlin.backend.jvm.codegen.DescriptorMetadataSerializer
|
||||
import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry
|
||||
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
||||
import org.jetbrains.kotlin.codegen.CodegenFactory
|
||||
@@ -120,7 +119,7 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
|
||||
|
||||
doGenerateFilesInternal(
|
||||
state, irModuleFragment, psi2irContext.symbolTable, psi2irContext.sourceManager, phaseConfig,
|
||||
irProviders, extensions, ::DescriptorMetadataSerializer
|
||||
irProviders, extensions, JvmBackendExtension.Default,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -132,11 +131,11 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
|
||||
phaseConfig: PhaseConfig,
|
||||
irProviders: List<IrProvider>,
|
||||
extensions: JvmGeneratorExtensions,
|
||||
serializerFactory: MetadataSerializerFactory,
|
||||
backendExtension: JvmBackendExtension,
|
||||
) {
|
||||
val context = JvmBackendContext(
|
||||
state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment,
|
||||
symbolTable, phaseConfig, extensions, serializerFactory
|
||||
symbolTable, phaseConfig, extensions, backendExtension
|
||||
)
|
||||
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
|
||||
ExternalDependenciesGenerator(symbolTable, irProviders, state.languageVersionSettings).generateUnboundSymbolsAsDependencies()
|
||||
@@ -178,7 +177,7 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
|
||||
symbolTable: SymbolTable,
|
||||
sourceManager: PsiSourceManager,
|
||||
extensions: JvmGeneratorExtensions,
|
||||
serializerFactory: MetadataSerializerFactory
|
||||
backendExtension: JvmBackendExtension,
|
||||
) {
|
||||
irModuleFragment.irBuiltins.functionFactory = IrFunctionFactory(irModuleFragment.irBuiltins, symbolTable)
|
||||
val irProviders = generateTypicalIrProviderList(
|
||||
@@ -186,7 +185,7 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
|
||||
)
|
||||
|
||||
doGenerateFilesInternal(
|
||||
state, irModuleFragment, symbolTable, sourceManager, phaseConfig, irProviders, extensions, serializerFactory
|
||||
state, irModuleFragment, symbolTable, sourceManager, phaseConfig, irProviders, extensions, backendExtension,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -190,7 +190,9 @@ class ClassCodegen private constructor(
|
||||
}
|
||||
|
||||
private val metadataSerializer: MetadataSerializer =
|
||||
context.serializerFactory(context, irClass, type, visitor.serializationBindings, parentClassCodegen?.metadataSerializer)
|
||||
context.backendExtension.createSerializer(
|
||||
context, irClass, type, visitor.serializationBindings, parentClassCodegen?.metadataSerializer
|
||||
)
|
||||
|
||||
private fun generateKotlinMetadataAnnotation() {
|
||||
// TODO: if `-Xmultifile-parts-inherit` is enabled, write the corresponding flag for parts and facades to [Metadata.extraInt].
|
||||
|
||||
+3
-1
@@ -190,7 +190,9 @@ class ClassCodegen private constructor(
|
||||
}
|
||||
|
||||
private val metadataSerializer: MetadataSerializer =
|
||||
context.serializerFactory(context, irClass, type, visitor.serializationBindings, parentClassCodegen?.metadataSerializer)
|
||||
context.backendExtension.createSerializer(
|
||||
context, irClass, type, visitor.serializationBindings, parentClassCodegen?.metadataSerializer
|
||||
)
|
||||
|
||||
private fun generateKotlinMetadataAnnotation() {
|
||||
// TODO: if `-Xmultifile-parts-inherit` is enabled, write the corresponding flag for parts and facades to [Metadata.extraInt].
|
||||
|
||||
Reference in New Issue
Block a user