diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt index e64accae2e5..d030ebc8d74 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.codegen.coroutines.isResumeImplMethodName import org.jetbrains.kotlin.codegen.inline.coroutines.CoroutineTransformer import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.codegen.serialization.JvmCodegenStringTable +import org.jetbrains.kotlin.codegen.state.KotlinTypeMapperBase import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader @@ -46,6 +47,9 @@ class AnonymousObjectTransformer( private lateinit var sourceMapper: SourceMapper private val languageVersionSettings = inliningContext.state.languageVersionSettings + // TODO: use IrTypeMapper in the IR backend + private val typeMapper: KotlinTypeMapperBase = state.typeMapper + override fun doTransform(parentRemapper: FieldRemapper): InlineResult { val innerClassNodes = ArrayList() val classBuilder = createRemappingClassBuilderViaFactory(inliningContext) @@ -226,7 +230,7 @@ class AnonymousObjectTransformer( when (header.kind) { KotlinClassHeader.Kind.CLASS -> { val (nameResolver, classProto) = JvmProtoBufUtil.readClassDataFrom(data, strings) - val newStringTable = JvmCodegenStringTable(state.typeMapper, nameResolver) + val newStringTable = JvmCodegenStringTable(typeMapper, nameResolver) val newProto = classProto.toBuilder().apply { setExtension(JvmProtoBuf.anonymousObjectOriginName, newStringTable.getStringIndex(oldObjectType.internalName)) }.build() @@ -234,7 +238,7 @@ class AnonymousObjectTransformer( } KotlinClassHeader.Kind.SYNTHETIC_CLASS -> { val (nameResolver, functionProto) = JvmProtoBufUtil.readFunctionDataFrom(data, strings) - val newStringTable = JvmCodegenStringTable(state.typeMapper, nameResolver) + val newStringTable = JvmCodegenStringTable(typeMapper, nameResolver) val newProto = functionProto.toBuilder().apply { setExtension(JvmProtoBuf.lambdaClassOriginName, newStringTable.getStringIndex(oldObjectType.internalName)) }.build() diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmCodegenStringTable.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmCodegenStringTable.kt index aaa14d38abc..857a6bcd16a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmCodegenStringTable.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmCodegenStringTable.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.codegen.serialization -import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper +import org.jetbrains.kotlin.codegen.state.KotlinTypeMapperBase import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmNameResolver @@ -15,12 +15,11 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.DescriptorAwareStringTable class JvmCodegenStringTable @JvmOverloads constructor( - private val typeMapper: KotlinTypeMapper, + private val typeMapper: KotlinTypeMapperBase, nameResolver: JvmNameResolver? = null ) : JvmStringTable(nameResolver), DescriptorAwareStringTable { - override fun getLocalClassIdReplacement(descriptor: ClassifierDescriptorWithTypeParameters): ClassId { - val container = descriptor.containingDeclaration - return when (container) { + override fun getLocalClassIdReplacement(descriptor: ClassifierDescriptorWithTypeParameters): ClassId = + when (val container = descriptor.containingDeclaration) { is ClassifierDescriptorWithTypeParameters -> getLocalClassIdReplacement(container).createNestedClassId(descriptor.name) is PackageFragmentDescriptor -> { throw IllegalStateException("getLocalClassIdReplacement should only be called for local classes: $descriptor") @@ -30,5 +29,4 @@ class JvmCodegenStringTable @JvmOverloads constructor( ClassId(fqName.parent(), FqName.topLevel(fqName.shortName()), true) } } - } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt index fc7c915ca38..213a94355a3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.createFreeFakeLocalPropertyDescriptor import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.* import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.codegen.state.KotlinTypeMapperBase import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.* @@ -39,10 +40,13 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method -class JvmSerializerExtension(private val bindings: JvmSerializationBindings, state: GenerationState) : SerializerExtension() { +class JvmSerializerExtension @JvmOverloads constructor( + private val bindings: JvmSerializationBindings, + state: GenerationState, + private val typeMapper: KotlinTypeMapperBase = state.typeMapper +) : SerializerExtension() { private val globalBindings = state.globalSerializationBindings private val codegenBinding = state.bindingContext - private val typeMapper = state.typeMapper override val stringTable = JvmCodegenStringTable(typeMapper) private val useTypeTable = state.useTypeTableInSerializer private val moduleName = state.moduleName diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt index ada3bd6bb78..9e3897d7d5a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt @@ -89,7 +89,7 @@ class KotlinTypeMapper @JvmOverloads constructor( private val isIrBackend: Boolean = false, private val typePreprocessor: ((KotlinType) -> KotlinType?)? = null, private val namePreprocessor: ((ClassDescriptor) -> String?)? = null -) { +): KotlinTypeMapperBase() { private val isReleaseCoroutines = languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines) private val typeMappingConfiguration = object : TypeMappingConfiguration { @@ -224,7 +224,7 @@ class KotlinTypeMapper @JvmOverloads constructor( return mapType(type, signatureVisitor, TypeMappingMode.GENERIC_ARGUMENT) } - fun mapClass(classifier: ClassifierDescriptor): Type { + override fun mapClass(classifier: ClassifierDescriptor): Type { return mapType(classifier.defaultType, null, TypeMappingMode.CLASS_DECLARATION) } @@ -274,10 +274,6 @@ class KotlinTypeMapper @JvmOverloads constructor( return mapInlineClassType(kotlinType, TypeMappingMode.DEFAULT, typeMappingConfiguration) } - fun mapDefaultImpls(descriptor: ClassDescriptor): Type { - return Type.getObjectType(mapType(descriptor).internalName + JvmAbi.DEFAULT_IMPLS_SUFFIX) - } - private fun writeGenericType( type: KotlinType, asmType: Type, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapperBase.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapperBase.kt new file mode 100644 index 00000000000..63e778f2957 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapperBase.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2019 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.codegen.state + +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.load.java.JvmAbi +import org.jetbrains.org.objectweb.asm.Type + +abstract class KotlinTypeMapperBase { + abstract fun mapClass(classifier: ClassifierDescriptor): Type + + fun mapDefaultImpls(descriptor: ClassDescriptor): Type = + Type.getObjectType(mapClass(descriptor).internalName + JvmAbi.DEFAULT_IMPLS_SUFFIX) +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index 742ce7b97bd..0c884d3c6ce 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.InlineClassAbi import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* @@ -24,6 +25,7 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol +import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable @@ -92,6 +94,9 @@ class JvmBackendContext( internal fun referenceClass(descriptor: ClassDescriptor): IrClassSymbol = symbolTable.referenceClass(descriptor) + internal fun referenceTypeParameter(descriptor: TypeParameterDescriptor): IrTypeParameterSymbol = + symbolTable.referenceTypeParameter(descriptor) + override fun log(message: () -> String) { /*TODO*/ if (inVerbosePhase) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index 4256d0f19f2..14dd042bd1f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -67,7 +67,7 @@ open class ClassCodegen protected constructor( private var sourceMapper: DefaultSourceMapper? = null - private val serializerExtension = JvmSerializerExtension(visitor.serializationBindings, state) + private val serializerExtension = JvmSerializerExtension(visitor.serializationBindings, state, typeMapper) private val serializer: DescriptorSerializer? = when (val metadata = irClass.metadata) { is MetadataSource.Class -> DescriptorSerializer.create(metadata.descriptor, serializerExtension, parentClassCodegen?.serializer) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt index 5b6823bd1dc..bdc69c3d6c3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt @@ -12,6 +12,10 @@ import org.jetbrains.kotlin.codegen.JvmCodegenUtil import org.jetbrains.kotlin.codegen.signature.AsmTypeFactory import org.jetbrains.kotlin.codegen.signature.JvmSignatureWriter import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper +import org.jetbrains.kotlin.codegen.state.KotlinTypeMapperBase +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrPackageFragment import org.jetbrains.kotlin.ir.declarations.IrTypeParameter @@ -29,9 +33,19 @@ import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.types.Variance import org.jetbrains.org.objectweb.asm.Type -class IrTypeMapper(private val context: JvmBackendContext) { +class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapperBase() { internal val typeSystem = IrTypeCheckerContext(context.irBuiltIns) + override fun mapClass(classifier: ClassifierDescriptor): Type = + when (classifier) { + is ClassDescriptor -> + mapClass(context.referenceClass(classifier).owner) + is TypeParameterDescriptor -> + mapType(context.referenceTypeParameter(classifier).owner.defaultType) + else -> + error("Unknown descriptor: $classifier") + } + fun classInternalName(irClass: IrClass): String = context.getLocalClassInfo(irClass)?.internalName ?: JvmCodegenUtil.sanitizeNameIfNeeded(computeInternalName(irClass), context.state.languageVersionSettings)