From d60a8f9baa9288710176318c1fa50b6795099ced Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Thu, 22 Apr 2021 15:14:26 +0300 Subject: [PATCH] Use correct type in KClassReference Make sure that writeSelf function remains static --- .../compiler/backend/common/TypeUtil.kt | 2 +- .../compiler/backend/ir/GeneratorHelpers.kt | 29 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt index e7f9fc72ec5..688f29f7e07 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 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. */ diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index cc72c12681c..f6f18cae00c 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -32,9 +32,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.descriptorUtil.* import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.typeUtil.isTypeParameter -import org.jetbrains.kotlin.types.typeUtil.makeNotNullable -import org.jetbrains.kotlin.types.typeUtil.representativeUpperBound +import org.jetbrains.kotlin.types.typeUtil.* import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlinx.serialization.compiler.backend.common.* import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.* @@ -715,10 +713,33 @@ interface IrBuilderExtension { endOffset, compilerContext.irBuiltIns.kClassClass.starProjectedType, classSymbol, - classType.toIrType() // todo: maybe this is jvm-specific behavior + classType.approximateJvmErasure.toIrType() ) } + // It is impossible to use star projections right away, because Array::class differ from Array::class : + // detailed information about type arguments required for class references on jvm + private val KotlinType.approximateJvmErasure: KotlinType + get() = when (val classifier = constructor.declarationDescriptor) { + is TypeParameterDescriptor -> { + // Note that if the upper bound is Array, the argument type will be replaced with star here, which is probably incorrect. + classifier.classBound.defaultType.replaceArgumentsWithStarProjections() + } + is ClassDescriptor -> if (KotlinBuiltIns.isArray(this)) { + replace(arguments.map { TypeProjectionImpl(Variance.INVARIANT, it.type.approximateJvmErasure) }) + } else { + replaceArgumentsWithStarProjections() + } + else -> error("Unsupported classifier: $this") + } + + private val TypeParameterDescriptor.classBound: ClassDescriptor + get() = when (val bound = representativeUpperBound.constructor.declarationDescriptor) { + is ClassDescriptor -> bound + is TypeParameterDescriptor -> bound.classBound + else -> error("Unsupported classifier: $this") + } + fun IrBuilderWithScope.classReference(classType: KotlinType): IrClassReference = createClassReference(classType, startOffset, endOffset) private fun extractDefaultValuesFromConstructor(irClass: IrClass?): Map {