From b474fa927818519170e008b40bcd7533670b7325 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 28 May 2015 19:26:59 +0300 Subject: [PATCH] Refactor fictitious function class kinds, reuse in J<->K map --- .../kotlin/platform/JavaToKotlinClassMap.java | 8 +++----- .../kotlin/builtins/KotlinBuiltIns.java | 7 ++----- .../BuiltInFictitiousFunctionClassFactory.kt | 17 ++++------------ .../functions/FunctionClassDescriptor.kt | 20 +++++++++++++------ 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java index 7c15d889c65..51100339bc1 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.CompanionObjectMapping; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.PrimitiveType; +import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; @@ -77,11 +78,8 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { for (int i = 0; i < 23; i++) { add(ClassId.topLevel(new FqName("kotlin.jvm.functions.Function" + i)), builtIns.getFunction(i)); - for (String kFun : Arrays.asList( - "kotlin.reflect.KFunction", - "kotlin.reflect.KMemberFunction", - "kotlin.reflect.KExtensionFunction" - )) { + for (FunctionClassDescriptor.Kind kind : FunctionClassDescriptor.Kinds.KFunctions) { + String kFun = kind.getPackageFqName() + "." + kind.getClassNamePrefix(); addKotlinToJava(new FqNameUnsafe(kFun + i), ClassId.topLevel(new FqName(kFun))); } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index fbc271f2423..5363ce299f3 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -21,7 +21,6 @@ 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.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl; @@ -771,10 +770,8 @@ public class KotlinBuiltIns { if (!BUILT_INS_PACKAGE_NAME.equals(first(segments))) return false; - return BuiltInFictitiousFunctionClassFactory.parseClassName( - last(segments).asString(), - FunctionClassDescriptor.Kinds.Functions - ) != null; + String shortName = last(segments).asString(); + return BuiltInFictitiousFunctionClassFactory.parseClassName(shortName, BUILT_INS_PACKAGE_FQ_NAME) != null; } @Nullable diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/BuiltInFictitiousFunctionClassFactory.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/BuiltInFictitiousFunctionClassFactory.kt index bab202cffce..de1ca110d4e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/BuiltInFictitiousFunctionClassFactory.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/BuiltInFictitiousFunctionClassFactory.kt @@ -16,13 +16,11 @@ package org.jetbrains.kotlin.builtins.functions -import org.jetbrains.kotlin.builtins.KOTLIN_REFLECT_FQ_NAME -import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor.Kind -import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor.Kinds import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory import org.jetbrains.kotlin.storage.StorageManager import kotlin.platform.platformStatic @@ -38,8 +36,8 @@ public class BuiltInFictitiousFunctionClassFactory( private data class KindWithArity(val kind: Kind, val arity: Int) companion object { - platformStatic public fun parseClassName(className: String, allowedKinds: Set): KindWithArity? { - for (kind in allowedKinds) { + platformStatic public fun parseClassName(className: String, packageFqName: FqName): KindWithArity? { + for (kind in FunctionClassDescriptor.Kinds.byPackage(packageFqName)) { val prefix = kind.classNamePrefix if (!className.startsWith(prefix)) continue @@ -72,14 +70,7 @@ public class BuiltInFictitiousFunctionClassFactory( if ("Function" !in className) return null // An optimization val packageFqName = classId.getPackageFqName() - - val allowedKinds = when (packageFqName) { - BUILT_INS_PACKAGE_FQ_NAME -> Kinds.Functions - KOTLIN_REFLECT_FQ_NAME -> Kinds.KFunctions - else -> return null - } - - val kindWithArity = parseClassName(className, allowedKinds) ?: return null + val kindWithArity = parseClassName(className, packageFqName) ?: return null val (kind, arity) = kindWithArity // KT-5100 val containingPackageFragment = module.getPackage(packageFqName)!!.getFragments().single() 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 eda7fd1725c..aa1196551f7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.builtins.functions +import org.jetbrains.kotlin.builtins.KOTLIN_REFLECT_FQ_NAME import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor.Kind @@ -24,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinClass import org.jetbrains.kotlin.storage.StorageManager @@ -50,11 +52,11 @@ public class FunctionClassDescriptor( val arity: Int ) : AbstractClassDescriptor(storageManager, functionKind.numberedClassName(arity)) { - public enum class Kind(val classNamePrefix: String) { - Function("Function"), - KFunction("KFunction"), - KMemberFunction("KMemberFunction"), - KExtensionFunction("KExtensionFunction"); + public enum class Kind(val packageFqName: FqName, val classNamePrefix: String) { + Function(BUILT_INS_PACKAGE_FQ_NAME, "Function"), + KFunction(KOTLIN_REFLECT_FQ_NAME, "KFunction"), + KMemberFunction(KOTLIN_REFLECT_FQ_NAME, "KMemberFunction"), + KExtensionFunction(KOTLIN_REFLECT_FQ_NAME, "KExtensionFunction"); // TODO: KMemberExtensionFunction fun numberedClassName(arity: Int) = Name.identifier("$classNamePrefix$arity") @@ -64,7 +66,13 @@ public class FunctionClassDescriptor( public object Kinds { val Functions = EnumSet.of(Kind.Function) - val KFunctions = EnumSet.of(Kind.KFunction, Kind.KMemberFunction, Kind.KExtensionFunction) + val KFunctions = EnumSet.complementOf(Functions) + + fun byPackage(fqName: FqName) = when (fqName) { + BUILT_INS_PACKAGE_FQ_NAME -> Functions + KOTLIN_REFLECT_FQ_NAME -> KFunctions + else -> error(fqName) + } } private val staticScope = StaticScopeForKotlinClass(this)