Support KClass.qualifiedName in stdlib-only reflection implementation

#KT-34586 Fixed
This commit is contained in:
Alexander Udalov
2019-10-24 19:16:57 +02:00
parent c164745301
commit 5c89f2fa54
10 changed files with 61 additions and 27 deletions
@@ -12,7 +12,7 @@ public class ClassReference(override val jClass: Class<*>) : KClass<Any>, ClassB
get() = getClassSimpleName(jClass)
override val qualifiedName: String?
get() = error()
get() = getClassQualifiedName(jClass)
override val members: Collection<KCallable<*>>
get() = error()
@@ -137,6 +137,9 @@ public class ClassReference(override val jClass: Class<*>) : KClass<Any>, ClassB
primitiveFqNames.values.associateTo(this) { kotlinName ->
"kotlin.jvm.internal.${kotlinName.substringAfterLast('.')}CompanionObject" to "$kotlinName.Companion"
}
for (arity in 0 until 23) {
put("kotlin.jvm.functions.Function$arity", "kotlin.Function$arity")
}
}
private val simpleNames = classFqNames.mapValues { (_, fqName) -> fqName.substringAfterLast('.') }
@@ -158,5 +161,18 @@ public class ClassReference(override val jClass: Class<*>) : KClass<Any>, ClassB
}
else -> simpleNames[jClass.name] ?: jClass.simpleName
}
public fun getClassQualifiedName(jClass: Class<*>): String? = when {
jClass.isAnonymousClass -> null
jClass.isLocalClass -> null
jClass.isArray -> {
val componentType = jClass.componentType
when {
componentType.isPrimitive -> classFqNames[componentType.name]?.plus("Array")
else -> null
} ?: "kotlin.Array"
}
else -> classFqNames[jClass.name] ?: jClass.canonicalName
}
}
}