Move FunctionClassDescriptor.Kind to :core:descriptors.common module
This commit is contained in:
+24
@@ -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.KotlinBuiltInsNames.FqNames
|
||||
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.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.name.*
|
||||
@@ -23,13 +23,13 @@ import java.util.*
|
||||
|
||||
object JavaToKotlinClassMap : PlatformToKotlinClassMap {
|
||||
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 =
|
||||
FunctionClassDescriptor.Kind.KFunction.packageFqName.toString() + "." + FunctionClassDescriptor.Kind.KFunction.classNamePrefix
|
||||
FunctionClassKind.KFunction.packageFqName.toString() + "." + FunctionClassKind.KFunction.classNamePrefix
|
||||
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 =
|
||||
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"))
|
||||
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)
|
||||
}
|
||||
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
|
||||
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.Nullable;
|
||||
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.annotations.Annotations;
|
||||
import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider;
|
||||
@@ -295,7 +295,7 @@ public abstract class KotlinBuiltIns {
|
||||
|
||||
@NotNull
|
||||
private static FqNameUnsafe getKFunctionFqName(int parameterCount) {
|
||||
return FqNames.reflect(FunctionClassDescriptor.Kind.KFunction.getClassNamePrefix() + parameterCount);
|
||||
return FqNames.reflect(FunctionClassKind.KFunction.getClassNamePrefix() + parameterCount);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -310,7 +310,7 @@ public abstract class KotlinBuiltIns {
|
||||
|
||||
@NotNull
|
||||
public static String getSuspendFunctionName(int parameterCount) {
|
||||
return FunctionClassDescriptor.Kind.SuspendFunction.getClassNamePrefix() + parameterCount;
|
||||
return FunctionClassKind.SuspendFunction.getClassNamePrefix() + parameterCount;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -330,7 +330,7 @@ public abstract class KotlinBuiltIns {
|
||||
|
||||
@NotNull
|
||||
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));
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.builtins
|
||||
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltInsNames.BUILT_INS_PACKAGE_NAME
|
||||
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.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
@@ -59,16 +59,16 @@ fun KotlinType.isFunctionTypeOrSubtype(predicate: (KotlinType) -> Boolean): Bool
|
||||
isTypeOrSubtypeOf { it.isFunctionType && predicate(it) }
|
||||
|
||||
val KotlinType.isFunctionType: Boolean
|
||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.Function
|
||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassKind.Function
|
||||
|
||||
val KotlinType.isKFunctionType: Boolean
|
||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.KFunction
|
||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassKind.KFunction
|
||||
|
||||
val KotlinType.isSuspendFunctionType: Boolean
|
||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.SuspendFunction
|
||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassKind.SuspendFunction
|
||||
|
||||
val KotlinType.isKSuspendFunctionType: Boolean
|
||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassDescriptor.Kind.KSuspendFunction
|
||||
get() = constructor.declarationDescriptor?.getFunctionalClassKind() == FunctionClassKind.KSuspendFunction
|
||||
|
||||
val KotlinType.isFunctionOrSuspendFunctionType: Boolean
|
||||
get() = isFunctionType || isSuspendFunctionType
|
||||
@@ -82,16 +82,16 @@ val KotlinType.isBuiltinFunctionalType: Boolean
|
||||
val DeclarationDescriptor.isBuiltinFunctionalClassDescriptor: Boolean
|
||||
get() {
|
||||
val functionalClassKind = getFunctionalClassKind()
|
||||
return functionalClassKind == FunctionClassDescriptor.Kind.Function ||
|
||||
functionalClassKind == FunctionClassDescriptor.Kind.SuspendFunction
|
||||
return functionalClassKind == FunctionClassKind.Function ||
|
||||
functionalClassKind == FunctionClassKind.SuspendFunction
|
||||
}
|
||||
|
||||
fun isBuiltinFunctionClass(classId: ClassId): Boolean {
|
||||
if (!classId.startsWith(KotlinBuiltInsNames.BUILT_INS_PACKAGE_NAME)) return false
|
||||
|
||||
val kind = classId.asSingleFqName().toUnsafe().getFunctionalClassKind()
|
||||
return kind == FunctionClassDescriptor.Kind.Function ||
|
||||
kind == FunctionClassDescriptor.Kind.SuspendFunction
|
||||
return kind == FunctionClassKind.Function ||
|
||||
kind == FunctionClassKind.SuspendFunction
|
||||
}
|
||||
|
||||
val KotlinType.isNonExtensionFunctionType: Boolean
|
||||
@@ -112,17 +112,17 @@ private val KotlinType.isTypeAnnotatedWithExtensionFunctionType: Boolean
|
||||
*/
|
||||
fun isNumberedFunctionClassFqName(fqName: FqNameUnsafe): Boolean {
|
||||
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 (!KotlinBuiltIns.isUnderKotlinPackage(this)) return null
|
||||
|
||||
return fqNameUnsafe.getFunctionalClassKind()
|
||||
}
|
||||
|
||||
private fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassDescriptor.Kind? {
|
||||
private fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassKind? {
|
||||
if (!isSafe || isRoot) return null
|
||||
|
||||
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(shortName().asString(), toSafe().parent())
|
||||
|
||||
+2
-3
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.builtins.functions
|
||||
|
||||
import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment
|
||||
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.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory
|
||||
@@ -35,11 +34,11 @@ class BuiltInFictitiousFunctionClassFactory(
|
||||
private val module: ModuleDescriptor
|
||||
) : ClassDescriptorFactory {
|
||||
|
||||
private data class KindWithArity(val kind: Kind, val arity: Int)
|
||||
private data class KindWithArity(val kind: FunctionClassKind, val arity: Int)
|
||||
|
||||
companion object {
|
||||
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
|
||||
|
||||
|
||||
+7
-22
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
@@ -32,24 +31,10 @@ import java.util.*
|
||||
class FunctionClassDescriptor(
|
||||
private val storageManager: StorageManager,
|
||||
private val containingDeclaration: PackageFragmentDescriptor,
|
||||
val functionKind: Kind,
|
||||
val functionKind: FunctionClassKind,
|
||||
val arity: Int
|
||||
) : 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 memberScope = FunctionClassScope(storageManager, this)
|
||||
|
||||
@@ -109,14 +94,14 @@ class FunctionClassDescriptor(
|
||||
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
|
||||
val supertypes = when (functionKind) {
|
||||
Kind.Function -> // Function$N <: Function
|
||||
FunctionClassKind.Function -> // Function$N <: Function
|
||||
listOf(functionClassId)
|
||||
Kind.KFunction -> // KFunction$N <: KFunction
|
||||
listOf(kFunctionClassId, ClassId(BUILT_INS_PACKAGE_FQ_NAME, Kind.Function.numberedClassName(arity)))
|
||||
Kind.SuspendFunction -> // SuspendFunction$N<...> <: Function
|
||||
FunctionClassKind.KFunction -> // KFunction$N <: KFunction
|
||||
listOf(kFunctionClassId, ClassId(BUILT_INS_PACKAGE_FQ_NAME, FunctionClassKind.Function.numberedClassName(arity)))
|
||||
FunctionClassKind.SuspendFunction -> // SuspendFunction$N<...> <: Function
|
||||
listOf(functionClassId)
|
||||
Kind.KSuspendFunction -> // KSuspendFunction$N<...> <: KFunction
|
||||
listOf(kFunctionClassId, ClassId(COROUTINES_PACKAGE_FQ_NAME_RELEASE, Kind.SuspendFunction.numberedClassName(arity)))
|
||||
FunctionClassKind.KSuspendFunction -> // KSuspendFunction$N<...> <: KFunction
|
||||
listOf(kFunctionClassId, ClassId(COROUTINES_PACKAGE_FQ_NAME_RELEASE, FunctionClassKind.SuspendFunction.numberedClassName(arity)))
|
||||
}
|
||||
|
||||
val moduleDescriptor = containingDeclaration.containingDeclaration
|
||||
|
||||
@@ -26,8 +26,8 @@ class FunctionClassScope(
|
||||
) : GivenFunctionsMemberScope(storageManager, containingClass) {
|
||||
override fun computeDeclaredFunctions(): List<FunctionDescriptor> =
|
||||
when ((containingClass as FunctionClassDescriptor).functionKind) {
|
||||
FunctionClassDescriptor.Kind.Function -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = false))
|
||||
FunctionClassDescriptor.Kind.SuspendFunction -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = true))
|
||||
FunctionClassKind.Function -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = false))
|
||||
FunctionClassKind.SuspendFunction -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = true))
|
||||
else -> emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user