From 58a9c0c99699c2b96f175930f95e8d7c7ff70703 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Fri, 5 Jun 2020 13:00:20 +0300 Subject: [PATCH] JVM_IR: remove descriptor usage from IrTypeMapper --- .../jetbrains/kotlin/ir/util/IrTypeUtils.kt | 19 ++++++++++++------- .../backend/jvm/codegen/IrTypeMapper.kt | 16 ++++++---------- .../box/functions/bigArity/callFromJava.kt | 1 - 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrTypeUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrTypeUtils.kt index 99b9d8b9f76..f6f47db0916 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrTypeUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrTypeUtils.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.builtins.UnsignedTypes import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl @@ -23,14 +24,18 @@ val kotlinPackageFqn = FqName.fromSegments(listOf("kotlin")) private val kotlinReflectionPackageFqn = kotlinPackageFqn.child(Name.identifier("reflect")) private val kotlinCoroutinesPackageFqn = kotlinPackageFqn.child(Name.identifier("coroutines")) -fun IrType.isFunction(): Boolean = this.isClassWithNamePrefix("Function", kotlinPackageFqn) -fun IrType.isKFunction(): Boolean = this.isClassWithNamePrefix("KFunction", kotlinReflectionPackageFqn) -fun IrType.isSuspendFunction(): Boolean = this.isClassWithNamePrefix("SuspendFunction", kotlinCoroutinesPackageFqn) -fun IrType.isKSuspendFunction(): Boolean = this.isClassWithNamePrefix("KSuspendFunction", kotlinReflectionPackageFqn) +fun IrType.isFunction(): Boolean = classifierOrNull?.isClassWithNamePrefix("Function", kotlinPackageFqn) == true +fun IrType.isKFunction(): Boolean = classifierOrNull?.isClassWithNamePrefix("KFunction", kotlinReflectionPackageFqn) == true +fun IrType.isSuspendFunction(): Boolean = classifierOrNull?.isClassWithNamePrefix("SuspendFunction", kotlinCoroutinesPackageFqn) == true +fun IrType.isKSuspendFunction(): Boolean = classifierOrNull?.isClassWithNamePrefix("KSuspendFunction", kotlinReflectionPackageFqn) == true -private fun IrType.isClassWithNamePrefix(prefix: String, packageFqName: FqName): Boolean { - val classifier = classifierOrNull ?: return false - val declaration = classifier.owner as IrDeclarationWithName +fun IrClassifierSymbol.isFunction(): Boolean = this.isClassWithNamePrefix("Function", kotlinPackageFqn) +fun IrClassifierSymbol.isKFunction(): Boolean = this.isClassWithNamePrefix("KFunction", kotlinReflectionPackageFqn) +fun IrClassifierSymbol.isSuspendFunction(): Boolean = this.isClassWithNamePrefix("SuspendFunction", kotlinCoroutinesPackageFqn) +fun IrClassifierSymbol.isKSuspendFunction(): Boolean = this.isClassWithNamePrefix("KSuspendFunction", kotlinReflectionPackageFqn) + +private fun IrClassifierSymbol.isClassWithNamePrefix(prefix: String, packageFqName: FqName): Boolean { + val declaration = owner as IrDeclarationWithName val name = declaration.name.asString() if (!name.startsWith(prefix)) return false val parent = declaration.parent as? IrPackageFragment ?: return false 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 20e2cbebdfb..121b8319afa 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor +import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.JvmCodegenUtil import org.jetbrains.kotlin.codegen.signature.AsmTypeFactory @@ -237,16 +238,11 @@ class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapperBas val parameters = classifier.typeParameters.map(IrTypeParameter::symbol) val arguments = type.arguments - // TODO: get rid of descriptor here - val classDescriptor = classifier.descriptor - if (classDescriptor is FunctionClassDescriptor) { - if (classDescriptor.hasBigArity || - classDescriptor.functionKind == FunctionClassDescriptor.Kind.KFunction || - classDescriptor.functionKind == FunctionClassDescriptor.Kind.KSuspendFunction - ) { - writeGenericArguments(sw, listOf(arguments.last()), listOf(parameters.last()), mode) - return - } + if ((classifier.symbol.isFunction() && arguments.size > FunctionInvokeDescriptor.BIG_ARITY) + || classifier.symbol.isKFunction() || classifier.symbol.isKSuspendFunction() + ) { + writeGenericArguments(sw, listOf(arguments.last()), listOf(parameters.last()), mode) + return } writeGenericArguments(sw, arguments, parameters, mode) diff --git a/compiler/testData/codegen/box/functions/bigArity/callFromJava.kt b/compiler/testData/codegen/box/functions/bigArity/callFromJava.kt index 7b16baa2761..6849e865c86 100644 --- a/compiler/testData/codegen/box/functions/bigArity/callFromJava.kt +++ b/compiler/testData/codegen/box/functions/bigArity/callFromJava.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +FunctionTypesWithBigArity -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // TARGET_BACKEND: JVM // FILE: J.java