diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index 1c7e6a6cba6..dbf3fd6a067 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -13,6 +13,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.backend.common.CodegenUtil; import org.jetbrains.kotlin.builtins.StandardNames; +import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity; import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor; import org.jetbrains.kotlin.codegen.binding.CalculatedClosure; import org.jetbrains.kotlin.codegen.context.CodegenContext; @@ -353,7 +354,7 @@ public class JvmCodegenUtil { public static boolean isDeclarationOfBigArityCreateCoroutineMethod(@Nullable DeclarationDescriptor descriptor) { return descriptor instanceof SimpleFunctionDescriptor && descriptor.getName().asString().equals(SUSPEND_FUNCTION_CREATE_METHOD_NAME) && - ((SimpleFunctionDescriptor) descriptor).getValueParameters().size() >= FunctionInvokeDescriptor.BIG_ARITY - 1 && + ((SimpleFunctionDescriptor) descriptor).getValueParameters().size() >= BuiltInFunctionArity.BIG_ARITY - 1 && descriptor.getContainingDeclaration() instanceof AnonymousFunctionDescriptor && ((AnonymousFunctionDescriptor) descriptor.getContainingDeclaration()).isSuspend(); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt index c88b6b1e23e..5e2b40c9376 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.types.expressions import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.ReflectionTypes -import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor +import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.DefaultImplementation @@ -633,7 +633,7 @@ class DoubleColonExpressionResolver( context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor) - if (functionDescriptor.valueParameters.size >= FunctionInvokeDescriptor.BIG_ARITY && + if (functionDescriptor.valueParameters.size >= BuiltInFunctionArity.BIG_ARITY && bigAritySupport.shouldCheckLanguageVersionSettings && !languageVersionSettings.supportsFeature(LanguageFeature.FunctionTypesWithBigArity) ) { 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 266f6d57bca..e38d4cca4d1 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 @@ -7,7 +7,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.FunctionInvokeDescriptor +import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.JvmCodegenUtil import org.jetbrains.kotlin.codegen.signature.AsmTypeFactory @@ -240,7 +240,7 @@ class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapperBas val parameters = classifier.typeParameters.map(IrTypeParameter::symbol) val arguments = type.arguments - if ((classifier.symbol.isFunction() && arguments.size > FunctionInvokeDescriptor.BIG_ARITY) + if ((classifier.symbol.isFunction() && arguments.size > BuiltInFunctionArity.BIG_ARITY) || classifier.symbol.isKFunction() || classifier.symbol.isKSuspendFunction() ) { writeGenericArguments(sw, listOf(arguments.last()), listOf(parameters.last()), mode) @@ -263,4 +263,4 @@ class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapperBas private fun boxTypeIfNeeded(possiblyPrimitiveType: Type, needBoxedType: Boolean): Type = if (needBoxedType) AsmUtil.boxType(possiblyPrimitiveType) else possiblyPrimitiveType -} \ No newline at end of file +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt index 824f46350b0..89238d6e4f5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder import org.jetbrains.kotlin.backend.jvm.ir.irArray import org.jetbrains.kotlin.builtins.StandardNames -import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor +import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.IrStatement @@ -47,7 +47,7 @@ private class FunctionNVarargBridgeLowering(val context: JvmBackendContext) : // Change calls to big arity invoke functions to vararg calls. override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression { - if (expression.valueArgumentsCount < FunctionInvokeDescriptor.BIG_ARITY || + if (expression.valueArgumentsCount < BuiltInFunctionArity.BIG_ARITY || !(expression.symbol.owner.parentAsClass.defaultType.isFunctionOrKFunction() || expression.symbol.owner.parentAsClass.defaultType.isSuspendFunctionOrKFunction()) || expression.symbol.owner.name.asString() != "invoke" @@ -69,7 +69,7 @@ private class FunctionNVarargBridgeLowering(val context: JvmBackendContext) : override fun visitClassNew(declaration: IrClass): IrStatement { val bigArityFunctionSuperTypes = declaration.superTypes.filterIsInstance().filter { - it.isFunctionType && it.arguments.size > FunctionInvokeDescriptor.BIG_ARITY + it.isFunctionType && it.arguments.size > BuiltInFunctionArity.BIG_ARITY } if (bigArityFunctionSuperTypes.isEmpty()) diff --git a/core/compiler.common/src/org/jetbrains/kotlin/builtins/functions/BuiltInFunctionArity.kt b/core/compiler.common/src/org/jetbrains/kotlin/builtins/functions/BuiltInFunctionArity.kt new file mode 100644 index 00000000000..8aa480acfde --- /dev/null +++ b/core/compiler.common/src/org/jetbrains/kotlin/builtins/functions/BuiltInFunctionArity.kt @@ -0,0 +1,10 @@ +/* + * 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.builtins.functions + +object BuiltInFunctionArity { + const val BIG_ARITY = 23 +} diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt index 5fc7f25d380..8766013e49c 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt @@ -10,8 +10,8 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames.FqNames import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMap +import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity import org.jetbrains.kotlin.builtins.functions.FunctionClassKind -import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -98,11 +98,11 @@ object JavaToKotlinClassMap : PlatformToKotlinClassMap { ) } - for (i in 0 until FunctionInvokeDescriptor.BIG_ARITY) { + for (i in 0 until BuiltInFunctionArity.BIG_ARITY) { add(ClassId.topLevel(FqName("kotlin.jvm.functions.Function$i")), StandardNames.getFunctionClassId(i)) addKotlinToJava(FqName(NUMBERED_K_FUNCTION_PREFIX + i), K_FUNCTION_CLASS_ID) } - for (i in 0 until FunctionInvokeDescriptor.BIG_ARITY - 1) { + for (i in 0 until BuiltInFunctionArity.BIG_ARITY - 1) { val kSuspendFunction = FunctionClassKind.KSuspendFunction val kSuspendFun = kSuspendFunction.packageFqName.toString() + "." + kSuspendFunction.classNamePrefix addKotlinToJava(FqName(kSuspendFun + i), K_FUNCTION_CLASS_ID) @@ -166,7 +166,7 @@ object JavaToKotlinClassMap : PlatformToKotlinClassMap { val arityString = kotlinFqName.asString().substringAfter(prefix, "") if (arityString.isNotEmpty() && !arityString.startsWith('0')) { val arity = arityString.toIntOrNull() - return arity != null && arity >= FunctionInvokeDescriptor.BIG_ARITY + return arity != null && arity >= BuiltInFunctionArity.BIG_ARITY } return false } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt index 6b3914df55a..9522afea0d6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt @@ -60,7 +60,7 @@ class FunctionClassDescriptor( @get:JvmName("hasBigArity") val hasBigArity: Boolean - get() = arity >= FunctionInvokeDescriptor.BIG_ARITY + get() = arity >= BuiltInFunctionArity.BIG_ARITY override fun getContainingDeclaration() = containingDeclaration diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt index 1f2d3491d0e..5ec22fcebf1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt @@ -56,7 +56,7 @@ class FunctionInvokeDescriptor private constructor( */ @get:JvmName("hasBigArity") val hasBigArity: Boolean - get() = valueParameters.size >= BIG_ARITY + get() = valueParameters.size >= BuiltInFunctionArity.BIG_ARITY override fun doSubstitute(configuration: CopyConfiguration): FunctionDescriptor? { val substituted = super.doSubstitute(configuration) as FunctionInvokeDescriptor? ?: return null @@ -108,9 +108,6 @@ class FunctionInvokeDescriptor private constructor( } companion object Factory { - /** @see hasBigArity */ - const val BIG_ARITY = 23 - fun create(functionClass: FunctionClassDescriptor, isSuspend: Boolean): FunctionInvokeDescriptor { val typeParameters = functionClass.declaredTypeParameters