Move FunctionInvokeDescriptor.BIG_ARITY to :core:compiler.common

This commit is contained in:
Dmitriy Novozhilov
2020-08-31 15:23:34 +03:00
parent bf4bf30b4a
commit 4d5f28d5c0
8 changed files with 26 additions and 18 deletions
@@ -13,6 +13,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.backend.common.CodegenUtil; import org.jetbrains.kotlin.backend.common.CodegenUtil;
import org.jetbrains.kotlin.builtins.StandardNames; import org.jetbrains.kotlin.builtins.StandardNames;
import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity;
import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor; import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor;
import org.jetbrains.kotlin.codegen.binding.CalculatedClosure; import org.jetbrains.kotlin.codegen.binding.CalculatedClosure;
import org.jetbrains.kotlin.codegen.context.CodegenContext; import org.jetbrains.kotlin.codegen.context.CodegenContext;
@@ -353,7 +354,7 @@ public class JvmCodegenUtil {
public static boolean isDeclarationOfBigArityCreateCoroutineMethod(@Nullable DeclarationDescriptor descriptor) { public static boolean isDeclarationOfBigArityCreateCoroutineMethod(@Nullable DeclarationDescriptor descriptor) {
return descriptor instanceof SimpleFunctionDescriptor && descriptor.getName().asString().equals(SUSPEND_FUNCTION_CREATE_METHOD_NAME) && 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(); descriptor.getContainingDeclaration() instanceof AnonymousFunctionDescriptor && ((AnonymousFunctionDescriptor) descriptor.getContainingDeclaration()).isSuspend();
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.types.expressions
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.ReflectionTypes 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.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.container.DefaultImplementation import org.jetbrains.kotlin.container.DefaultImplementation
@@ -633,7 +633,7 @@ class DoubleColonExpressionResolver(
context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor) context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor)
if (functionDescriptor.valueParameters.size >= FunctionInvokeDescriptor.BIG_ARITY && if (functionDescriptor.valueParameters.size >= BuiltInFunctionArity.BIG_ARITY &&
bigAritySupport.shouldCheckLanguageVersionSettings && bigAritySupport.shouldCheckLanguageVersionSettings &&
!languageVersionSettings.supportsFeature(LanguageFeature.FunctionTypesWithBigArity) !languageVersionSettings.supportsFeature(LanguageFeature.FunctionTypesWithBigArity)
) { ) {
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin 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.AsmUtil
import org.jetbrains.kotlin.codegen.JvmCodegenUtil import org.jetbrains.kotlin.codegen.JvmCodegenUtil
import org.jetbrains.kotlin.codegen.signature.AsmTypeFactory 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 parameters = classifier.typeParameters.map(IrTypeParameter::symbol)
val arguments = type.arguments 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() || classifier.symbol.isKFunction() || classifier.symbol.isKSuspendFunction()
) { ) {
writeGenericArguments(sw, listOf(arguments.last()), listOf(parameters.last()), mode) 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 = private fun boxTypeIfNeeded(possiblyPrimitiveType: Type, needBoxedType: Boolean): Type =
if (needBoxedType) AsmUtil.boxType(possiblyPrimitiveType) else possiblyPrimitiveType if (needBoxedType) AsmUtil.boxType(possiblyPrimitiveType) else possiblyPrimitiveType
} }
@@ -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.createJvmIrBuilder
import org.jetbrains.kotlin.backend.jvm.ir.irArray import org.jetbrains.kotlin.backend.jvm.ir.irArray
import org.jetbrains.kotlin.builtins.StandardNames 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.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrStatement 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. // Change calls to big arity invoke functions to vararg calls.
override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression { 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.isFunctionOrKFunction() ||
expression.symbol.owner.parentAsClass.defaultType.isSuspendFunctionOrKFunction()) || expression.symbol.owner.parentAsClass.defaultType.isSuspendFunctionOrKFunction()) ||
expression.symbol.owner.name.asString() != "invoke" expression.symbol.owner.name.asString() != "invoke"
@@ -69,7 +69,7 @@ private class FunctionNVarargBridgeLowering(val context: JvmBackendContext) :
override fun visitClassNew(declaration: IrClass): IrStatement { override fun visitClassNew(declaration: IrClass): IrStatement {
val bigArityFunctionSuperTypes = declaration.superTypes.filterIsInstance<IrSimpleType>().filter { val bigArityFunctionSuperTypes = declaration.superTypes.filterIsInstance<IrSimpleType>().filter {
it.isFunctionType && it.arguments.size > FunctionInvokeDescriptor.BIG_ARITY it.isFunctionType && it.arguments.size > BuiltInFunctionArity.BIG_ARITY
} }
if (bigArityFunctionSuperTypes.isEmpty()) if (bigArityFunctionSuperTypes.isEmpty())
@@ -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
}
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.builtins.StandardNames.FqNames import org.jetbrains.kotlin.builtins.StandardNames.FqNames
import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMap 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.FunctionClassKind
import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.resolve.DescriptorUtils 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)) add(ClassId.topLevel(FqName("kotlin.jvm.functions.Function$i")), StandardNames.getFunctionClassId(i))
addKotlinToJava(FqName(NUMBERED_K_FUNCTION_PREFIX + i), K_FUNCTION_CLASS_ID) 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 kSuspendFunction = FunctionClassKind.KSuspendFunction
val kSuspendFun = kSuspendFunction.packageFqName.toString() + "." + kSuspendFunction.classNamePrefix val kSuspendFun = kSuspendFunction.packageFqName.toString() + "." + kSuspendFunction.classNamePrefix
addKotlinToJava(FqName(kSuspendFun + i), K_FUNCTION_CLASS_ID) addKotlinToJava(FqName(kSuspendFun + i), K_FUNCTION_CLASS_ID)
@@ -166,7 +166,7 @@ object JavaToKotlinClassMap : PlatformToKotlinClassMap {
val arityString = kotlinFqName.asString().substringAfter(prefix, "") val arityString = kotlinFqName.asString().substringAfter(prefix, "")
if (arityString.isNotEmpty() && !arityString.startsWith('0')) { if (arityString.isNotEmpty() && !arityString.startsWith('0')) {
val arity = arityString.toIntOrNull() val arity = arityString.toIntOrNull()
return arity != null && arity >= FunctionInvokeDescriptor.BIG_ARITY return arity != null && arity >= BuiltInFunctionArity.BIG_ARITY
} }
return false return false
} }
@@ -60,7 +60,7 @@ class FunctionClassDescriptor(
@get:JvmName("hasBigArity") @get:JvmName("hasBigArity")
val hasBigArity: Boolean val hasBigArity: Boolean
get() = arity >= FunctionInvokeDescriptor.BIG_ARITY get() = arity >= BuiltInFunctionArity.BIG_ARITY
override fun getContainingDeclaration() = containingDeclaration override fun getContainingDeclaration() = containingDeclaration
@@ -56,7 +56,7 @@ class FunctionInvokeDescriptor private constructor(
*/ */
@get:JvmName("hasBigArity") @get:JvmName("hasBigArity")
val hasBigArity: Boolean val hasBigArity: Boolean
get() = valueParameters.size >= BIG_ARITY get() = valueParameters.size >= BuiltInFunctionArity.BIG_ARITY
override fun doSubstitute(configuration: CopyConfiguration): FunctionDescriptor? { override fun doSubstitute(configuration: CopyConfiguration): FunctionDescriptor? {
val substituted = super.doSubstitute(configuration) as FunctionInvokeDescriptor? ?: return null val substituted = super.doSubstitute(configuration) as FunctionInvokeDescriptor? ?: return null
@@ -108,9 +108,6 @@ class FunctionInvokeDescriptor private constructor(
} }
companion object Factory { companion object Factory {
/** @see hasBigArity */
const val BIG_ARITY = 23
fun create(functionClass: FunctionClassDescriptor, isSuspend: Boolean): FunctionInvokeDescriptor { fun create(functionClass: FunctionClassDescriptor, isSuspend: Boolean): FunctionInvokeDescriptor {
val typeParameters = functionClass.declaredTypeParameters val typeParameters = functionClass.declaredTypeParameters