From e760b5ed5360b96f2e98996f88cae63e060eaa0b Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 22 Jul 2016 16:40:27 +0300 Subject: [PATCH] Reflection: add KTypeParameter.toString The test covers different type parameters with and without bounds, in case we decide to also output upper bounds in toString --- .../methodsFromAny/typeParametersToString.kt | 15 +++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../reflect/jvm/internal/KTypeParameterImpl.kt | 3 +++ .../jvm/internal/ReflectionObjectRenderer.kt | 18 ++++++++++++++---- 4 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/reflection/methodsFromAny/typeParametersToString.kt diff --git a/compiler/testData/codegen/box/reflection/methodsFromAny/typeParametersToString.kt b/compiler/testData/codegen/box/reflection/methodsFromAny/typeParametersToString.kt new file mode 100644 index 00000000000..c683d26005c --- /dev/null +++ b/compiler/testData/codegen/box/reflection/methodsFromAny/typeParametersToString.kt @@ -0,0 +1,15 @@ +// WITH_REFLECT + +import kotlin.test.assertEquals + +interface Variance +class OneBound> +class SeveralBounds where T : Enum, T : Variance + +fun box(): String { + assertEquals("[A, in B, out C, D]", Variance::class.typeParameters.toString()) + assertEquals("[T]", OneBound::class.typeParameters.toString()) + assertEquals("[T]", SeveralBounds::class.typeParameters.toString()) + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 2931ad28c8f..946ea48b6be 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12573,6 +12573,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("typeParametersToString.kt") + public void testTypeParametersToString() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/methodsFromAny/typeParametersToString.kt"); + doTest(fileName); + } + @TestMetadata("typeToString.kt") public void testTypeToString() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/methodsFromAny/typeToString.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTypeParameterImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTypeParameterImpl.kt index 2ec1cab1a3b..6e38d16f86d 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTypeParameterImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTypeParameterImpl.kt @@ -45,4 +45,7 @@ internal class KTypeParameterImpl(override val descriptor: TypeParameterDescript override fun hashCode() = descriptor.hashCode() + + override fun toString() = + ReflectionObjectRenderer.renderTypeParameter(descriptor) } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/ReflectionObjectRenderer.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/ReflectionObjectRenderer.kt index bd10472f08a..0389f86ec85 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/ReflectionObjectRenderer.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/ReflectionObjectRenderer.kt @@ -16,12 +16,10 @@ package kotlin.reflect.jvm.internal -import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.Variance import kotlin.reflect.KParameter internal object ReflectionObjectRenderer { @@ -107,6 +105,18 @@ internal object ReflectionObjectRenderer { } } + fun renderTypeParameter(typeParameter: TypeParameterDescriptor): String { + return buildString { + when (typeParameter.variance) { + Variance.INVARIANT -> {} + Variance.IN_VARIANCE -> append("in ") + Variance.OUT_VARIANCE -> append("out ") + } + + append(typeParameter.name) + } + } + fun renderType(type: KotlinType): String { return renderer.renderType(type) }