Minor, simplify/optimize FunctionTypeConstructor.computeSupertypes

This commit is contained in:
Alexander Udalov
2019-02-01 18:10:38 +01:00
parent b73a927133
commit 4d817aa6cf
@@ -105,44 +105,29 @@ class FunctionClassDescriptor(
private inner class FunctionTypeConstructor : AbstractClassTypeConstructor(storageManager) {
override fun computeSupertypes(): Collection<KotlinType> {
val result = ArrayList<KotlinType>(2)
// 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
listOf(functionClassId)
Kind.KFunction -> // KFunction$N <: KFunction
listOf(kFunctionClassId, ClassId(BUILT_INS_PACKAGE_FQ_NAME, Kind.Function.numberedClassName(arity)))
Kind.SuspendFunction -> // SuspendFunction$N<...> <: Function
listOf(functionClassId)
Kind.KSuspendFunction -> // KSuspendFunction$N<...> <: KFunction
listOf(kFunctionClassId, ClassId(COROUTINES_PACKAGE_FQ_NAME_RELEASE, Kind.SuspendFunction.numberedClassName(arity)))
}
fun add(id: ClassId) {
val moduleDescriptor = containingDeclaration.containingDeclaration
val moduleDescriptor = containingDeclaration.containingDeclaration
return supertypes.map { id ->
val descriptor = moduleDescriptor.findClassAcrossModuleDependencies(id) ?: error("Built-in class $id not found")
val typeConstructor = descriptor.typeConstructor
// Substitute all type parameters of the super class with our last type parameters
val arguments = parameters.takeLast(typeConstructor.parameters.size).map {
val arguments = parameters.takeLast(descriptor.typeConstructor.parameters.size).map {
TypeProjectionImpl(it.defaultType)
}
result.add(KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, descriptor, arguments))
}
when (functionKind) {
Kind.SuspendFunction -> // SuspendFunction$N<...> <: Function
add(functionClassId)
Kind.KSuspendFunction -> // KSuspendFunction$N<...> <: KFunction
add(kFunctionClassId)
Kind.Function -> // Function$N <: Function
add(functionClassId)
Kind.KFunction -> // KFunction$N <: KFunction
add(kFunctionClassId)
}
// For K{Suspend}Function{n}, add corresponding numbered {Suspend}Function{n} class, e.g. {Suspend}Function2 for K{Suspend}Function2
when (functionKind) {
Kind.KFunction ->
add(ClassId(BUILT_INS_PACKAGE_FQ_NAME, Kind.Function.numberedClassName(arity)))
Kind.KSuspendFunction ->
add(ClassId(COROUTINES_PACKAGE_FQ_NAME_RELEASE, Kind.SuspendFunction.numberedClassName(arity)))
else -> {
}
}
return result.toList()
KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, descriptor, arguments)
}.toList()
}
override fun getParameters() = this@FunctionClassDescriptor.parameters
@@ -159,7 +144,7 @@ class FunctionClassDescriptor(
override fun toString() = name.asString()
companion object {
val functionClassId = ClassId(BUILT_INS_PACKAGE_FQ_NAME, Name.identifier("Function"))
val kFunctionClassId = ClassId(KOTLIN_REFLECT_FQ_NAME, Name.identifier("KFunction"))
private val functionClassId = ClassId(BUILT_INS_PACKAGE_FQ_NAME, Name.identifier("Function"))
private val kFunctionClassId = ClassId(KOTLIN_REFLECT_FQ_NAME, Name.identifier("KFunction"))
}
}