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.CompanionObjectMapping;
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType;
|
import org.jetbrains.kotlin.builtins.PrimitiveType;
|
||||||
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.kotlin.name.ClassId;
|
import org.jetbrains.kotlin.name.ClassId;
|
||||||
import org.jetbrains.kotlin.name.FqName;
|
import org.jetbrains.kotlin.name.FqName;
|
||||||
@@ -77,11 +78,8 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
|
|||||||
for (int i = 0; i < 23; i++) {
|
for (int i = 0; i < 23; i++) {
|
||||||
add(ClassId.topLevel(new FqName("kotlin.jvm.functions.Function" + i)), builtIns.getFunction(i));
|
add(ClassId.topLevel(new FqName("kotlin.jvm.functions.Function" + i)), builtIns.getFunction(i));
|
||||||
|
|
||||||
for (String kFun : Arrays.asList(
|
for (FunctionClassDescriptor.Kind kind : FunctionClassDescriptor.Kinds.KFunctions) {
|
||||||
"kotlin.reflect.KFunction",
|
String kFun = kind.getPackageFqName() + "." + kind.getClassNamePrefix();
|
||||||
"kotlin.reflect.KMemberFunction",
|
|
||||||
"kotlin.reflect.KExtensionFunction"
|
|
||||||
)) {
|
|
||||||
addKotlinToJava(new FqNameUnsafe(kFun + i), ClassId.topLevel(new FqName(kFun)));
|
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.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.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl;
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl;
|
||||||
@@ -771,10 +770,8 @@ public class KotlinBuiltIns {
|
|||||||
|
|
||||||
if (!BUILT_INS_PACKAGE_NAME.equals(first(segments))) return false;
|
if (!BUILT_INS_PACKAGE_NAME.equals(first(segments))) return false;
|
||||||
|
|
||||||
return BuiltInFictitiousFunctionClassFactory.parseClassName(
|
String shortName = last(segments).asString();
|
||||||
last(segments).asString(),
|
return BuiltInFictitiousFunctionClassFactory.parseClassName(shortName, BUILT_INS_PACKAGE_FQ_NAME) != null;
|
||||||
FunctionClassDescriptor.Kinds.Functions
|
|
||||||
) != null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
+4
-13
@@ -16,13 +16,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.builtins.functions
|
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.Kind
|
||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor.Kinds
|
|
||||||
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.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory
|
import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
import kotlin.platform.platformStatic
|
import kotlin.platform.platformStatic
|
||||||
@@ -38,8 +36,8 @@ public class BuiltInFictitiousFunctionClassFactory(
|
|||||||
private data class KindWithArity(val kind: Kind, val arity: Int)
|
private data class KindWithArity(val kind: Kind, val arity: Int)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
platformStatic public fun parseClassName(className: String, allowedKinds: Set<Kind>): KindWithArity? {
|
platformStatic public fun parseClassName(className: String, packageFqName: FqName): KindWithArity? {
|
||||||
for (kind in allowedKinds) {
|
for (kind in FunctionClassDescriptor.Kinds.byPackage(packageFqName)) {
|
||||||
val prefix = kind.classNamePrefix
|
val prefix = kind.classNamePrefix
|
||||||
if (!className.startsWith(prefix)) continue
|
if (!className.startsWith(prefix)) continue
|
||||||
|
|
||||||
@@ -72,14 +70,7 @@ public class BuiltInFictitiousFunctionClassFactory(
|
|||||||
if ("Function" !in className) return null // An optimization
|
if ("Function" !in className) return null // An optimization
|
||||||
|
|
||||||
val packageFqName = classId.getPackageFqName()
|
val packageFqName = classId.getPackageFqName()
|
||||||
|
val kindWithArity = parseClassName(className, packageFqName) ?: return null
|
||||||
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 (kind, arity) = kindWithArity // KT-5100
|
val (kind, arity) = kindWithArity // KT-5100
|
||||||
|
|
||||||
val containingPackageFragment = module.getPackage(packageFqName)!!.getFragments().single()
|
val containingPackageFragment = module.getPackage(packageFqName)!!.getFragments().single()
|
||||||
|
|||||||
+14
-6
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.builtins.functions
|
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
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_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.Kind
|
||||||
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
|||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl
|
||||||
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.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinClass
|
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinClass
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
@@ -50,11 +52,11 @@ public class FunctionClassDescriptor(
|
|||||||
val arity: Int
|
val arity: Int
|
||||||
) : AbstractClassDescriptor(storageManager, functionKind.numberedClassName(arity)) {
|
) : AbstractClassDescriptor(storageManager, functionKind.numberedClassName(arity)) {
|
||||||
|
|
||||||
public enum class Kind(val classNamePrefix: String) {
|
public enum class Kind(val packageFqName: FqName, val classNamePrefix: String) {
|
||||||
Function("Function"),
|
Function(BUILT_INS_PACKAGE_FQ_NAME, "Function"),
|
||||||
KFunction("KFunction"),
|
KFunction(KOTLIN_REFLECT_FQ_NAME, "KFunction"),
|
||||||
KMemberFunction("KMemberFunction"),
|
KMemberFunction(KOTLIN_REFLECT_FQ_NAME, "KMemberFunction"),
|
||||||
KExtensionFunction("KExtensionFunction");
|
KExtensionFunction(KOTLIN_REFLECT_FQ_NAME, "KExtensionFunction");
|
||||||
// TODO: KMemberExtensionFunction
|
// TODO: KMemberExtensionFunction
|
||||||
|
|
||||||
fun numberedClassName(arity: Int) = Name.identifier("$classNamePrefix$arity")
|
fun numberedClassName(arity: Int) = Name.identifier("$classNamePrefix$arity")
|
||||||
@@ -64,7 +66,13 @@ public class FunctionClassDescriptor(
|
|||||||
|
|
||||||
public object Kinds {
|
public object Kinds {
|
||||||
val Functions = EnumSet.of(Kind.Function)
|
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)
|
private val staticScope = StaticScopeForKotlinClass(this)
|
||||||
|
|||||||
Reference in New Issue
Block a user