diff --git a/libraries/stdlib/src/kotlin/reflect/KType.kt b/libraries/stdlib/src/kotlin/reflect/KType.kt index d941a62fc86..8356478ecf4 100644 --- a/libraries/stdlib/src/kotlin/reflect/KType.kt +++ b/libraries/stdlib/src/kotlin/reflect/KType.kt @@ -73,6 +73,16 @@ public data class KTypeProjection constructor( */ public val type: KType? ) { + + init { + require((variance == null) == (type == null)) { + if (variance == null) + "Star projection must have no type specified." + else + "The projection variance $variance requires type to be specified." + } + } + override fun toString(): String = when (variance) { null -> "*" KVariance.INVARIANT -> type.toString() diff --git a/libraries/stdlib/test/reflection/KTypeProjectionTest.kt b/libraries/stdlib/test/reflection/KTypeProjectionTest.kt new file mode 100644 index 00000000000..0338f8b2a12 --- /dev/null +++ b/libraries/stdlib/test/reflection/KTypeProjectionTest.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package test.reflection + +import kotlin.reflect.KTypeProjection +import kotlin.reflect.KVariance +import kotlin.reflect.typeOf +import kotlin.test.* + +class KTypeProjectionTest { + @Test + fun constructorArgumentsValidation() { + assertFailsWith { KTypeProjection(null, typeOf()) } + for (variance in KVariance.values()) { + assertFailsWith { KTypeProjection(variance, null) }.let { e -> + assertTrue(variance.toString() in e.message!!) + } + } + } +} \ No newline at end of file