Refactor fictitious function class kinds, reuse in J<->K map
This commit is contained in:
+3
-5
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
+4
-13
@@ -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<Kind>): 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()
|
||||
|
||||
+14
-6
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user