Move FunctionClassDescriptor.Kind to :core:descriptors.common module

This commit is contained in:
Dmitriy Novozhilov
2020-08-16 23:15:15 +03:00
parent 7a7fe77b8e
commit 20a2ad8223
19 changed files with 120 additions and 107 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.RESULT_FQ_NAME import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.RESULT_FQ_NAME
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.*
import org.jetbrains.kotlin.codegen.AsmUtil.isStaticMethod import org.jetbrains.kotlin.codegen.AsmUtil.isStaticMethod
@@ -328,8 +329,8 @@ class KotlinTypeMapper @JvmOverloads constructor(
if (classDescriptor is FunctionClassDescriptor) { if (classDescriptor is FunctionClassDescriptor) {
if (classDescriptor.hasBigArity || if (classDescriptor.hasBigArity ||
classDescriptor.functionKind == FunctionClassDescriptor.Kind.KFunction || classDescriptor.functionKind == FunctionClassKind.KFunction ||
classDescriptor.functionKind == FunctionClassDescriptor.Kind.KSuspendFunction classDescriptor.functionKind == FunctionClassKind.KSuspendFunction
) { ) {
// kotlin.reflect.KFunction{n}<P1, ..., Pn, R> is mapped to kotlin.reflect.KFunction<R> (for all n), and // kotlin.reflect.KFunction{n}<P1, ..., Pn, R> is mapped to kotlin.reflect.KFunction<R> (for all n), and
// kotlin.Function{n}<P1, ..., Pn, R> is mapped to kotlin.jvm.functions.FunctionN<R> (for n > 22). // kotlin.Function{n}<P1, ..., Pn, R> is mapped to kotlin.jvm.functions.FunctionN<R> (for n > 22).
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.types package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import kotlin.contracts.ExperimentalContracts import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
@@ -59,10 +59,10 @@ private fun ConeTypeProjection.render(): String {
} }
} }
fun ConeKotlinType.renderFunctionType(kind: FunctionClassDescriptor.Kind?, isExtension: Boolean): String { fun ConeKotlinType.renderFunctionType(kind: FunctionClassKind?, isExtension: Boolean): String {
if (!kind.withPrettyRender()) return render() if (!kind.withPrettyRender()) return render()
return buildString { return buildString {
if (kind == FunctionClassDescriptor.Kind.SuspendFunction) { if (kind == FunctionClassKind.SuspendFunction) {
append("suspend ") append("suspend ")
} }
val (receiver, otherTypeArguments) = if (isExtension && typeArguments.first() != ConeStarProjection) { val (receiver, otherTypeArguments) = if (isExtension && typeArguments.first() != ConeStarProjection) {
@@ -83,9 +83,9 @@ fun ConeKotlinType.renderFunctionType(kind: FunctionClassDescriptor.Kind?, isExt
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
fun FunctionClassDescriptor.Kind?.withPrettyRender(): Boolean { fun FunctionClassKind?.withPrettyRender(): Boolean {
contract { contract {
returns(true) implies (this@withPrettyRender != null) returns(true) implies (this@withPrettyRender != null)
} }
return this != null && this != FunctionClassDescriptor.Kind.KSuspendFunction && this != FunctionClassDescriptor.Kind.KFunction return this != null && this != FunctionClassKind.KSuspendFunction && this != FunctionClassKind.KFunction
} }
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.serialization package org.jetbrains.kotlin.fir.serialization
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
@@ -611,8 +611,8 @@ class FirElementSerializer private constructor(
val suspendClassId = type.classId!! val suspendClassId = type.classId!!
val relativeClassName = suspendClassId.relativeClassName.asString() val relativeClassName = suspendClassId.relativeClassName.asString()
val kind = val kind =
if (relativeClassName.startsWith("K")) FunctionClassDescriptor.Kind.KFunction if (relativeClassName.startsWith("K")) FunctionClassKind.KFunction
else FunctionClassDescriptor.Kind.Function else FunctionClassKind.Function
val runtimeClassId = ClassId(kind.packageFqName, Name.identifier(relativeClassName.replaceFirst("Suspend", ""))) val runtimeClassId = ClassId(kind.packageFqName, Name.identifier(relativeClassName.replaceFirst("Suspend", "")))
val continuationClassId = CONTINUATION_INTERFACE_CLASS_ID val continuationClassId = CONTINUATION_INTERFACE_CLASS_ID
return ConeClassLikeLookupTagImpl(runtimeClassId).constructClassType( return ConeClassLikeLookupTagImpl(runtimeClassId).constructClassType(
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.backend.generators package org.jetbrains.kotlin.fir.backend.generators
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
@@ -128,8 +128,8 @@ class CallAndReferenceGenerator(
private fun ConeKotlinType.kFunctionTypeToFunctionType(): IrSimpleType { private fun ConeKotlinType.kFunctionTypeToFunctionType(): IrSimpleType {
val kind = val kind =
if (isSuspendFunctionType(session)) FunctionClassDescriptor.Kind.SuspendFunction if (isSuspendFunctionType(session)) FunctionClassKind.SuspendFunction
else FunctionClassDescriptor.Kind.Function else FunctionClassKind.Function
val functionalTypeId = ClassId(kind.packageFqName, kind.numberedClassName(typeArguments.size - 1)) val functionalTypeId = ClassId(kind.packageFqName, kind.numberedClassName(typeArguments.size - 1))
val coneType = ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(functionalTypeId), typeArguments, isNullable = false) val coneType = ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(functionalTypeId), typeArguments, isNullable = false)
return coneType.toIrType() as IrSimpleType return coneType.toIrType() as IrSimpleType
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.deserialization package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
@@ -169,7 +169,7 @@ class FirTypeDeserializer(
val valueParameters = arguments.dropLast(2) val valueParameters = arguments.dropLast(2)
val kind = FunctionClassDescriptor.Kind.SuspendFunction val kind = FunctionClassKind.SuspendFunction
return ConeClassLikeTypeImpl( return ConeClassLikeTypeImpl(
ConeClassLikeLookupTagImpl(ClassId(kind.packageFqName, kind.numberedClassName(valueParameters.size))), ConeClassLikeLookupTagImpl(ClassId(kind.packageFqName, kind.numberedClassName(valueParameters.size))),
(valueParameters + suspendReturnType).toTypedArray(), (valueParameters + suspendReturnType).toTypedArray(),
@@ -191,7 +191,7 @@ class FirTypeDeserializer(
1 -> { 1 -> {
val arity = arguments.size - 1 val arity = arguments.size - 1
if (arity >= 0) { if (arity >= 0) {
val kind = FunctionClassDescriptor.Kind.SuspendFunction val kind = FunctionClassKind.SuspendFunction
ConeClassLikeTypeImpl( ConeClassLikeTypeImpl(
ConeClassLikeLookupTagImpl(ClassId(kind.packageFqName, kind.numberedClassName(arity))), ConeClassLikeLookupTagImpl(ClassId(kind.packageFqName, kind.numberedClassName(arity))),
arguments, arguments,
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
@@ -210,9 +210,9 @@ fun createFunctionalType(
val receiverAndParameterTypes = listOfNotNull(receiverType) + parameters + listOf(rawReturnType) val receiverAndParameterTypes = listOfNotNull(receiverType) + parameters + listOf(rawReturnType)
val kind = if (isSuspend) { val kind = if (isSuspend) {
if (isKFunctionType) FunctionClassDescriptor.Kind.KSuspendFunction else FunctionClassDescriptor.Kind.SuspendFunction if (isKFunctionType) FunctionClassKind.KSuspendFunction else FunctionClassKind.SuspendFunction
} else { } else {
if (isKFunctionType) FunctionClassDescriptor.Kind.KFunction else FunctionClassDescriptor.Kind.Function if (isKFunctionType) FunctionClassKind.KFunction else FunctionClassKind.Function
} }
val functionalTypeId = ClassId(kind.packageFqName, kind.numberedClassName(receiverAndParameterTypes.size - 1)) val functionalTypeId = ClassId(kind.packageFqName, kind.numberedClassName(receiverAndParameterTypes.size - 1))
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.inference package org.jetbrains.kotlin.fir.resolve.inference
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
@@ -22,11 +22,11 @@ fun ConeKotlinType.isBuiltinFunctionalType(session: FirSession): Boolean {
} }
if (this !is ConeClassLikeType) return false if (this !is ConeClassLikeType) return false
val classId = fullyExpandedType(session).lookupTag.classId val classId = fullyExpandedType(session).lookupTag.classId
val kind = FunctionClassDescriptor.Kind.byClassNamePrefix(classId.packageFqName, classId.relativeClassName.asString()) ?: return false val kind = FunctionClassKind.byClassNamePrefix(classId.packageFqName, classId.relativeClassName.asString()) ?: return false
return kind == FunctionClassDescriptor.Kind.Function || return kind == FunctionClassKind.Function ||
kind == FunctionClassDescriptor.Kind.KFunction || kind == FunctionClassKind.KFunction ||
kind == FunctionClassDescriptor.Kind.SuspendFunction || kind == FunctionClassKind.SuspendFunction ||
kind == FunctionClassDescriptor.Kind.KSuspendFunction kind == FunctionClassKind.KSuspendFunction
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
@@ -36,9 +36,9 @@ fun ConeKotlinType.isSuspendFunctionType(session: FirSession): Boolean {
} }
if (this !is ConeClassLikeType) return false if (this !is ConeClassLikeType) return false
val classId = this.fullyExpandedType(session).lookupTag.classId val classId = this.fullyExpandedType(session).lookupTag.classId
val kind = FunctionClassDescriptor.Kind.byClassNamePrefix(classId.packageFqName, classId.relativeClassName.asString()) ?: return false val kind = FunctionClassKind.byClassNamePrefix(classId.packageFqName, classId.relativeClassName.asString()) ?: return false
return kind == FunctionClassDescriptor.Kind.SuspendFunction || return kind == FunctionClassKind.SuspendFunction ||
kind == FunctionClassDescriptor.Kind.KSuspendFunction kind == FunctionClassKind.KSuspendFunction
} }
fun ConeKotlinType.receiverType(expectedTypeRef: FirTypeRef?, session: FirSession): ConeKotlinType? { fun ConeKotlinType.receiverType(expectedTypeRef: FirTypeRef?, session: FirSession): ConeKotlinType? {
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.providers.impl package org.jetbrains.kotlin.fir.resolve.providers.impl
import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.SourceElement
@@ -48,7 +48,7 @@ import java.io.InputStream
class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider(session) { class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider(session) {
private data class SyntheticFunctionalInterfaceSymbolKey(val kind: FunctionClassDescriptor.Kind, val arity: Int) private data class SyntheticFunctionalInterfaceSymbolKey(val kind: FunctionClassKind, val arity: Int)
private val allPackageFragments = loadBuiltIns().groupBy { it.fqName } private val allPackageFragments = loadBuiltIns().groupBy { it.fqName }
private val syntheticFunctionalInterfaceSymbols = mutableMapOf<SyntheticFunctionalInterfaceSymbolKey, FirRegularClassSymbol>() private val syntheticFunctionalInterfaceSymbols = mutableMapOf<SyntheticFunctionalInterfaceSymbolKey, FirRegularClassSymbol>()
@@ -79,7 +79,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
private fun trySyntheticFunctionalInterface(classId: ClassId): FirRegularClassSymbol? { private fun trySyntheticFunctionalInterface(classId: ClassId): FirRegularClassSymbol? {
return with(classId) { return with(classId) {
val className = relativeClassName.asString() val className = relativeClassName.asString()
val kind = FunctionClassDescriptor.Kind.byClassNamePrefix(packageFqName, className) ?: return@with null val kind = FunctionClassKind.byClassNamePrefix(packageFqName, className) ?: return@with null
val prefix = kind.classNamePrefix val prefix = kind.classNamePrefix
val arity = className.substring(prefix.length).toIntOrNull() ?: return null val arity = className.substring(prefix.length).toIntOrNull() ?: return null
syntheticFunctionalInterfaceSymbols.getOrPut(SyntheticFunctionalInterfaceSymbolKey(kind, arity)) { syntheticFunctionalInterfaceSymbols.getOrPut(SyntheticFunctionalInterfaceSymbolKey(kind, arity)) {
@@ -141,22 +141,22 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
isTailRec = false isTailRec = false
isExternal = false isExternal = false
isSuspend = isSuspend =
kind == FunctionClassDescriptor.Kind.SuspendFunction || kind == FunctionClassKind.SuspendFunction ||
kind == FunctionClassDescriptor.Kind.KSuspendFunction kind == FunctionClassKind.KSuspendFunction
} }
val typeArguments = typeParameters.map { val typeArguments = typeParameters.map {
buildResolvedTypeRef { buildResolvedTypeRef {
type = ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) type = ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false)
} }
} }
val superKind: FunctionClassDescriptor.Kind? = when (kind) { val superKind: FunctionClassKind? = when (kind) {
FunctionClassDescriptor.Kind.KFunction -> FunctionClassDescriptor.Kind.Function FunctionClassKind.KFunction -> FunctionClassKind.Function
FunctionClassDescriptor.Kind.KSuspendFunction -> FunctionClassDescriptor.Kind.SuspendFunction FunctionClassKind.KSuspendFunction -> FunctionClassKind.SuspendFunction
else -> null else -> null
} }
fun createSuperType( fun createSuperType(
kind: FunctionClassDescriptor.Kind, kind: FunctionClassKind,
): FirResolvedTypeRef { ): FirResolvedTypeRef {
return buildResolvedTypeRef { return buildResolvedTypeRef {
type = ConeClassLikeLookupTagImpl(kind.classId(arity)) type = ConeClassLikeLookupTagImpl(kind.classId(arity))
@@ -165,34 +165,34 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
} }
superTypeRefs += when (kind) { superTypeRefs += when (kind) {
FunctionClassDescriptor.Kind.Function -> listOf( FunctionClassKind.Function -> listOf(
buildResolvedTypeRef { buildResolvedTypeRef {
type = ConeClassLikeLookupTagImpl(StandardClassIds.Function) type = ConeClassLikeLookupTagImpl(StandardClassIds.Function)
.constructClassType(arrayOf(typeArguments.last().type), isNullable = false) .constructClassType(arrayOf(typeArguments.last().type), isNullable = false)
} }
) )
FunctionClassDescriptor.Kind.SuspendFunction -> listOf( FunctionClassKind.SuspendFunction -> listOf(
buildResolvedTypeRef { buildResolvedTypeRef {
type = ConeClassLikeLookupTagImpl(StandardClassIds.Function) type = ConeClassLikeLookupTagImpl(StandardClassIds.Function)
.constructClassType(arrayOf(typeArguments.last().type), isNullable = false) .constructClassType(arrayOf(typeArguments.last().type), isNullable = false)
} }
) )
FunctionClassDescriptor.Kind.KFunction -> listOf( FunctionClassKind.KFunction -> listOf(
buildResolvedTypeRef { buildResolvedTypeRef {
type = ConeClassLikeLookupTagImpl(StandardClassIds.KFunction) type = ConeClassLikeLookupTagImpl(StandardClassIds.KFunction)
.constructClassType(arrayOf(typeArguments.last().type), isNullable = false) .constructClassType(arrayOf(typeArguments.last().type), isNullable = false)
}, },
createSuperType(FunctionClassDescriptor.Kind.Function) createSuperType(FunctionClassKind.Function)
) )
FunctionClassDescriptor.Kind.KSuspendFunction -> listOf( FunctionClassKind.KSuspendFunction -> listOf(
buildResolvedTypeRef { buildResolvedTypeRef {
type = ConeClassLikeLookupTagImpl(StandardClassIds.KFunction) type = ConeClassLikeLookupTagImpl(StandardClassIds.KFunction)
.constructClassType(arrayOf(typeArguments.last().type), isNullable = false) .constructClassType(arrayOf(typeArguments.last().type), isNullable = false)
}, },
createSuperType(FunctionClassDescriptor.Kind.SuspendFunction) createSuperType(FunctionClassKind.SuspendFunction)
) )
} }
addDeclaration( addDeclaration(
@@ -232,14 +232,14 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
} }
// Find the symbol for "invoke" in the function class // Find the symbol for "invoke" in the function class
private fun FunctionClassDescriptor.Kind.getInvoke(arity: Int): FirNamedFunctionSymbol? { private fun FunctionClassKind.getInvoke(arity: Int): FirNamedFunctionSymbol? {
val functionClass = getClassLikeSymbolByFqName(classId(arity)) ?: return null val functionClass = getClassLikeSymbolByFqName(classId(arity)) ?: return null
val invoke = val invoke =
functionClass.fir.declarations.find { it is FirSimpleFunction && it.name == OperatorNameConventions.INVOKE } ?: return null functionClass.fir.declarations.find { it is FirSimpleFunction && it.name == OperatorNameConventions.INVOKE } ?: return null
return (invoke as FirSimpleFunction).symbol as? FirNamedFunctionSymbol return (invoke as FirSimpleFunction).symbol as? FirNamedFunctionSymbol
} }
private fun FunctionClassDescriptor.Kind.classId(arity: Int) = ClassId(packageFqName, numberedClassName(arity)) private fun FunctionClassKind.classId(arity: Int) = ClassId(packageFqName, numberedClassName(arity))
@FirSymbolProviderInternals @FirSymbolProviderInternals
override fun getTopLevelCallableSymbolsTo(destination: MutableList<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) { override fun getTopLevelCallableSymbolsTo(destination: MutableList<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
@@ -872,7 +872,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
print("|") print("|")
} }
private val FirResolvedTypeRef.functionTypeKind: FunctionClassDescriptor.Kind? private val FirResolvedTypeRef.functionTypeKind: FunctionClassKind?
get() { get() {
val classId = (type as? ConeClassLikeType)?.lookupTag?.classId ?: return null val classId = (type as? ConeClassLikeType)?.lookupTag?.classId ?: return null
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind( return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.descriptors
import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.KOTLIN_REFLECT_FQ_NAME import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.KOTLIN_REFLECT_FQ_NAME
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
@@ -281,13 +282,13 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
return symbolTable.declareClass(this) { return symbolTable.declareClass(this) {
val factory = FunctionDescriptorFactory.RealDescriptorFactory(this, symbolTable) val factory = FunctionDescriptorFactory.RealDescriptorFactory(this, symbolTable)
when (functionKind) { when (functionKind) {
FunctionClassDescriptor.Kind.Function -> FunctionClassKind.Function ->
createFunctionClass(it, false, false, arity, irBuiltIns.functionClass, kotlinPackageFragment, factory) createFunctionClass(it, false, false, arity, irBuiltIns.functionClass, kotlinPackageFragment, factory)
FunctionClassDescriptor.Kind.SuspendFunction -> FunctionClassKind.SuspendFunction ->
createFunctionClass(it, false, true, arity, irBuiltIns.functionClass, kotlinCoroutinesPackageFragment, factory) createFunctionClass(it, false, true, arity, irBuiltIns.functionClass, kotlinCoroutinesPackageFragment, factory)
FunctionClassDescriptor.Kind.KFunction -> FunctionClassKind.KFunction ->
createFunctionClass(it, true, false, arity, irBuiltIns.kFunctionClass, kotlinReflectPackageFragment, factory) createFunctionClass(it, true, false, arity, irBuiltIns.kFunctionClass, kotlinReflectPackageFragment, factory)
FunctionClassDescriptor.Kind.KSuspendFunction -> FunctionClassKind.KSuspendFunction ->
createFunctionClass(it, true, true, arity, irBuiltIns.kFunctionClass, kotlinReflectPackageFragment, factory) createFunctionClass(it, true, true, arity, irBuiltIns.kFunctionClass, kotlinReflectPackageFragment, factory)
} }
} }
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@@ -119,16 +120,16 @@ class IrModuleDeserializerWithBuiltIns(
val topLevelSignature = IdSignature.PublicSignature(publicSig.packageFqName, className, null, publicSig.mask) val topLevelSignature = IdSignature.PublicSignature(publicSig.packageFqName, className, null, publicSig.mask)
val functionClass = when (functionDescriptor.functionKind) { val functionClass = when (functionDescriptor.functionKind) {
FunctionClassDescriptor.Kind.KSuspendFunction -> functionFactory.kSuspendFunctionN(functionDescriptor.arity) { callback -> FunctionClassKind.KSuspendFunction -> functionFactory.kSuspendFunctionN(functionDescriptor.arity) { callback ->
declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) } declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) }
} }
FunctionClassDescriptor.Kind.KFunction -> functionFactory.kFunctionN(functionDescriptor.arity) { callback -> FunctionClassKind.KFunction -> functionFactory.kFunctionN(functionDescriptor.arity) { callback ->
declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) } declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) }
} }
FunctionClassDescriptor.Kind.SuspendFunction -> functionFactory.suspendFunctionN(functionDescriptor.arity) { callback -> FunctionClassKind.SuspendFunction -> functionFactory.suspendFunctionN(functionDescriptor.arity) { callback ->
declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) } declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) }
} }
FunctionClassDescriptor.Kind.Function -> functionFactory.functionN(functionDescriptor.arity) { callback -> FunctionClassKind.Function -> functionFactory.functionN(functionDescriptor.arity) { callback ->
declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) } declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) }
} }
} }
@@ -0,0 +1,24 @@
/*
* 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
import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
enum class FunctionClassKind(val packageFqName: FqName, val classNamePrefix: String) {
Function(KotlinBuiltInsNames.BUILT_INS_PACKAGE_FQ_NAME, "Function"),
SuspendFunction(KotlinBuiltInsNames.COROUTINES_PACKAGE_FQ_NAME_RELEASE, "SuspendFunction"),
KFunction(KotlinBuiltInsNames.KOTLIN_REFLECT_FQ_NAME, "KFunction"),
KSuspendFunction(KotlinBuiltInsNames.KOTLIN_REFLECT_FQ_NAME, "KSuspendFunction");
fun numberedClassName(arity: Int) = Name.identifier("$classNamePrefix$arity")
companion object {
fun byClassNamePrefix(packageFqName: FqName, className: String): FunctionClassKind? =
values().firstOrNull { it.packageFqName == packageFqName && className.startsWith(it.classNamePrefix) }
}
}
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.builtins.CompanionObjectMapping
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.FqNames import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.FqNames
import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMap import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMap
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor 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.*
@@ -23,13 +23,13 @@ import java.util.*
object JavaToKotlinClassMap : PlatformToKotlinClassMap { object JavaToKotlinClassMap : PlatformToKotlinClassMap {
private val NUMBERED_FUNCTION_PREFIX = private val NUMBERED_FUNCTION_PREFIX =
FunctionClassDescriptor.Kind.Function.packageFqName.toString() + "." + FunctionClassDescriptor.Kind.Function.classNamePrefix FunctionClassKind.Function.packageFqName.toString() + "." + FunctionClassKind.Function.classNamePrefix
private val NUMBERED_K_FUNCTION_PREFIX = private val NUMBERED_K_FUNCTION_PREFIX =
FunctionClassDescriptor.Kind.KFunction.packageFqName.toString() + "." + FunctionClassDescriptor.Kind.KFunction.classNamePrefix FunctionClassKind.KFunction.packageFqName.toString() + "." + FunctionClassKind.KFunction.classNamePrefix
private val NUMBERED_SUSPEND_FUNCTION_PREFIX = private val NUMBERED_SUSPEND_FUNCTION_PREFIX =
FunctionClassDescriptor.Kind.SuspendFunction.packageFqName.toString() + "." + FunctionClassDescriptor.Kind.SuspendFunction.classNamePrefix FunctionClassKind.SuspendFunction.packageFqName.toString() + "." + FunctionClassKind.SuspendFunction.classNamePrefix
private val NUMBERED_K_SUSPEND_FUNCTION_PREFIX = private val NUMBERED_K_SUSPEND_FUNCTION_PREFIX =
FunctionClassDescriptor.Kind.KSuspendFunction.packageFqName.toString() + "." + FunctionClassDescriptor.Kind.KSuspendFunction.classNamePrefix FunctionClassKind.KSuspendFunction.packageFqName.toString() + "." + FunctionClassKind.KSuspendFunction.classNamePrefix
private val FUNCTION_N_CLASS_ID = ClassId.topLevel(FqName("kotlin.jvm.functions.FunctionN")) private val FUNCTION_N_CLASS_ID = ClassId.topLevel(FqName("kotlin.jvm.functions.FunctionN"))
val FUNCTION_N_FQ_NAME = FUNCTION_N_CLASS_ID.asSingleFqName() val FUNCTION_N_FQ_NAME = FUNCTION_N_CLASS_ID.asSingleFqName()
@@ -102,7 +102,7 @@ object JavaToKotlinClassMap : PlatformToKotlinClassMap {
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 FunctionInvokeDescriptor.BIG_ARITY - 1) {
val kSuspendFunction = FunctionClassDescriptor.Kind.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)
} }
@@ -10,7 +10,7 @@ import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory; import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory;
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor; import org.jetbrains.kotlin.builtins.functions.FunctionClassKind;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider; import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider;
@@ -295,7 +295,7 @@ public abstract class KotlinBuiltIns {
@NotNull @NotNull
private static FqNameUnsafe getKFunctionFqName(int parameterCount) { private static FqNameUnsafe getKFunctionFqName(int parameterCount) {
return FqNames.reflect(FunctionClassDescriptor.Kind.KFunction.getClassNamePrefix() + parameterCount); return FqNames.reflect(FunctionClassKind.KFunction.getClassNamePrefix() + parameterCount);
} }
@NotNull @NotNull
@@ -310,7 +310,7 @@ public abstract class KotlinBuiltIns {
@NotNull @NotNull
public static String getSuspendFunctionName(int parameterCount) { public static String getSuspendFunctionName(int parameterCount) {
return FunctionClassDescriptor.Kind.SuspendFunction.getClassNamePrefix() + parameterCount; return FunctionClassKind.SuspendFunction.getClassNamePrefix() + parameterCount;
} }
@NotNull @NotNull
@@ -330,7 +330,7 @@ public abstract class KotlinBuiltIns {
@NotNull @NotNull
public ClassDescriptor getKSuspendFunction(int parameterCount) { public ClassDescriptor getKSuspendFunction(int parameterCount) {
Name name = Name.identifier(FunctionClassDescriptor.Kind.KSuspendFunction.getClassNamePrefix() + parameterCount); Name name = Name.identifier(FunctionClassKind.KSuspendFunction.getClassNamePrefix() + parameterCount);
return getBuiltInClassByFqName(COROUTINES_PACKAGE_FQ_NAME_RELEASE.child(name)); return getBuiltInClassByFqName(COROUTINES_PACKAGE_FQ_NAME_RELEASE.child(name));
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.builtins
import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.BUILT_INS_PACKAGE_NAME import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.BUILT_INS_PACKAGE_NAME
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
@@ -59,16 +59,16 @@ fun KotlinType.isFunctionTypeOrSubtype(predicate: (KotlinType) -> Boolean): Bool
isTypeOrSubtypeOf { it.isFunctionType && predicate(it) } isTypeOrSubtypeOf { it.isFunctionType && predicate(it) }
val KotlinType.isFunctionType: Boolean val KotlinType.isFunctionType: Boolean
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.Function get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassKind.Function
val KotlinType.isKFunctionType: Boolean val KotlinType.isKFunctionType: Boolean
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.KFunction get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassKind.KFunction
val KotlinType.isSuspendFunctionType: Boolean val KotlinType.isSuspendFunctionType: Boolean
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.SuspendFunction get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassKind.SuspendFunction
val KotlinType.isKSuspendFunctionType: Boolean val KotlinType.isKSuspendFunctionType: Boolean
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.KSuspendFunction get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassKind.KSuspendFunction
val KotlinType.isFunctionOrSuspendFunctionType: Boolean val KotlinType.isFunctionOrSuspendFunctionType: Boolean
get() = isFunctionType || isSuspendFunctionType get() = isFunctionType || isSuspendFunctionType
@@ -82,16 +82,16 @@ val KotlinType.isBuiltinFunctionalType: Boolean
val DeclarationDescriptor.isBuiltinFunctionalClassDescriptor: Boolean val DeclarationDescriptor.isBuiltinFunctionalClassDescriptor: Boolean
get() { get() {
val functionalClassKind = getFunctionalClassKind() val functionalClassKind = getFunctionalClassKind()
return functionalClassKind == FunctionClassDescriptor.Kind.Function || return functionalClassKind == FunctionClassKind.Function ||
functionalClassKind == FunctionClassDescriptor.Kind.SuspendFunction functionalClassKind == FunctionClassKind.SuspendFunction
} }
fun isBuiltinFunctionClass(classId: ClassId): Boolean { fun isBuiltinFunctionClass(classId: ClassId): Boolean {
if (!classId.startsWith(KotlinBuiltInsNames.BUILT_INS_PACKAGE_NAME)) return false if (!classId.startsWith(KotlinBuiltInsNames.BUILT_INS_PACKAGE_NAME)) return false
val kind = classId.asSingleFqName().toUnsafe().getFunctionalClassKind() val kind = classId.asSingleFqName().toUnsafe().getFunctionalClassKind()
return kind == FunctionClassDescriptor.Kind.Function || return kind == FunctionClassKind.Function ||
kind == FunctionClassDescriptor.Kind.SuspendFunction kind == FunctionClassKind.SuspendFunction
} }
val KotlinType.isNonExtensionFunctionType: Boolean val KotlinType.isNonExtensionFunctionType: Boolean
@@ -112,17 +112,17 @@ private val KotlinType.isTypeAnnotatedWithExtensionFunctionType: Boolean
*/ */
fun isNumberedFunctionClassFqName(fqName: FqNameUnsafe): Boolean { fun isNumberedFunctionClassFqName(fqName: FqNameUnsafe): Boolean {
return fqName.startsWith(BUILT_INS_PACKAGE_NAME) && return fqName.startsWith(BUILT_INS_PACKAGE_NAME) &&
fqName.getFunctionalClassKind() == FunctionClassDescriptor.Kind.Function fqName.getFunctionalClassKind() == FunctionClassKind.Function
} }
fun DeclarationDescriptor.getFunctionalClassKind(): FunctionClassDescriptor.Kind? { fun DeclarationDescriptor.getFunctionalClassKind(): FunctionClassKind? {
if (this !is ClassDescriptor) return null if (this !is ClassDescriptor) return null
if (!KotlinBuiltIns.isUnderKotlinPackage(this)) return null if (!KotlinBuiltIns.isUnderKotlinPackage(this)) return null
return fqNameUnsafe.getFunctionalClassKind() return fqNameUnsafe.getFunctionalClassKind()
} }
private fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassDescriptor.Kind? { private fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassKind? {
if (!isSafe || isRoot) return null if (!isSafe || isRoot) return null
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(shortName().asString(), toSafe().parent()) return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(shortName().asString(), toSafe().parent())
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.builtins.functions
import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment
import org.jetbrains.kotlin.builtins.FunctionInterfacePackageFragment import org.jetbrains.kotlin.builtins.FunctionInterfacePackageFragment
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor.Kind
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory
@@ -35,11 +34,11 @@ class BuiltInFictitiousFunctionClassFactory(
private val module: ModuleDescriptor private val module: ModuleDescriptor
) : ClassDescriptorFactory { ) : ClassDescriptorFactory {
private data class KindWithArity(val kind: Kind, val arity: Int) private data class KindWithArity(val kind: FunctionClassKind, val arity: Int)
companion object { companion object {
private fun parseClassName(className: String, packageFqName: FqName): KindWithArity? { private fun parseClassName(className: String, packageFqName: FqName): KindWithArity? {
val kind = FunctionClassDescriptor.Kind.byClassNamePrefix(packageFqName, className) ?: return null val kind = FunctionClassKind.byClassNamePrefix(packageFqName, className) ?: return null
val prefix = kind.classNamePrefix val prefix = kind.classNamePrefix
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor
import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
@@ -32,24 +31,10 @@ import java.util.*
class FunctionClassDescriptor( class FunctionClassDescriptor(
private val storageManager: StorageManager, private val storageManager: StorageManager,
private val containingDeclaration: PackageFragmentDescriptor, private val containingDeclaration: PackageFragmentDescriptor,
val functionKind: Kind, val functionKind: FunctionClassKind,
val arity: Int val arity: Int
) : AbstractClassDescriptor(storageManager, functionKind.numberedClassName(arity)) { ) : AbstractClassDescriptor(storageManager, functionKind.numberedClassName(arity)) {
enum class Kind(val packageFqName: FqName, val classNamePrefix: String) {
Function(BUILT_INS_PACKAGE_FQ_NAME, "Function"),
SuspendFunction(COROUTINES_PACKAGE_FQ_NAME_RELEASE, "SuspendFunction"),
KFunction(KOTLIN_REFLECT_FQ_NAME, "KFunction"),
KSuspendFunction(KOTLIN_REFLECT_FQ_NAME, "KSuspendFunction");
fun numberedClassName(arity: Int) = Name.identifier("$classNamePrefix$arity")
companion object {
fun byClassNamePrefix(packageFqName: FqName, className: String) =
Kind.values().firstOrNull { it.packageFqName == packageFqName && className.startsWith(it.classNamePrefix) }
}
}
private val typeConstructor = FunctionTypeConstructor() private val typeConstructor = FunctionTypeConstructor()
private val memberScope = FunctionClassScope(storageManager, this) private val memberScope = FunctionClassScope(storageManager, this)
@@ -109,14 +94,14 @@ class FunctionClassDescriptor(
override fun computeSupertypes(): Collection<KotlinType> { override fun computeSupertypes(): Collection<KotlinType> {
// For K{Suspend}Function{n}, add corresponding numbered {Suspend}Function{n} class, e.g. {Suspend}Function2 for K{Suspend}Function2 // For K{Suspend}Function{n}, add corresponding numbered {Suspend}Function{n} class, e.g. {Suspend}Function2 for K{Suspend}Function2
val supertypes = when (functionKind) { val supertypes = when (functionKind) {
Kind.Function -> // Function$N <: Function FunctionClassKind.Function -> // Function$N <: Function
listOf(functionClassId) listOf(functionClassId)
Kind.KFunction -> // KFunction$N <: KFunction FunctionClassKind.KFunction -> // KFunction$N <: KFunction
listOf(kFunctionClassId, ClassId(BUILT_INS_PACKAGE_FQ_NAME, Kind.Function.numberedClassName(arity))) listOf(kFunctionClassId, ClassId(BUILT_INS_PACKAGE_FQ_NAME, FunctionClassKind.Function.numberedClassName(arity)))
Kind.SuspendFunction -> // SuspendFunction$N<...> <: Function FunctionClassKind.SuspendFunction -> // SuspendFunction$N<...> <: Function
listOf(functionClassId) listOf(functionClassId)
Kind.KSuspendFunction -> // KSuspendFunction$N<...> <: KFunction FunctionClassKind.KSuspendFunction -> // KSuspendFunction$N<...> <: KFunction
listOf(kFunctionClassId, ClassId(COROUTINES_PACKAGE_FQ_NAME_RELEASE, Kind.SuspendFunction.numberedClassName(arity))) listOf(kFunctionClassId, ClassId(COROUTINES_PACKAGE_FQ_NAME_RELEASE, FunctionClassKind.SuspendFunction.numberedClassName(arity)))
} }
val moduleDescriptor = containingDeclaration.containingDeclaration val moduleDescriptor = containingDeclaration.containingDeclaration
@@ -26,8 +26,8 @@ class FunctionClassScope(
) : GivenFunctionsMemberScope(storageManager, containingClass) { ) : GivenFunctionsMemberScope(storageManager, containingClass) {
override fun computeDeclaredFunctions(): List<FunctionDescriptor> = override fun computeDeclaredFunctions(): List<FunctionDescriptor> =
when ((containingClass as FunctionClassDescriptor).functionKind) { when ((containingClass as FunctionClassDescriptor).functionKind) {
FunctionClassDescriptor.Kind.Function -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = false)) FunctionClassKind.Function -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = false))
FunctionClassDescriptor.Kind.SuspendFunction -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = true)) FunctionClassKind.SuspendFunction -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = true))
else -> emptyList() else -> emptyList()
} }
} }
@@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor; import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor;
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind;
import org.jetbrains.kotlin.config.LanguageVersion; import org.jetbrains.kotlin.config.LanguageVersion;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
@@ -67,7 +68,8 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import static org.jetbrains.kotlin.descriptors.FindClassInModuleKt.findClassAcrossModuleDependencies; import static org.jetbrains.kotlin.descriptors.FindClassInModuleKt.findClassAcrossModuleDependencies;
import static org.jetbrains.kotlin.js.translate.context.Namer.*; import static org.jetbrains.kotlin.js.translate.context.Namer.GET_KCLASS_FROM_EXPRESSION;
import static org.jetbrains.kotlin.js.translate.context.Namer.getCapturedVarAccessor;
import static org.jetbrains.kotlin.js.translate.general.Translation.translateAsExpression; import static org.jetbrains.kotlin.js.translate.general.Translation.translateAsExpression;
import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.*; import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.*;
import static org.jetbrains.kotlin.js.translate.utils.ErrorReportingUtils.message; import static org.jetbrains.kotlin.js.translate.utils.ErrorReportingUtils.message;
@@ -331,7 +333,7 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
default: { default: {
if (descriptor instanceof FunctionClassDescriptor) { if (descriptor instanceof FunctionClassDescriptor) {
FunctionClassDescriptor functionClassDescriptor = (FunctionClassDescriptor) descriptor; FunctionClassDescriptor functionClassDescriptor = (FunctionClassDescriptor) descriptor;
if (functionClassDescriptor.getFunctionKind() == FunctionClassDescriptor.Kind.Function) { if (functionClassDescriptor.getFunctionKind() == FunctionClassKind.Function) {
ClassDescriptor primitivesObject = findPrimitiveClassesObject(context); ClassDescriptor primitivesObject = findPrimitiveClassesObject(context);
assert primitivesObject != null; assert primitivesObject != null;
FunctionDescriptor function = DescriptorUtils.getFunctionByName( FunctionDescriptor function = DescriptorUtils.getFunctionByName(