Improve KType.toString for primitive type arguments in stdlib implementation

This commit is contained in:
Alexander Udalov
2021-06-02 20:52:04 +02:00
parent 7306256127
commit 012c7c39af
3 changed files with 12 additions and 15 deletions
@@ -16,22 +16,20 @@ fun check(expected: String, actual: KType) {
fun box(): String {
check("java.lang.Iterable<java.lang.Number>", typeOf<Iterable<Number>>())
check("java.util.Iterator<java.lang.CharSequence>", typeOf<Iterator<CharSequence>>())
// TODO: java.util.Collection<java.lang.Character>
check("java.util.Collection<char>", typeOf<Collection<Char>>())
check("java.util.Collection<java.lang.Character>", typeOf<Collection<Char>>())
check("java.util.List<java.lang.String>", typeOf<List<String>>())
check("java.util.Set<java.lang.Double?>", typeOf<Set<Double?>>())
check("java.util.ListIterator<java.lang.Object>", typeOf<ListIterator<Any>>())
// TODO: java.util.Map<java.lang.Integer, kotlin.Unit>
check("java.util.Map<int, kotlin.Unit>", typeOf<Map<Int, Unit>>())
check("java.util.Map<java.lang.Integer, kotlin.Unit>", typeOf<Map<Int, Unit>>())
check("java.util.Map\$Entry<java.lang.Byte?, java.util.Set<*>>", typeOf<Map.Entry<Byte?, Set<*>>>())
check("java.lang.Iterable<java.lang.Number>", typeOf<MutableIterable<Number>>())
check("java.util.Iterator<java.lang.CharSequence>", typeOf<MutableIterator<CharSequence>>())
check("java.util.Collection<char>", typeOf<MutableCollection<Char>>())
check("java.util.Collection<java.lang.Character>", typeOf<MutableCollection<Char>>())
check("java.util.List<java.lang.String>", typeOf<MutableList<String>>())
check("java.util.Set<java.lang.Double?>", typeOf<MutableSet<Double?>>())
check("java.util.ListIterator<java.lang.Object>", typeOf<MutableListIterator<Any>>())
check("java.util.Map<int, kotlin.Unit>", typeOf<MutableMap<Int, Unit>>())
check("java.util.Map<java.lang.Integer, kotlin.Unit>", typeOf<MutableMap<Int, Unit>>())
check("java.util.Map\$Entry<java.lang.Byte?, java.util.Set<*>>", typeOf<MutableMap.MutableEntry<Byte?, Set<*>>>())
return "OK"
@@ -16,22 +16,20 @@ fun check(expected: String, actual: KType) {
fun box(): String {
check("java.lang.Iterable<java.lang.Number>", typeOf<Iterable<Number>>())
check("java.util.Iterator<java.lang.CharSequence>", typeOf<Iterator<CharSequence>>())
// TODO: java.util.Collection<java.lang.Character>
check("java.util.Collection<char>", typeOf<Collection<Char>>())
check("java.util.Collection<java.lang.Character>", typeOf<Collection<Char>>())
check("java.util.List<java.lang.String>", typeOf<List<String>>())
check("java.util.Set<java.lang.Double?>", typeOf<Set<Double?>>())
check("java.util.ListIterator<java.lang.Object>", typeOf<ListIterator<Any>>())
// TODO: java.util.Map<java.lang.Integer, kotlin.Unit>
check("java.util.Map<int, kotlin.Unit>", typeOf<Map<Int, Unit>>())
check("java.util.Map<java.lang.Integer, kotlin.Unit>", typeOf<Map<Int, Unit>>())
check("java.util.Map\$Entry<java.lang.Byte?, java.util.Set<*>>", typeOf<Map.Entry<Byte?, Set<*>>>())
check("java.lang.Iterable<java.lang.Number>", typeOf<MutableIterable<Number>>())
check("java.util.Iterator<java.lang.CharSequence>", typeOf<MutableIterator<CharSequence>>())
check("java.util.Collection<char>", typeOf<MutableCollection<Char>>())
check("java.util.Collection<java.lang.Character>", typeOf<MutableCollection<Char>>())
check("java.util.List<java.lang.String>", typeOf<MutableList<String>>())
check("java.util.Set<java.lang.Double?>", typeOf<MutableSet<Double?>>())
check("java.util.ListIterator<java.lang.Object>", typeOf<MutableListIterator<Any>>())
check("java.util.Map<int, kotlin.Unit>", typeOf<MutableMap<Int, Unit>>())
check("java.util.Map<java.lang.Integer, kotlin.Unit>", typeOf<MutableMap<Int, Unit>>())
check("java.util.Map\$Entry<java.lang.Byte?, java.util.Set<*>>", typeOf<MutableMap.MutableEntry<Byte?, Set<*>>>())
return "OK"
@@ -35,13 +35,14 @@ public class TypeReference /* @SinceKotlin("1.6") constructor */(
(classifier.hashCode() * 31 + arguments.hashCode()) * 31 + isMarkedNullable.hashCode()
override fun toString(): String =
asString() + Reflection.REFLECTION_NOT_AVAILABLE
asString(false) + Reflection.REFLECTION_NOT_AVAILABLE
private fun asString(): String {
private fun asString(convertPrimitiveToWrapper: Boolean): String {
val javaClass = (classifier as? KClass<*>)?.java
val klass = when {
javaClass == null -> classifier.toString()
javaClass.isArray -> javaClass.arrayClassName
convertPrimitiveToWrapper && javaClass.isPrimitive -> (classifier as KClass<*>).javaObjectType.name
else -> javaClass.name
}
val args =
@@ -70,7 +71,7 @@ public class TypeReference /* @SinceKotlin("1.6") constructor */(
private fun KTypeProjection.asString(): String {
if (variance == null) return "*"
val typeString = (type as? TypeReference)?.asString() ?: type.toString()
val typeString = (type as? TypeReference)?.asString(true) ?: type.toString()
return when (variance) {
KVariance.INVARIANT -> typeString
KVariance.IN -> "in $typeString"