Refactor fictitious function class kinds, reuse in J<->K map

This commit is contained in:
Alexander Udalov
2015-05-28 19:26:59 +03:00
parent 9e8c51f7d3
commit b474fa9278
4 changed files with 23 additions and 29 deletions
@@ -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
@@ -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()
@@ -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)